一,什麼是指令執行漏洞:
應用有時需要調用一些執行系統指令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當使用者能控制這些函數中的參數時,就可以将惡意系統指令拼接到正常指令中,進而造成指令執行攻擊,這就是指令執行漏洞。
二,利用條件:
1,應用調用執行指令的函數
2,将使用者輸入作為系統指令的參數拼接到指令中
3,沒有對使用者輸入過濾或者過濾不嚴格
三,漏洞危害:
1,攻擊者可以執行指令擷取想要的資訊
2,攻擊者可以拿下伺服器等
四,例子:
例子一:
代碼:
1
2
3
4
5
6
<code><?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>?></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>?></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><?php </code><code>eval</code><code>(</code><code>$_REQUEST</code><code>[</code><code>'code'</code><code>]);?></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>}?></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