天天看點

web指令執行漏洞

一,什麼是指令執行漏洞:

  應用有時需要調用一些執行系統指令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當使用者能控制這些函數中的參數時,就可以将惡意系統指令拼接到正常指令中,進而造成指令執行攻擊,這就是指令執行漏洞。

二,利用條件:

 1,應用調用執行指令的函數

 2,将使用者輸入作為系統指令的參數拼接到指令中

 3,沒有對使用者輸入過濾或者過濾不嚴格

三,漏洞危害:

 1,攻擊者可以執行指令擷取想要的資訊

 2,攻擊者可以拿下伺服器等

四,例子:

例子一:

代碼:

1

2

3

4

5

6

<code>&lt;?php</code>

<code>    </code><code>$arg</code> <code>= </code><code>$_GET</code><code>[</code><code>'cmd'</code><code>];    </code>

<code>    </code><code>if</code> <code>(</code><code>$arg</code><code>) {</code>

<code>        </code><code>system(</code><code>"$arg"</code><code>);</code>

<code>    </code><code>}</code>

<code>?&gt;</code>

通路:http://127.0.0.1/mingling/simple1.php?cmd=ping%20127.0.0.1

也就是執行了“ping 127.0.0.1”指令

<a href="https://s2.51cto.com/wyfs02/M02/03/D5/wKiom1mhSCqRquRRAABG8Ph3pVk375.png" target="_blank"></a>

例子二:

<code>        </code><code>system(</code><code>"ping -c 3 $arg"</code><code>);</code>

執行了pwd指令

<a href="https://s4.51cto.com/wyfs02/M01/A2/86/wKioL1mhSpKwchuFAABd3q5AflU285.png" target="_blank"></a>

例子三:

7

8

<code>    </code><code>$arg</code> <code>= </code><code>$_GET</code><code>[</code><code>'cmd'</code><code>];   </code>

<code>    </code> 

<code>        </code><code>system(</code><code>"ls -al \"$arg\""</code><code>);</code>

<code>  </code><code>?&gt;</code>

執行了ifconfig指令

<a href="https://s1.51cto.com/wyfs02/M02/03/D6/wKiom1mhS_PyLrHyAACEeRHaYWU317.png-wh_500x0-wm_3-wmp_4-s_23229392.png" target="_blank"></a>

例子四:

<code>&lt;?php </code><code>eval</code><code>(</code><code>$_REQUEST</code><code>[</code><code>'code'</code><code>]);?&gt;</code>

注意後面的分号,當然後面也可以跟一句話木馬。

<a href="https://s2.51cto.com/wyfs02/M00/A2/86/wKioL1mhTSOCUcCpAAB08Yga69Y420.png-wh_500x0-wm_3-wmp_4-s_660029195.png" target="_blank"></a>

例子五:

<code>    </code><code>$fun</code> <code>= </code><code>$_GET</code><code>[</code><code>'fun'</code><code>];</code>

<code>    </code><code>$par</code> <code>= </code><code>$_GET</code><code>[</code><code>'par'</code><code>];</code>

<code>    </code><code>$fun</code><code>(</code><code>$par</code><code>);</code>

其實就相當于是執行了:

<code>system(</code><code>"whoami"</code><code>)</code>

<a href="https://s1.51cto.com/wyfs02/M02/03/D6/wKiom1mhTmXy7ri_AAAtxYR739k204.png-wh_500x0-wm_3-wmp_4-s_3769725770.png" target="_blank"></a>

五:修複方案:

盡量少用執行指令的函數或者直接禁用

參數值盡量使用引号包括

在使用動态函數之前,確定使用的函數是指定的函數之一

在進入執行指令的函數/方法之前,對參數進行過濾,對敏感字元進行轉義

如:

<code>    </code><code>$arg</code> <code>= </code><code>$_GET</code><code>[</code><code>'cmd'</code><code>];    </code><code>// $arg = addslashes($arg);</code>

<code>    </code><code>$arg</code> <code>= </code><code>escapeshellcmd</code><code>(</code><code>$arg</code><code>);  </code><code>//拼接前就處理</code>

<code>        </code><code>system(</code><code>"ls -al '$arg'"</code><code>);</code>

<code>    </code><code>}?&gt;</code>

escapeshellcmd( )逃脫字元串中任何可能用來哄騙(trick)shell指令的字元串,此函數用來确定資料傳送到exec( )或system( )之前,由使用者輸入的任何資料已經逃脫,标準的用法如下

<code>Example :</code>

<code>   </code><code>system(</code><code>EscapeShellCmd</code><code>(</code><code>$cmd</code><code>));</code>

六:參考連結:

本文轉自 天道酬勤VIP 51CTO部落格,原文連結:http://blog.51cto.com/tdcqvip/1959586