跟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:attacker@attack.com

注入分類:


發件人修改


本來發件人就可控,或者在別的字段里重復添加,但是要看郵件服務器針對多個from是如何實現的,是取第一個,還是取最后一個,還是如何操作。

from=bobac%0Afrom:bobac1

收件人、抄送人注入


from=bobac%0ATo:attacker@attack.com
from=bobac%0ACc:attacker1@attack.com%0ABcc:attacker2@attack.com

主題注入


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM