天天看點

Pikachu-php反序列化

之前有篇文章詳細介紹了php反序列化的原理,這裡就不再多說

做一下這個靶場練練手

Pikachu-php反序列化

目前我的了解是挖掘反序列化就需要知道該接口的類、對象、參數這些的詳情,

以及魔術方法的情況。

這裡的調用比較簡單,看看源碼

鍊子調用分析

這裡的是S類,裡面隻有1個$test變量,魔術方法是__construct,這個方法是用于

在建立對象時候初始化對象,一般用于對變量賦初值的。

然後再看判斷,簡單來說就是我們傳入成功的反序列化字元串s,就會執行到else裡面對其進行列印輸出。

if(!@$unser = unserialize($s))  這個if語句我糾結了半天,沒懂。

後來在大哥解釋下   意思是把反序列化的結果1指派給$unser,如果反序列化成功那麼就是有值的也就會進入else,否則進入if下面語句 攻擊失敗!!

ps:at符号(@)在PHP中用作錯誤控制操作符。當表達式附加@符号時,将忽略該表達式可能生成的錯誤消息。

那麼我們隻需要構造正确的序列化字元串就行了:

根據源碼的S類建立一個對象$f,用該對象去調用類裡面的$test,重寫成我們的payload

然後序列化輸出

Pikachu-php反序列化

 得到序列化結果 我們注入,成功彈窗

Pikachu-php反序列化

前面已經說過這裡是通過else後的語句觸發漏洞的,如果這裡魔術方法是__wakeup,也就是在unserialize後自動調用的方法裡面寫到

這裡隻是想模拟一下能指令執行的反序列化場景

這樣就能在我們執行到if判斷中執行unserialize時候觸發,就會回調__wakeup,執行裡面的sysytem函數

那麼我們構造的代碼應該是:

序列化後的結果:

此時修改過後的php靶場被注入就指令執行了:

學到了一點點,還是不能着急, 安全之路 少就是多,慢就是快~~