程式碼注入漏洞以及修復方法

帽子不夠白發表於2016-10-12

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

?>


相關文章