1. 程式人生 > >跟bWAPP學WEB安全(PHP程式碼)--郵件頭和LDAP注入

跟bWAPP學WEB安全(PHP程式碼)--郵件頭和LDAP注入

背景



由於時間限制和這倆漏洞也不是特別常用,在這裡就不搭建環境了,我們從注入原來和程式碼審計的角度來看看。

郵件頭注入



注入原理:


這個地方首先要說一下郵件的結構,分為信封(MAIL FROM、RCPT TO)、頭部(From,To,Subject、CC、BCC等)、主體(message),所謂的郵件頭注入,其實就是針對頭部的部分。使用telnet對25埠進行手工發郵件的過程的事後會發現,對於郵件頭部的欄位其實就是換行符0x0A或者0x0D0x0A分割 ,在絕大部分系統裡面不是\n 就是\r\n,所以就可以注入了。例如在一段沒有過濾的FROM欄位裡面輸入,就可以新增一個收件人。

from=bobac%0ATo:[email protected]

注入分類:


發件人修改


本來發件人就可控,或者在別的欄位裡重複新增,但是要看郵件伺服器針對多個from是如何實現的,是取第一個,還是取最後一個,還是如何操作。

from=bobac%0Afrom:bobac1

收件人、抄送人注入


from=bobac%0ATo:[email protected]
from=bobac%0ACc:[email protected]%0ABcc:[email protected]

主題注入


不過這裡要看郵件伺服器是如何實現,多個主題是合併還是覆蓋寫還是取其中一個

from=bobac%0ASubject:FakeSubject 

訊息體注入


這裡要注意頭部和訊息體之間是兩個換行符所以可以類似下面,假訊息會加入訊息體中或者覆蓋寫訊息體。

from=bobac%0A%0ANewFakeMessage

檢測防禦技術


在每個型別裡面把相關的字元過濾掉,\r ,\r\n ,\n 以及To,Cc,Bcc等關鍵字,最好直接根據郵件格式匹配。我們來看bWAPP的程式碼:

function maili_check_1($data)
{

    // URL decoding %0A -> \n and %0D -> \r
    $input = urldecode($data); 
        
    $input = str_replace("\n", "", $input);
    $input = str_replace("\r", "", $input);
    $input = str_replace("bcc:", "", $input);
    
    return $input;
    
}

function maili_check_2($data)
{

    // URL decoding %0A -> \n and %0D -> \r
    $input = urldecode($data);
    
    $input = filter_var($input, FILTER_SANITIZE_EMAIL);
            
    return $input;
    
}

LDAP注入



注入原理


ldap的注入和ldap的檢索密切相關,其本質是根據ldap查詢語言構造特定的判斷條件串,使得查詢是成立的,與SQL注入很類似。具體LDAP查詢語法請參考:LDAP查詢過濾語法(MS)

注入舉例


構造一個LDAP注入字串,繞過口令認證,只用使用者名稱登入:

(&(USER= slisberger)(&)(PASSWORD=Pwd))

檢測防禦


檢測輸入的特殊字元,過濾特殊字元,【( ) = & * | " "】我們來看bWAPP的函式。

function ldapi($data)
{
         
    switch($_COOKIE["security_level"])
    {
        
        case "0" : 
            
            $data = no_check($data);           
            break;
        
        case "1" :
            
            $data = ldapi_check_1($data);
            break;
        
        case "2" :            
                       
            $data = ldapi_check_1($data);            
            break;
        
        default : 
            
            $data = no_check($data);            
            break;   

    }       

    return $data;

}
function ldapi_check_1($data)
{

    // Replaces dangerous characters: ( ) = & | * WHITESPACE
    $input = str_replace("(", "", $data);
    $input = str_replace(")", "", $input);
    $input = str_replace("=", "", $input);
    $input = str_replace("&", "", $input);
    $input = str_replace("|", "", $input);
    $input = str_replace("*", "", $input);
    $input = str_replace(" ", "", $input);
   
    return $input;
    
}