如何進(jìn)行bee-box LDAP注入的靶場練習(xí),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、余杭ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的余杭網(wǎng)站制作公司
如果說sql注入的本質(zhì)是拼接字符串的話,那么一切可以注入的本質(zhì)都是拼接字符串,LDAP注入作為注入的一種也不例外,更有趣一點(diǎn)的說它是在拼接圓括號(hào)(sql注入也拼接圓括號(hào),但是更習(xí)慣性的是說它拼接字符串)。
在環(huán)境配置篇里面已經(jīng)很詳細(xì)的說了bee-box中l(wèi)dap環(huán)境的配置,靶場練習(xí)篇更多的是php與ldap的連接過程,中間使用的特殊函數(shù)介紹以及圓括號(hào)拼接的一些技巧。
下面先說一下bwapp中l(wèi)dap靶場的登錄過程:
首先這是一個(gè)LDAP的登錄界面,URL是http://192.168.3.184/bWAPP/ldap_connect.php,直接看下這個(gè)php的文件中都寫了什么。
從ldap_connect.php 文件的133的代碼開始看,五個(gè)變量依次是$message,$login, $password,$server,$dn。
這五個(gè)變量中第一個(gè)是么有啥用的,第二個(gè)登錄ldap服務(wù)器的用戶名,第三個(gè)密碼,第四個(gè)服務(wù)器地址,第五個(gè)區(qū)分名(描述一條完整的LDAP路徑)。
第一個(gè)if語句是清空登錄LDAP的表單,第二個(gè)if語句是判斷這五個(gè)變量是不是空值,這都是小事,重點(diǎn)是后面的這個(gè)else,從這個(gè)else里面開始看,又有了多個(gè)if和else語句,一個(gè)個(gè)來吧。
首先看第一個(gè)if之前的三個(gè)函數(shù)ldap_connect,ldap_set_option,ldap_bind,依次說明一下這三個(gè)函數(shù)的作用。
ldap_connect:用來連接ldap數(shù)據(jù)庫,格式如下
$server = “l(fā)ocalhost”
$LDAPCONN=LDAP_Connect($server)
如果$LDAPCONN的返回值為數(shù)值型當(dāng)返回結(jié)果為0時(shí)連接失敗,其他值時(shí)連接成功。
ldap_set_option($link_identifier ,$option , &$retval):接收三個(gè)參數(shù)
$link_identifier
ldap_connect()函數(shù)返回的LDAP連接標(biāo)識(shí)符(判斷LDAP是否連接成功)
$option可接收的值如下:
LDAP_OPT_DEREF(int):搜索的時(shí)候如何處理別名,取值范圍如下:LDAP_DEREF_NEVER(0,默認(rèn)值),LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)
LDAP_OPT_NETWORK_TIMEOUT(int):網(wǎng)絡(luò)超時(shí)秒數(shù),LDAP_NO_LIMIT(0,默認(rèn)值)表示永不超時(shí)。
LDAP_OPT_PROTOCOL_VERSION(int):指定使用的LDAP協(xié)議版本,取值范圍如下:LDAP_VERSION2(2,默認(rèn)值), LDAP_VERSION3 (3)。
LDAP_OPT_REFERRALS(bool):LDAP庫是否自動(dòng)追隨LDAP服務(wù)器返回的引用,取值范圍如下:TRUE(1,默認(rèn)值), FALSE(0)。
&$retval接受選項(xiàng)值的變量
比如bwapp中的代碼:
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION, 3);
這句代碼的意思就是說,如果ldap連接成功了,那么就指定LDAP使用的協(xié)議為版本3。(此處不必深究,都為套用格式)
ldap_bind($link_identifier,$bind_rdn,$bind_password)
$link_identifier:ldap_connect()函數(shù)返回的LDAP連接標(biāo)識(shí)符(判斷LDAP是否連接成功)
$bind_rdn:使用指定的rdn即登錄路徑比如cn=admin,dc=bwapp,dc=local
$bind_password:指定登錄的密碼。
ldap_search($link_identifier, $dn,$filter):LDAP目錄搜索函數(shù),成功返回一個(gè)結(jié)果集的資源描述符,通常被其他函數(shù)以$result_identifier引用,失敗返回FALSE。
$link_identifier:ldap_connect()函數(shù)返回的LDAP連接標(biāo)識(shí)符(判斷是否連接成功)
$dn:將要被搜索的目錄的DN
$filter:搜索過濾器。比如"(objectClass=*)"表示搜索所有條目(對(duì)于read函數(shù)則表示所有屬性)。
bwapp中的源碼:ldap_search($ds, $dn,$filter),其中$ds=ldap_connect(),
$dn=”DC=bwapp,DC=local”,$filter=(cn=*)(即所有范圍的cn),這三個(gè)參數(shù)說明ldap_search函數(shù)說明查詢的是當(dāng)前服務(wù)器的所有目錄(相對(duì)于bwapp來說)。
ldap_count_entries($link_identifier,$search):返回查詢的結(jié)果的數(shù)量
$link_identifier:dap_connect()函數(shù)返回的LDAP連接標(biāo)識(shí)符(判斷是否連接成功)
$search:= ldap_search($link_identifier, $dn, $filter)返回查詢的結(jié)果集。
此時(shí)函數(shù)已經(jīng)分析的差不多了,讓我們捋一下這個(gè)連接文件的大概思路。
從149行至163行,代碼都是判斷得到的各種值是不是為空,如果為空,拋出提示信息。
從第165行到198行是判斷登錄是否成功的,其中165行到184行是判斷存不存在ldap服務(wù),187行到198行是判斷是否存在區(qū)分名(相當(dāng)于數(shù)據(jù)庫名)。
從200行到236行是判斷是否存在相應(yīng)的dn,即是否存在相應(yīng)的ldap路徑,如果不存在,拋出相應(yīng)的提示信息,如果存在調(diào)用ldapi.php,即ldap查詢。在ldapi中得到查詢結(jié)果后輸出為表格。
輸出表格的地方在ldapi.php文件中,接下來看ldapi.php中的代碼。
直接從第231行開始看,從第231行到第240行都是上文中說過的,綁定LDAP目錄,代碼如下,不懂的可以看看上文中的LDAP綁定的部分
如果綁定成功LDAP目錄的話,開始進(jìn)行查詢,查詢的代碼從242行開始
從接收POST參數(shù)user的值到,建立別名($search_field_1, $search_field_2,$search_field_3),規(guī)定過濾器($filter)(過濾器就是一個(gè)查詢語句,類似于sql語句),語法規(guī)則如下:
運(yùn)算符 | 字符 | 用途 |
---|---|---|
等號(hào) | = | 創(chuàng)建一個(gè)要求某一字段必須擁有給定值的過濾器。 |
任何 | * | 代表可以等于除 NULL 以外任何值的字段。 |
括號(hào) | ( ) | 分離過濾器,以讓其他邏輯運(yùn)算符發(fā)揮作用。 |
與 | & | 結(jié)合過濾器。相應(yīng)系列的所有條件都必須為真。 |
或 | | | 結(jié)合過濾器。相應(yīng)系列中必須至少有一個(gè)條件為真。 |
非 | ! | 排除符合過濾條件的所有對(duì)象。 |
返回可能會(huì)造成加載問題的所有對(duì)象:
objectClass=*
返回被指定為“person”的所有用戶對(duì)象:
(&(objectClass=user)(objectCategory=person))
僅返回郵寄名單:
(objectCategory=group)
僅返回公開的文件夾:
(objectCategory=publicfolder)
返回所有用戶對(duì)象,但排除主電子郵件地址已“test”開頭的用戶對(duì)象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=test*)))
返回所有用戶對(duì)象,但排除主電子郵件地址以“test”結(jié)尾的用戶對(duì)象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=*test)))
返回所有用戶對(duì)象,但排除主電子郵件地址中包含字詞“test”的用戶對(duì)象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=*test*)))
返回所有被指定為“person”,且屬于某個(gè)群組或分配列表的所有用戶對(duì)象和別名對(duì)象:
(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))
返回所有被指定為“person”的用戶對(duì)象、所有群組對(duì)象,以及所有聯(lián)系人,但排除任意值被定義為“extensionAttribute9”的對(duì)象:
(&(|(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))(objectClass=contact))(!(extensionAttribute9=*)))
返回所有 DN (CN=GRoup,OU=Users,DC=Domain,DC) 識(shí)別為群組成員的用戶:
(&(objectClass=user)(objectCategory=person)(memberof=CN=Group,CN=Users,DC=Domain,DC=com))
返回所有用戶:
Microsoft?Active Directory? LDAP 服務(wù)器:(&(objectCategory=person)(objectClass=user))
OpenLDAP? 服務(wù)器:(objectClass=inetOrgPerson)
IBM? Notes?Domino LDAP 服務(wù)器:(objectClass=dominoPerson)
在 IBM Notes Domino LDAP 中搜索郵件地址被定義為“person”或“group”的所有對(duì)象:
(&(|(objectClass=dominoPerson)(objectClass=dominoGroup)(objectClass=dominoServerMailInDatabase))(mail=*))
ActiveDirectory:返回所有擁有電子郵件地址的有效(未停用)用戶:
(&(objectCategory=person)(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
返回所有群組 DN 識(shí)別為 Group_1 或Group_2 成員的用戶。
(&(objectClass=user)(objectCategory=person)(|(memberof=CN=Group_1,cn=Users,DC=Domain,DC=com)(memberof=CN=Group_2,cn=Users,DC=Domain,DC=com)))
返回 extensionAttribute1 值為“Engineering”或“Sales”的所有用戶
(&(objectCategory=user)(|(extensionAttribute1=Engineering)(extensionAttribute1=Sales)))
語法規(guī)則介紹完畢,接著分析從267開始的代碼
$ldap_fields_to_find定義一個(gè)數(shù)組,便于打印輸出表格,和接收ldap查詢到的結(jié)果,將$ldap_fields_to_find作為ldap_search函數(shù)的第四個(gè)參數(shù),表示用這個(gè)別名保存接收到的結(jié)果,即鍵值對(duì)形式,接著將結(jié)果返回到$info這個(gè)數(shù)組中,最后將各個(gè)鍵對(duì)應(yīng)到從287行到291行的各個(gè)變量,最后循環(huán)輸出,打印表格,至此,查詢完畢。
既然LDAP過濾器類似于sql查詢語句,那么直接看bwapp中的過濾器如何寫就行了。直接看ldapi.php文件中的$filter變量:
$filter="(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for))";
sql語句的精髓在于拼接單引號(hào),ldap語句的精髓在于拼接括號(hào)。
現(xiàn)在我想要查詢所有的用戶,直接在user處輸入*就行,那么$filter就會(huì)變成$filter="(|($search_field_1=*)($search_field_2=*)($search_field_3=*))";
看一下bwapp中的結(jié)果
返回了很多用戶但是不夠,因?yàn)槲蚁肟吹轿业墓芾韱T,那么我就要構(gòu)造這樣的LDAP過濾器。
$filter="(|($search_field_1=*)(objectclass=*)($search_field_2=*)($search_field_3=*))";
這樣我就能查詢所有的用戶,包括管理員,objectclass=*的意思就是只要存在就搜索,即全局。
那么在user處輸入*)(objectclass=*就行
看下結(jié)果,出現(xiàn)了管理員,注入成功。
看完上述內(nèi)容,你們掌握如何進(jìn)行bee-box LDAP注入的靶場練習(xí)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!