代碼注入漏洞以及修復方法

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>";
    
}

?>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章