跟bWAPP學WEB安全(PHP程式碼)--郵件頭和LDAP注入
阿新 • • 發佈:2019-01-08
背景
由於時間限制和這倆漏洞也不是特別常用,在這裡就不搭建環境了,我們從注入原來和程式碼審計的角度來看看。
郵件頭注入
注入原理:
這個地方首先要說一下郵件的結構,分為信封(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;
}