1.漏洞概述
PHP代碼執行漏洞指應用程序本身過濾不嚴格,用戶可以通過請求將代碼注入到程序中執行,類似於SQL注入漏洞,可以把SQL語句通過網頁注入到SQL服務執行,而PHP代碼執行漏洞則是可以把代碼注入應用到網站後端中,如果漏洞沒有特殊的過濾,相當於直接有一個web後門存在,該漏洞主要由動態代碼執行函數的參數過濾不嚴格導致。
2.技術概述
執行PHP代碼寫入WebShell
3.風險概述
控制網站甚至服務器
4.黑盒測試
在自己搭建的平臺上表單處鍵入 phpino()語句
這條語句在後端中沒有被當做正常字符串信息顯示出來而是當做PHP代碼執行
接下來我們在鍵入一個能寫webshell的語句
顯示正常
服務器中已經被寫入了一個webshell
5.查看源碼,可以看見動態代碼執行函數eval,該函數將字符串直接以PHP代碼形式執行,反斜槓‘\’作爲轉義符號將從表單提交的數據轉義成了字符串,這樣就構成了代碼注入的漏洞,即輸入的代碼被轉義爲字符串又被eval以php形式執行。
6.修復方案
業內最新的修復方案基於黑名單的思想,將一些函數必有的符號進行過濾。
<?php
//判斷字符串包含函數
function checkstr($str,$find){
$find_str = $find;
$tmparray = explode($find_str,$str); //explode()函數把字符串通過某個指定的字符拆分爲數組。$str爲原始字符串 $findstr爲
if(count($tmparray)>1){ //要查找的字符,如果存$findstr 那麼這個字符串就會被拆分成兩份或者兩份以上 那麼數組裏的元素就在兩個或者兩個以上
return true;
} else{
return false;
}
}
/*判斷請求表單字段含下劃線,左括號,右括號,分號 */
if(isset($_REQUEST['submit']) && !checkstr($_REQUEST['name'],';') && !checkstr($_REQUEST['name'],'(') && !checkstr($_REQUEST['name'],')') && !checkstr($_REQUEST['name'],'_')&& !checkstr($_REQUEST['email'],';') && !checkstr($_REQUEST['email'],'(') && !checkstr($_REQUEST['email'],')') && !checkstr($_REQUEST['email'],'_')&& !checkstr($_REQUEST['message'],';') && !checkstr($_REQUEST['message'],'(') && !checkstr($_REQUEST['message'],')') && !checkstr($_REQUEST['message'],'_')){
/*用filter過濾特殊編碼*/
//filter 函數編碼,過濾特殊字符HTML 轉義字符 '"<>& 以及 ASCII 值小於 32 的字符。
$name = filter_var($_REQUEST["name"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函數編碼,過濾特殊字符HTML 轉義字符 '"<>& 以及 ASCII 值小於 32 的字符。
$email = filter_var($_REQUEST["email"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函數編碼,過濾特殊字符HTML 轉義字符 '"<>& 以及 ASCII 值小於 32 的字符。
$message = filter_var($_REQUEST["message"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函數編碼,過濾特殊字符HTML 轉義字符 '"<>& 以及 ASCII 值小於 32 的字符。
@eval("\$var1 = $name;");
echo $var1;
@eval("\$var2 = $email;");
echo $var2;
@eval("\$var3 = $message;");
echo $var3;
}else{
echo "<b>請勿提交非法字符</b>";
}
?>