php反序列化漏洞
⑴ [世安杯]一道關於php反序列化漏洞的題目
題目地址: http://ctf1.shiyanbar.com/shian-/
點進去,看到
沒什麼信息,因此ctrl+u查看源碼:
看到提示,file_get_contents()函數,聯想到文件包含漏洞,因此google一波,查到
由於本題:allow_url_include=On
因此可以包含一個遠程文件,假設你的雲服務IP地址為:xxx
則可以輸入 http://ctf1.shiyanbar.com/shian-/?user=http://xxxx/a.txt
其中a.txt的內容為: the user is admin
用base64解碼,得到
看到源碼之後,明白了需要使用$file把class.php包含進來,然後把$pass反序列化之後, echo $pass 這句話會執行對象裡面的__toString函數,具體的反序列化漏洞查看 http://m.blog.csdn.net/qq_32400847/article/details/53873275
因此,接下來只要找到序列化之後的字元串,然後GET給pass就行了
復制class.php的源碼到自己的虛擬機上,修改一下
保存之後,通過瀏覽器訪問,得到:
接著把這個序列化字元串賦值給pass,以及用file包含class.php,構造出:
執行之後得到:
發現什麼都沒有,CTRL+U查看源碼
這樣就得到了flag;
此外,可以參考我之前的一篇文章 php偽協議的使用[獲得webshell]
使用file= php://input ,之後傳入一個webshell,再讀取f1a9.php
⑵ 開源PHP組件漏洞曝光,多個運行CMS系統的網站受影響
據外媒報道,研究人員發現,CMS製造商Typo3開發的開源PHP組件PharStreamWrapper存在安全漏洞, 運行Drupal、Joomla或Typo3內容管理系統的網站均受影響。
據悉,該漏洞由研究人員Daniel Le Gall發現,被命名為Drupalgeddon,編號CVE-2019-11831, 允許黑客使用惡意phar歸檔替換網站的合法歸檔文件。 Drupal開發人員將其標記為中等危險級別,低於近期Drupal漏洞和早期遠程代碼執行漏洞的高危評級。
Drupal官方發布漏洞公告稱,通過構造含有惡意代碼的Phar文件, 黑客可繞過Drupal core7.x、8.x版本PHP組件中針對反序列化保護的攔截器,遠程執行惡意代碼, 影響業務系統安全。
此外,黑客還可能會 開發針對該漏洞的自動化攻擊程序, 植入後門程序進一步釋放礦工程序或DDoS僵屍木馬等惡意軟體,影響網站正常運行。
截至目前,官方已發布安全補丁修復該漏洞, 專家建議網站管理員盡快更新以保護網站。 其中運行Drupal版本8.7的網站需要升級到版本8.7.1,運行8.6或更早版本的網站需要更新到版本8.6.16,運行版本7的網站需要升級到版本7.67,而Joomla需要升級到版本3.9.6。
⑶ Shiro RememberMe 1.2.4 反序列化命令執行漏洞復現
Apache Shiro <= 1.2.4
shiro默認使用了 CookieRememberMeManager ,其處理cookie的流程是:得到 rememberMe的cookie值 --> Base64解碼 --> AES解密 --> 反序列化 。
然而AES的密鑰是硬編碼的,就導致了攻擊者可以構造惡意數據造成反序列化的RCE漏洞。
前16位元組的密鑰 -->後面 加入序列化參數 --> AES加密 --> base64編碼 -->發送 cookie 。
使用大佬腳本生成 payload( ysoserial.jar 文件和運行目錄處於同一目錄)
圖片.png 圖片.png
這里依舊使用docker進行漏洞復現
圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png 圖片.png
參考鏈接:
https://blog.csdn.net/three_feng/article/details/52189559
http://www.db-sec.com/2019/06/apache-shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
⑷ Apache Commons Collections1 反序列化命令執行漏洞
當伺服器收到序列化對象數據後,會調用對象類的readobject()方法進行反序列化,這里我們構造的惡意序列化對象使用的是AnnotationInvocationHandler類的實例化對象。所以當伺服器收到這個對象時會去調用該類的readobject()方法進行反序列化,下面我們跟著上面的觸發流程進行一步步觸發分析。
結論 :在漏洞觸發的第一步中,在反序列化我們向伺服器發送的惡意序列化AnnotationInvocationHandler對象時會觸發對構造該類對象時傳入的Map類型對象的第一個鍵值對的value進行修改。
當通過迭代器對象對TransformedMap類型的value值進行修改時會調用(TransformedMap類的父類並實現了 Map.Entry介面)中的內部類MapEntry的setValue()方法,debug運行可以看到this.parent變數值是TransformedMap對象的第一個鍵值對。
結論 :在漏洞觸發的第二步中,觸發了TransformedMap的checkSetValue()方法
可以看到ChainedTransformer對象的transform()方法的功能是將傳入的對象交給對象中的this.iTransformers變數引用的對象的transform()方法進行處理。this.iTransformers變數引用的對象從53行可知是對象實例化時傳入的,從poc的25行可知我們實例化時傳入一個Transformer[]的數組。
結論 :在漏洞觸發的第三步中,TransformedMap.checkSetValue()觸發ChainedTransformer.transform()方法。ChainedTransformer.transform()方法將傳入的對象經過ChainedTransformer對象中的各個Transformer類型的實例對象調用實例化對象的transform()方法處理。
由poc 20-25行可知ChainedTransformer對象中的Transformer類型的實例對象分別是ConstantTransformer、InvokerTransformer,首先觸發ConstantTransformer對象的transform()方法,可以看出ConstantTransformer對象的transform()方法的功能是將傳入的對象轉換成實例化ConstantTransformer對象時傳入的對象,由poc的21行可知實例化ConstantTransformer對象時傳入的對象為java.lang.Runtime.class,因此經過ConstantTransformer.transform()後傳入的參數變成了類對象 java.lang.Runtime.class ,再經過InvokerTransformer.transform()處理。
從59-61行可以看出InvokerTransformer.transform()功能是通過反射得到傳入對象中方法名為this.iMethodName參數類型為this.iParamTypes的方法,並執行該方法傳入的方法參數為this.iArgs。而this.iMethodName、this.iParamTypes、this.iArgs三個參數都是我們在實例化InvokerTransformer對象時自定義的,這導致可以進行任意命令執行。
第一次執行InvokerTransformer.transform()方法後
第二次執行InvokerTransformer.transform()方法後
第三次執行InvokerTransformer.transform()方法
結論 :在漏洞觸發的第四步中,傳入的對象經過1次ConstantTransformer.transform()與3次InvokerTransformer.transform()轉換觸發exec()任意命令執行。
ps:jdk版本需要1.7
⑸ php數組反序列化失敗,求解!!!
unserialize()解序列化函數裡面要用實際長度!根據strlen返回的「實際長度」進行修改。
最後幾行,改為:
echo "<br/>";
echo "實際長度=".strlen("fwejfo 策劃送 fewf fewf ewfewf *%&5"); //輸出35
echo "<p>";
var_mp(unserialize('a:4:{s:1:"a";s:2:"aa";s:1:"b";i:20;s:1:"c";s:47:"測試ljfiewojfowjfo分為豐富32&*%*&%*%%875khuiehf";i:10;s:35:"fwejfo 策劃送 fewf fewf ewfewf *%&5";}'));
測試正確!
如果傳遞的字元串參數,解序列化失敗,則返回 FALSE。
⑹ 這個網站干什麼的 什麼是PHP反序列化靶機實戰
在我們講PHP反序列化的時候,基本都是圍繞著serialize(),unserialize()這兩個函數。那麼什麼是序列化呢,序列化說通俗點就是把一個對象變成可以傳輸的字元串。舉個例子,不知道大家知不知道json格式,這就是一種序列化,有可能就是通過array序列化而來的。而反序列化就是把那串可以傳輸的字元串再變回對象。而反序列化則比較容易出現漏洞。
這么序列化一下然後反序列化,為什麼就能產生漏洞了呢?
這個時候,我們就要了解一下PHP裡面的魔術方法了,魔法函數一般是以__開頭,通常會因為某些條件而觸發不用我們手動調用:
在研究反序列化漏洞的時候,如果伺服器能夠接收我們反序列化過的字元串、並且未經過濾的把其中的變數直接放進這些魔術方法裡面的話,就容易造成很嚴重的漏洞了。
所以這個網站其實希望告訴大家這個反序列化的問題,並提供一些實戰練習。
⑺ php如何循環反序列化
1.構造HITCON類反序列化字元串,其中$method='login',$args數組』username』部分可用於構造SQL語句,進行SQL注入,'password』部分任意設置。
2.調用login()函數後,利用username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置file=『flag.php』,需繞過__wakeup()函數。
3.繞過oadData()函數對反序列化字元串的驗證。
4.SoFun類 __destruct()函數調用後,包含flag.php文件,獲取flag,需繞過__wakeup()函數。