在開發過程中,一些應用需要去調用一些外部程序(系統命令或exe等可執行文件)。當應用需要調用一些外部程序時,就會用到一些系統命令的函數.
而應用在調用這些函數執行系統命令的時候,如果將用戶的輸入作為系統命令的參數拼接到命令行中,在沒有過濾輸出的情況下,就會造成命令執行漏洞。
命令執行漏洞發生的兩個主要原因
1.用戶輸入可以進行拼接
2.沒有足夠的過濾
危害:
可繼承web服務器權限(web用戶權限),去執行系統命令,讀寫文件,也可進一步控制整個網絡,整個服務器。
相關函數:
system();
passthru():
能夠將字符串作為os命令執行,自帶輸出功能。
exec():
也能夠將字符串作為os命令執行,需要輸出執行結果。
shell_exec():
也exec()函數類似
popen()也能執行os命令,但不返回命令結果,而是返回一個文件指針
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'].">>1.txt"
popen($cmd,'r');
}
此函數需要兩個參數,並且只返回一個文件指針,從而可以將其導入一個文件中查看。
反引號
反引號["]內的字符串,也會被解析成os命令,需要輸出執行結果。
漏洞利用方式
查看系統文件
如?cmd=type c:\windows\system32
在windows中查看文件為type linux為cat
顯示當前路勁
如?cmd=cd -->絕對路徑
寫入一個文件,可為一句話木馬等
如?cmd=echo "<?php phpinfo(); ?>" >D:\shell.php-->其中>為覆蓋寫
防御方法:
1.減少命令執行函數的使用
2.在進行命令執行的函數之前,對參數進行過濾
3.參數值盡可能使用引號包裹,調用addslashes函數進行轉義