之前有篇文章詳細介紹了php反序列化的原理,這裡就不再多說
做一下這個靶場練練手

目前我的了解是挖掘反序列化就需要知道該接口的類、對象、參數這些的詳情,
以及魔術方法的情況。
這裡的調用比較簡單,看看源碼
鍊子調用分析
這裡的是S類,裡面隻有1個$test變量,魔術方法是__construct,這個方法是用于
在建立對象時候初始化對象,一般用于對變量賦初值的。
然後再看判斷,簡單來說就是我們傳入成功的反序列化字元串s,就會執行到else裡面對其進行列印輸出。
if(!@$unser = unserialize($s)) 這個if語句我糾結了半天,沒懂。
後來在大哥解釋下 意思是把反序列化的結果1指派給$unser,如果反序列化成功那麼就是有值的也就會進入else,否則進入if下面語句 攻擊失敗!!
ps:at符号(@)在PHP中用作錯誤控制操作符。當表達式附加@符号時,将忽略該表達式可能生成的錯誤消息。
那麼我們隻需要構造正确的序列化字元串就行了:
根據源碼的S類建立一個對象$f,用該對象去調用類裡面的$test,重寫成我們的payload
然後序列化輸出
得到序列化結果 我們注入,成功彈窗
前面已經說過這裡是通過else後的語句觸發漏洞的,如果這裡魔術方法是__wakeup,也就是在unserialize後自動調用的方法裡面寫到
這裡隻是想模拟一下能指令執行的反序列化場景
這樣就能在我們執行到if判斷中執行unserialize時候觸發,就會回調__wakeup,執行裡面的sysytem函數
那麼我們構造的代碼應該是:
序列化後的結果:
此時修改過後的php靶場被注入就指令執行了:
學到了一點點,還是不能着急, 安全之路 少就是多,慢就是快~~