iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Security

讓Web開發者森77的Hacking Trick系列 第 14

[Day14] LDAP Injection

前言

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的網站具有使用者登入的功能參數為userpass
這時候我們在input中寫入一個讓條件始終為true的輸入:
*)user=*))(|user=*
就可以在完全沒有用戶帳號和密碼的狀況下獲得網站的用戶權限。

Case Study

CVE-2021-29156

研究員在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。


上一篇
[Day13] Web Cache Poison
下一篇
[Day15] CSV Injection(Formula Injection)
系列文
讓Web開發者森77的Hacking Trick30

尚未有邦友留言

立即登入留言