0x00 知識點
1利用PHP原生類來構造POP鏈
本題沒有可以利用的類,沒有可以利用的類就找不到POP鏈所以只能考慮PHP原生類
我們先來解釋一下什么是POP鏈
POP:面向屬性編程
在二進制利用時,ROP 鏈構造中是尋找當前系統環境中或者內存環境里已經存在的、具有固定地址且帶有返回操作的指令集,而 POP 鏈的構造則是尋找程序當前環境中已經定義了或者能夠動態加載的對象中的屬性(函數方法),將一些可能的調用組合在一起形成一個完整的、具有目的性的操作。二進制中通常是由於內存溢出控制了指令執行流程,而反序列化過程就是控制代碼執行流程的方法之一,當然進行反序列化的數據能夠被用戶輸入所控制
在之前的學習中:
我已經清楚反序列化的主要危害在於我們可以控制對象的變量來改變程序執行流程從而達到我們最終的目的
我們無法控制對象的方法來調用,因此我們這里只能去找一些可以自動調用的一些魔術方法,常用的一些魔術方法:
__wakeup() //使用unserialize時觸發
__sleep() //使用serialize時觸發
__destruct() //對象被銷毀時觸發
__call() //在對象上下文中調用不可訪問的方法時觸發
__callStatic() //在靜態上下文中調用不可訪問的方法時觸發
__get() //用於從不可訪問的屬性讀取數據
__set() //用於將數據寫入不可訪問的屬性
__isset() //在不可訪問的屬性上調用isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__toString() //把類當作字符串使用時觸發
__invoke() //當腳本嘗試將對象調用為函數時觸發
好了回到我們今天說的知識點:
先附上師傅文章:
https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html#_label1_0
這里我只提一下我們今天使用的
php內置類SoapClient
他具有SSRF能力
在今天的文章中我們可以利用他進行SSRF
解釋:
SOAP是webService三要素(SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration))之一:WSDL 用來描述如何訪問具體的接口, UDDI用來管理,分發,查詢webService ,SOAP(簡單對象訪問協議)是連接或Web服務或客戶端和Web服務之間的接口。其采用HTTP作為底層通訊協議,XML作為數據傳送的格式。
SoapClient類可以創建soap數據報文,與wsdl接口進行交互。
簡單的用法
<?php
$a = new SoapClient(null,array(location'=>'http://example.com:2333','uri'=>'123'));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a();
2:CRLF Injection漏洞
鏈接:
https://www.jianshu.com/p/d4c304dbd0af
CRLF是”回車+換行”(\r\n)的簡稱。在HTTP協議中,HTTPHeader與HTTPBody是用兩個CRLF分隔的,瀏覽器就是根據這兩個CRLF來取出HTTP內容並顯示出來。所以,一旦我們能夠控制HTTP消息頭中的字符,注入一些惡意的換行,這樣我們就能注入一些會話Cookie或者HTML代碼,所以CRLFInjection又叫HTTPResponseSplitting,簡稱HRS。
簡單來說
http請求遇到兩個\r\n即%0d%0a,會將前半部分當做頭部解析,而將剩下的部分當做體,當我們可以控制User-Agent的值時,頭部可控,就可以注入crlf實現修改http請求包。
3:serialize_hander處理session方式不同導致session注入
簡單看:
serialize_handler=php
解釋:
這樣的方式,可以指定php序列化引擎,而不同引擎存儲的方式也不同
php中的session中的內容並不是放在內存中的,而是以文件的方式來存儲的,存儲方式就是由配置項session.save_handler來進行確定的,默認是以文件的方式存儲。
存儲的文件是以sess_sessionid來進行命名的,文件的內容就是session值的序列話之后的內容。
在php.ini中存在三項配置項:
session.save_path="" --設置session的存儲路徑
session.save_handler="" --設定用戶自定義存儲函數,如果想使用PHP內置會話存儲機制之外的可以使用本函數(數據庫等方式)
session.serialize_handler string --定義用來序列化/反序列化的處理器名字。默認是php(5.5.4后改為php_serialize)
session.serialize_handler存在以下幾種
php_binary 鍵名的長度對應的ascii字符+鍵名+經過serialize()函數序列化后的值
php 鍵名+豎線(|)+經過serialize()函數處理過的值
php_serialize 經過serialize()函數處理過的值,會將鍵名和值當作一個數組序列化
在PHP中默認使用的是PHP引擎,如果要修改為其他的引擎,只需要添加代碼ini_set('session.serialize_handler', '需要設置的引擎');。
本題中,我們利用的是session反序列化和序列化時候使用不同引擎的時候,即可觸發漏洞
例如傳入$_SESSION['name']='|O:5:"xxxxx":1:{s:4:"test";s:3:"AAA";}'; 序列化引擎使用的是php_serialize,那么儲存的session文件為
a:1:{s:4:"name";s:5:"|O:5:"xxxxx":1:{s:4:"test";s:3:"AAA";}";}
而反序列化引擎如果使用的是php,就會把|作為作為key和value的分隔符。把a:1:{s:4:"name";s:5:"當作鍵名,而把O:5:"xxxxx":1:{s:4:"test";s:3:"AAA";}當作經過serialize()函數處理過的值,最后會把它進行unserialize處理,此時就構成了一次反序列化注入攻擊。
0x01 解題
很明顯SSRF
根據前面:
payload:
<?php
$target='http://127.0.0.1/flag.php';
$b = new SoapClient(null,array('location' => $target,
'user_agent' => "AAA:BBBrn" .
"Cookie:PHPSESSID=dde63k4h9t7c9dfl79np27e912",
'uri' => "http://127.0.0.1/"));
$se = serialize($b);
echo urlencode($se);
先注入poc得到的session
此時session_start()序列化使用的是php引擎。接下里我們覆蓋變量b,利用call_user_func調用SoapClient類中的不存在方法,觸發__call方法,執行ssrf。並獲得訪問flag.php的PHPSESSID。
這里我死活彈不出flag。難受。。
借用一下這位大佬的圖:
https://www.cnblogs.com/20175211lyz/p/11515519.html
參考鏈接:
https://www.anquanke.com/post/id/164569#h2-5
https://cloud.tencent.com/developer/article/1376384
https://www.cnblogs.com/20175211lyz/p/11515519.html
今天狀態好差。。
早點休息明天繼續2333