漏洞原理
PHP代碼執行漏洞可以將代碼注入到應用中,最終到webserver去執行。攻擊者可以將惡意代碼通過參數帶入到後臺並且被函數解析爲對應代碼進行執行。
該漏洞主要存在於eval()、assert()、preg_replace()、call_user_func()、array_map()以及動態函數中。
形成原因
參數沒有做好過濾,導致任意代碼都會被後臺函數解釋爲腳本代碼執行
漏洞危害
- 執行任意代碼
- 向網站寫WebShell
- 控制整個網站甚至服務器
防禦
- 對於eval()等解析代碼的函數,不能讓用戶輕易的接觸到參數,並且要對傳入的參數嚴格的判斷和過濾
- 字符串利用單引號包裹參數,可以在插入前進行addslashes()
- 對於preg_replace放棄使用e修飾符。如果必須要用e修飾符,請保證第二個參數中,對於正則匹配出的對象,用單引號包裹 。
escapeshellcmd()
將字符串命令中的特殊字符過濾掉escapeshellarg()
將參數加上雙引號
eval
是php中執行代碼的函數
假設訪問 192.168.203.128/test/testcmd.php?x=echo 123;
假設訪問 192.168.203.128/test/testcmd.php?x=phpinfo();
通過給 x
傳遞寫入文件代碼,執行命令
// 簡單文件寫入代碼
$file=$_GET['f'];
$data=$_GET['d'];
$fileio=fopen($file,'w+');
fwrite($fileio,$data);
fclose($fileio);
成功寫入一句話
利用代碼執行漏洞可以提權