背景
由於時間限制和這倆漏洞也不是特別常用,在這里就不搭建環境了,我們從注入原來和代碼審計的角度來看看。
郵件頭注入
注入原理:
這個地方首先要說一下郵件的結構,分為信封(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;
}