0x01 前言
前兩天爆了一個(gè)LDAP漏洞,據(jù)說(shuō)存在了8年現(xiàn)在才被發(fā)現(xiàn)粱腻,感概一下庇配,不知這8年來(lái)有多少站被搞了。绍些。捞慌。
想著復(fù)現(xiàn)這個(gè)漏洞,就先復(fù)習(xí)一下LDAP注入的相關(guān)知識(shí)吧柬批,差了很多資料啸澡,記一下筆記袖订。
0x02 LDAP介紹
在學(xué)習(xí)LDAP注入之前,首先要了解LDAP的運(yùn)行機(jī)制嗅虏。
什么是LDAP洛姑?LDAP(Lightweight Directory Access Protocol):輕量級(jí)目錄訪問(wèn)協(xié)議,是一種在線目錄訪問(wèn)協(xié)議皮服。LDAP主要用于目錄中資源的搜索和查詢楞艾,是X.500的一種簡(jiǎn)便的實(shí)現(xiàn)。
簡(jiǎn)單來(lái)說(shuō)龄广,可以理解為L(zhǎng)DAP是某種搜索協(xié)議硫眯,就像我們熟知的數(shù)據(jù)庫(kù)一樣,我們利用SQL語(yǔ)句進(jìn)行查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)择同。而LDAP也有一套自己的查詢語(yǔ)句两入,來(lái)進(jìn)行查詢。
LDAP查詢語(yǔ)法
search語(yǔ)法:attribute operator value
search filter options:( "&" or "|" (filter1) (filter2) (filter3) ...) ("!" (filter))
LDAP的搜索語(yǔ)法其實(shí)很容易敲才,這里看不明白的話裹纳,往下看一下具體實(shí)例就會(huì)明白的。
0x03 LDAP注入攻擊
輕量級(jí)目錄訪問(wèn)協(xié)議是通過(guò)TCP/IP查詢和修改目錄服務(wù)的協(xié)議紧武,使用最廣泛的LDAP服務(wù)如微軟的ADAM(Active Directory Application Mode)和OpenLDAP痊夭。
(&(attribute=value)(injected_filter)) (second_filter)
需要注意的是,在OpenLDAP中脏里,第二個(gè)過(guò)濾器會(huì)被忽略,只有第一個(gè)會(huì)被執(zhí)行虹曙,那么類似上面的這種注入就可以成功的迫横。而在ADAM中,有兩個(gè)過(guò)濾器的查詢是不被允許的酝碳,那么這種注入是沒(méi)什么用的矾踱。
- AND LDAP注入
當(dāng)后端的代碼如下
(&(parameter1=value1)(parameter2=value2))
這里value1和value2都會(huì)被查詢,其中value1和value2是用戶可控的疏哗,如果過(guò)濾不完善呛讲,就會(huì)存在LDAP注入的可能。
比如一個(gè)用戶登錄的場(chǎng)景返奉,用戶輸入username和password贝搁,應(yīng)用會(huì)構(gòu)造一個(gè)過(guò)濾器并發(fā)給LDAP服務(wù)器進(jìn)行查詢。
(&(username=uname)(password=pwd))
當(dāng)用戶輸入一個(gè)有效的用戶名芽偏,例如admin雷逆,那么就有可能在username字段后面進(jìn)行注入,從而在不知道密碼的情況下進(jìn)行登陸污尉。
payload: admin)(&))
result: (&(username=admin)(&))(password=123))
LDAP服務(wù)器只會(huì)處理第一個(gè)過(guò)濾器膀哲,而第一個(gè)過(guò)濾器永真往产,因此繞過(guò)了登錄框
- OR LDAP注入
當(dāng)后端代碼如下:
(|(parameter1=value1)(parameter2=value2))
一個(gè)典型的OR LDAP注入的場(chǎng)景就是:
假設(shè)一個(gè)資源管理器允許用戶了解系統(tǒng)中可用的資源(打印機(jī)、掃描器某宪、存儲(chǔ)系統(tǒng)等)仿村。用于展示可用資源的查詢?yōu)椋?/p>
(|(type=Rsc1)(type=Rsc2))
Rsc1和Rsc2表示系統(tǒng)中不同種類的資源,例如兴喂,Rsc1=printer蔼囊,Rsc2=scanner用于列出系統(tǒng)中所以可用的打印機(jī)和掃描器。
payload: Rsc1=printer)(uid=*)
result: (|(type=printer)(uid=*))(type=scanner))
LDAP服務(wù)器會(huì)響應(yīng)所有的打印機(jī)和用戶對(duì)象
- LDAP盲注
- LDAP AND盲注
假設(shè)一個(gè)Web應(yīng)用想從一個(gè)LDAP目錄列出所有可用的Epson打印機(jī)瞻想,錯(cuò)誤信息不會(huì)返回压真,應(yīng)用發(fā)送如下的過(guò)濾器:
(&(objectclass=printer)(type=Epson*))
使用這個(gè)查詢,如果有可用的Epson打印機(jī)蘑险,其圖標(biāo)就會(huì)顯示給客戶端滴肿,否則沒(méi)有圖標(biāo)出現(xiàn)。如果攻擊者進(jìn)行LDAP盲注入攻擊”)(objectClass=))(&(objectClass=void”佃迄,Web應(yīng)用會(huì)構(gòu)造如下查詢:
(&(objectclass=*)(objectClass=*))(&(objectClass=void)(type=Epson*))
僅對(duì)第一個(gè)過(guò)濾器進(jìn)行處理:
(&(objectclass=*)(objectClass=*))
結(jié)果是泼差,打印機(jī)的圖標(biāo)會(huì)一定顯示出來(lái),因?yàn)樵摬樵冇肋h(yuǎn)會(huì)有結(jié)果呵俏,過(guò)濾器objectClass=*總是返回一個(gè)對(duì)象堆缘。當(dāng)圖標(biāo)被顯示時(shí)響應(yīng)為真,否則為假普碎。
例如構(gòu)造如下的注入:
(&(objectClass=*)(objectClass=users))(&(objectClass=foo)(type=Epson*))
(&(objectClass=*)(objectClass=resources))(&(objectClass=foo)(type=Epson*))
這種代碼注入的設(shè)置允許攻擊者推測(cè)可能存在于LDAP目錄服務(wù)中不同對(duì)象類的值吼肥。當(dāng)響應(yīng)Web頁(yè)面至少包含一個(gè)打印機(jī)圖標(biāo)時(shí),對(duì)象類的值就是存在的麻车,另一方面而言缀皱,如果對(duì)象類的值不存在或沒(méi)有對(duì)它的訪問(wèn),就不會(huì)有圖標(biāo)出現(xiàn)动猬。
- LDAP OR盲注
這種情況下啤斗,用于推測(cè)想要的信息的邏輯是相反的,因?yàn)槭褂玫氖荗R邏輯操作符赁咙。接下來(lái)使用的是同一個(gè)例子钮莲,OR環(huán)境的注入為:
(|(objectClass=void)(objectClass=void))(&(objectClass=void)(type=Epson*))
這個(gè)LDAP查詢沒(méi)有從LDAP目錄服務(wù)獲得任何對(duì)象,打印機(jī)的圖標(biāo)也不會(huì)顯示給客戶端(FALSE)彼水。如果在響應(yīng)的Web頁(yè)面中有任何圖標(biāo)崔拥,則響應(yīng)為T(mén)RUE。故攻擊者可以注入下列LDAP過(guò)濾器來(lái)收集信息:
(|(objectClass=void)(objectClass=users))(&(objectClass=void)(type=Epson*))
(|(objectClass=void)(objectClass=resources))(&(objectClass=void)(type=Epson*))
0x04 LDAP注入防御
LDAP注入的防御跟SQL注入的防御其實(shí)差不多凤覆,主要就是要把用戶輸入的東西過(guò)濾好握童,基本就可以防御了。
下圖包含了LDAP中用到的特殊字符和需要轉(zhuǎn)義處理的字符:
左邊的字符在正常情況下是不會(huì)用到的叛赚,如果在用戶的輸入中出現(xiàn)了需要用反斜杠轉(zhuǎn)義處理澡绩。而右邊的圓括號(hào)這些如果不過(guò)濾的話就會(huì)導(dǎo)致過(guò)濾器閉合而生產(chǎn)攻擊者需要的filter稽揭,這里看到不僅是用反斜杠處理,還將字符變成了相應(yīng)的ASCII碼值肥卡,這些符號(hào)本不該出現(xiàn)溪掀。
這段php防御代碼可以記錄一下:
function ldapspecialchars($string) {
$sanitized=array('\\' => '\5c',
'*' => '\2a',
'(' => '\28',
')' => '\29',
"\x00" => '\00');
return str_replace(array_keys($sanitized),array_values($sanitized),$string);
}
LDAP服務(wù)開(kāi)啟的端口是389,如果發(fā)現(xiàn)某個(gè)服務(wù)器上開(kāi)啟了該端口很可能就是開(kāi)啟了LDAP服務(wù)
0x05 參考文獻(xiàn)
http://www.cnblogs.com/r00tgrok/p/LDAP_INJECTION_AND_PREVENTION.html