首頁  >  文章  >  運維  >  如何進行bee-box LDAP注入的靶場練習

如何進行bee-box LDAP注入的靶場練習

WBOY
WBOY轉載
2023-05-13 09:49:051648瀏覽

如果說sql注入的本質是拼接字串的話,那麼一切可以注入的本質都是拼接字串,LDAP注入作為注入的一種也不例外,更有趣一點的說它是在拼接圓括號( sql注入也拼接圓括號,但更習慣性的是說它拼接字串)。

在環境配置篇裡面已經很詳細的說了bee-box中ldap環境的配置,靶場練習篇更多的是php與ldap的連接過程,中間使用的特殊函數介紹以及圓括號拼接的一些技巧。

下面先說一下bwapp中ldap靶場的登入過程:

如何进行bee-box LDAP注入的靶场练习

#首先這是一個LDAP的登入介面,URL是http:/ /192.168.3.184/bWAPP/ldap_connect.php,直接看下這個php的檔案都寫了什麼。

php連接LDAP函數詳解

如何进行bee-box LDAP注入的靶场练习

從ldap_connect.php 檔案的133的程式碼開始看,五個變數依序是$message,$login, $ password,$server,$dn。

這五個變數中第一個是麼有啥用的,第二個登入ldap伺服器的用戶名,第三個密碼,第四個伺服器位址,第五個區分名(描述一條完整的LDAP路徑)。

第一個if語句是清空登入LDAP的表單,第二個if語句是判斷這五個變數是不是空值,這都是小事,重點是後面的這個else,從這個else裡面開始看,又有了多個if和else語句,一個個來吧。

如何进行bee-box LDAP注入的靶场练习

首先看第一個if之前的三個函數ldap_connect,ldap_set_option,ldap_bind,依序說明這三個函數的作用。

ldap_connect:用來連接ldap資料庫,格式如下

$server = “localhost”

$LDAPCONN=LDAP_Connect($server)

如果$ LDAPCONN的回傳值為數值型當傳回結果為0時連線失敗,其他值時連線成功。

ldap_set_option($link_identifier ,$option , &$retval):接收三個參數

$link_identifier

ldap_connect()函數傳回的LDAP連線標識符(判斷LDAP是否連線成功)

$option可接收的值如下:

LDAP_OPT_DEREF(int):搜尋的時候如何處理別名,取值範圍如下:LDAP_DEREF_NEVER(0,預設值),LDAP_DEREF_SEARCHING (1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)

LDAP_OPT_NETWORK_TIMEOUT(int):網路逾時秒數,LDAP_NO_LIMIT(0,預設值)表示永不逾時。

LDAP_OPT_PROTOCOL_VERSION(int):指定使用的LDAP協定版本,取值範圍如下:LDAP_VERSION2(2,預設值), LDAP_VERSION3 (3)。

LDAP_OPT_REFERRALS(bool):LDAP庫是否會自動追隨LDAP伺服器傳回的引用,取值範圍如下:TRUE(1,預設值), FALSE(0)。

&$retval接受選項值的變數

例如bwapp中的程式碼:

ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION, 3);

這句程式碼的意思就是說,如果ldap連線成功了,那麼就指定LDAP使用的協定為版本3。 (此處不必深究,都為套用格式)

ldap_bind($link_identifier,$bind_rdn,$bind_password)

$link_identifier:ldap_connect()函數傳回的LDAP連線標識符(判斷LDAPAP是否連線成功)

$bind_rdn:使用指定的rdn即登入路徑例如cn=admin,dc=bwapp,dc=local

$bind_password:指定登入的密碼。

ldap_search($link_identifier, $dn,$filter):LDAP目錄搜尋函數,成功傳回一個結果集的資源描述符,通常被其他函數以$result_identifier引用,失敗傳回FALSE。

$link_identifier:ldap_connect()函數傳回的LDAP連線標識符(判斷是否連接成功)

$dn:將要被搜尋的目錄的DN

#$filter:搜尋過濾器。例如"(objectClass=*)"表示搜尋所有條目(對於read函數則表示所有屬性)。

bwapp中的原始碼:ldap_search($ds, $dn,$filter),其中$ds=ldap_connect(),

$dn=”DC=bwapp,DC=local”, $filter=(cn=*)(即所有範圍的cn),這三個參數說明ldap_search函數說明查詢的是目前伺服器的所有目錄(相對於bwapp)。

ldap_count_entries($link_identifier,$search):傳回查詢的結果的數量

$link_identifier:dap_connect()函數傳回的LDAP連線識別碼(判斷是否連線成功)

$search:= ldap_search($link_identifier, $dn, $filter)傳回查詢的結果集。

此時函數已經分析的差不多了,讓我們捋一下這個連接檔的大概思路。

如何进行bee-box LDAP注入的靶场练习

從149行至163行,程式碼都是判斷得到的各種值是不是為空,如果為空,拋出提示訊息。

如何进行bee-box LDAP注入的靶场练习

從第165行到198行是判斷登入是否成功的,其中165行到184行是判斷存不存在ldap服務,187行到198行是判斷是否存在區分名(相當於資料庫名稱)。

如何进行bee-box LDAP注入的靶场练习

從200行到236行是判斷是否存在對應的dn,即是否存在對應的ldap路徑,如果不存在,拋出對應的提示訊息,如果存在呼叫ldapi.php,即ldap查詢。在ldapi中得到查詢結果後輸出為表格。

LDAP查詢結果的php檔案介紹

輸出表格的地方在ldapi.php檔案中,接下來看ldapi.php中的程式碼。

直接從第231行開始看,從第231行到第240行都是上文中說過的,綁定LDAP目錄,程式碼如下,不懂的可以看看上文中的LDAP綁定的部分

如何进行bee-box LDAP注入的靶场练习

如果綁定成功LDAP目錄的話,開始進行查詢,查詢的程式碼從242行開始

如何进行bee-box LDAP注入的靶场练习

從接收POST參數user的值到,建立別名($search_field_1, $search_field_2,$search_field_3),規定過濾器($filter)(過濾器就是一個查詢語句,類似sql語句),語法規則如下:

#等號 =  建立一個要求某一欄位必須擁有給定值的過濾器。 任何  *  代表可以等於 NULL 以外任何值的欄位。 括號  ( )  分離篩選器,以便其他邏輯運算子發揮作用。 與  &  結合濾鏡。對應系列的所有條件都必須為真。 或  |  結合濾鏡。對應系列中必須至少有一個條件為真。 非  !  排除所有符合篩選條件的物件。 #

傳回可能會造成載入問題的所有物件:

objectClass=*

返回所有被指定為「person」的使用者物件:

(&(objectClass =user)(objectCategory=person))

只回傳郵寄名單:

(objectCategory=group)

僅傳回公開的資料夾:

(objectCategory=publicfolder)

傳回所有使用者對象,但排除主電子郵件地址已「test」開頭的使用者對象:

(&(&(objectClass=user)(objectCategory=person ))(!(mail=test*)))

傳回所有使用者對象,但排除主電子郵件地址以「test」結尾的使用者對象:

(&(&(objectClass =user)(objectCategory=person))(!(mail=*test)))

#傳回所有使用者對象,但排除主電子郵件地址中包含字詞「test」的使用者對象:

(&(&(objectClass=user)(objectCategory=person))(!(mail=*test*)))

傳回所有被指定為“person”,並且屬於某個群組或所有指派清單的使用者物件和別名物件:

(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))

傳回所有被指定為“ person」的使用者對象、所有群組對象,以及所有聯絡人,但排除任意值被定義為「extensionAttribute9」的對象:

(&(|(|(&(objectClass=user)(objectCategory =person))(objectCategory=group))(objectClass=contact))(!(extensionAttribute9=*)))

傳回所有DN (CN=GRoup,OU=Users,DC=Domain,DC) 識別為群組成員的使用者:

(&(objectClass=user)(objectCategory=person)(memberof=CN=Group,CN=Users,DC=Domain,DC=com))

#傳回所有使用者:

Microsoft®Active Directory® LDAP 伺服器:(&(objectCategory=person)(objectClass=user))

OpenLDAP™ 伺服器:(objectClass=inetOrgPerson)

IBM® Notes®Domino LDAP 伺服器:(objectClass=dominoPerson)

在IBM Notes Domino LDAP 中搜尋郵件地址被定義為「person」或「group」的所有物件:

#(&(|(objectClass=dominoPerson)(objectClass=dominoGroup)(objectClass=dominoServerMailInDatabase))(mail=*))

ActiveDirectory:傳回所有擁有電子郵件地址的有效(未停用)使用者:

(&(objectCategory=person)(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

## 傳回所有群組群組DN 識別為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)))

語法規則介紹完畢,接著分析從267開始的程式碼

如何进行bee-box LDAP注入的靶场练习

##$ldap_fields_to_find定義一個陣列,以便於列印輸出表格,和接收ldap查詢到的結果,將$ldap_fields_to_find作為ldap_search函數的第四個參數,表示用這個別名保存接收到的結果,即鍵值對形式,接著將結果返回到$info這個數組中,最後將各個鍵對應到從287行到291行的各個變量,最後循環輸出,列印表格,至此,查詢完畢。

LDAP注入拼接語法的簡單介紹

既然LDAP過濾器類似於sql查詢語句,那麼直接看bwapp中的過濾器如何寫就行了。直接看ldapi.php檔案中的$filter變數:

$filter="(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for))";

sql語句的精髓在於拼接單引號,ldap語句的精髓在於拼接括號。

現在我想要查詢所有的用戶,直接在user處輸入*就行,那麼$filter就會變成$filter="(|($search_field_1=*)($search_field_2=*)($ search_field_3=*))";

看看bwapp中的結果

如何进行bee-box LDAP注入的靶场练习

#返回了很多用戶但是不夠,因為我想看到我的管理員,那我就要建構這樣的LDAP過濾器。

$filter="(|($search_field_1=*)(objectclass=*)($search_field_2=*)($search_field_3=*))";

#這樣我就能查詢所有的用戶,包括管理員,objectclass=*的意思是只要存在就搜索,即全域。

那麼在user處輸入*)(objectclass=*就行

看下結果,出現了管理員,注入成功。

 

如何进行bee-box LDAP注入的靶场练习

##   ##字元   用途  

以上是如何進行bee-box LDAP注入的靶場練習的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除