Injection +1 ↑
LDAP全稱Lightweight Directory Access Protoco,輕量目錄訪問協定。LDAP是一個提供Access Control和分散式資訊維護的目錄資訊。
LDAP Injection與SQL Injection和ORM Injection有點相似,不一樣的是,LDAP是利用用戶參數來產生的LDAP查詢。
跟常見的測試方法相似,利用輸入一些會讓LDAP混淆的無意義字元,若LDAP Server return錯誤訊息,就可能代表這可能具有漏洞。
例如原本的User為Craig
,我們可以輸入諸如(
,)
,&
,|
,*
,!
等等,更改原本的查詢動作。
若有一個php網站,部分程式碼如:
$userName = $_POST["userName"];
$filter = "(user=" . $userName . ")";
$output = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
而若是在這種不經檢查的狀況下,對userName的input輸入:Craig, Chen)(|(objectclass=*)
將會將原本的查詢:(user=Craig, Chen)
變成user=Craig, Chen)(|objectclass=*)
這會讓filter根據|(objectclass=*)
這個條件,與目錄中的所有項目相符合,導致攻擊者可以leak出整個使用者集區的資訊。
或是利用類似於SQL injection中的'OR "1"="1" --
,bypass登入驗證。
假設有個使用LDAP的網站具有使用者登入的功能參數為user
和pass
這時候我們在input中寫入一個讓條件始終為true的輸入:*)user=*))(|user=*
就可以在完全沒有用戶帳號和密碼的狀況下獲得網站的用戶權限。
研究員在ForgeRock的OpenAM Server裡發現具有漏洞的webfinger endpoint。
String[] objs = { filter };
String FILTER_PATTERN_ORG = "(&(objectclass="
+ SMSEntry.OC_REALM_SERVICE + ")(" + SMSEntry.ORGANIZATION_RDN
+ "={0}))";
String sfilter = MessageFormat.format(FILTER_PATTERN_ORG, (Object[]) objs);
可以看的出來這是一個使用JAVA進行的LDAP查詢,應用程式沒有對上述所提過的特殊字元進行檢查、轉義或過濾,這使攻擊者可以撰寫自動化程式碼,去Enum有效的使用者名稱(帳號)http://example/cra*&
...(後略)
若是伺服器中具有cra
開頭的用戶名稱,就會return 200 OK,無則404 Not Found。
在取得用戶名稱後,再利用密碼輸入的地方,如同前述一樣慢慢破解使用者密碼的hash,例如:pass=a*
pass=b*
若return 200則繼續下一個字元的判斷,以此try出user passowrd的hash value。