如果說sql注入的本質是拼接字串的話,那麼一切可以注入的本質都是拼接字串,LDAP注入作為注入的一種也不例外,更有趣一點的說它是在拼接圓括號( sql注入也拼接圓括號,但更習慣性的是說它拼接字串)。
在環境配置篇裡面已經很詳細的說了bee-box中ldap環境的配置,靶場練習篇更多的是php與ldap的連接過程,中間使用的特殊函數介紹以及圓括號拼接的一些技巧。
下面先說一下bwapp中ldap靶場的登入過程:
#首先這是一個LDAP的登入介面,URL是http:/ /192.168.3.184/bWAPP/ldap_connect.php,直接看下這個php的檔案都寫了什麼。
從ldap_connect.php 檔案的133的程式碼開始看,五個變數依序是$message,$login, $ password,$server,$dn。
這五個變數中第一個是麼有啥用的,第二個登入ldap伺服器的用戶名,第三個密碼,第四個伺服器位址,第五個區分名(描述一條完整的LDAP路徑)。
第一個if語句是清空登入LDAP的表單,第二個if語句是判斷這五個變數是不是空值,這都是小事,重點是後面的這個else,從這個else裡面開始看,又有了多個if和else語句,一個個來吧。
首先看第一個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)傳回查詢的結果集。
此時函數已經分析的差不多了,讓我們捋一下這個連接檔的大概思路。
從149行至163行,程式碼都是判斷得到的各種值是不是為空,如果為空,拋出提示訊息。
從第165行到198行是判斷登入是否成功的,其中165行到184行是判斷存不存在ldap服務,187行到198行是判斷是否存在區分名(相當於資料庫名稱)。
從200行到236行是判斷是否存在對應的dn,即是否存在對應的ldap路徑,如果不存在,拋出對應的提示訊息,如果存在呼叫ldapi.php,即ldap查詢。在ldapi中得到查詢結果後輸出為表格。
輸出表格的地方在ldapi.php檔案中,接下來看ldapi.php中的程式碼。
直接從第231行開始看,從第231行到第240行都是上文中說過的,綁定LDAP目錄,程式碼如下,不懂的可以看看上文中的LDAP綁定的部分
如果綁定成功LDAP目錄的話,開始進行查詢,查詢的程式碼從242行開始
從接收POST參數user的值到,建立別名($search_field_1, $search_field_2,$search_field_3),規定過濾器($filter)(過濾器就是一個查詢語句,類似sql語句),語法規則如下:
## | ##字元 | 用途 |
---|---|---|
= | 建立一個要求某一欄位必須擁有給定值的過濾器。 | |
* | 代表可以等於 NULL 以外任何值的欄位。 | |
( ) | 分離篩選器,以便其他邏輯運算子發揮作用。 | |
& | 結合濾鏡。對應系列的所有條件都必須為真。 | |
| | 結合濾鏡。對應系列中必須至少有一個條件為真。 | |
! | 排除所有符合篩選條件的物件。 |
以上是如何進行bee-box LDAP注入的靶場練習的詳細內容。更多資訊請關注PHP中文網其他相關文章!