ホームページ >運用・保守 >安全性 >Bee-box LDAP インジェクションを使用して範囲練習を行う方法

Bee-box LDAP インジェクションを使用して範囲練習を行う方法

WBOY
WBOY転載
2023-05-13 09:49:051720ブラウズ

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 のコードから始まる 5 つの変数は $message、$ログイン、$ パスワード、$server、$dn。

これら 5 つの変数の最初の変数は何に使用されますか? 2 番目は LDAP サーバーにログインするためのユーザー名、3 番目はパスワード、4 番目はサーバー アドレス、5 番目は識別名です。 (1 つの完全な LDAP パスを記述します)。

最初の if ステートメントはログイン LDAP フォームをクリアするためのものであり、2 つ目の if ステートメントは 5 つの変数が NULL 値であるかどうかを判断するものです。これらはすべて簡単な事項です。重要な点は次の else です。これから説明します。 else 最初に if 文と else 文が複数あるので、一つずつ見ていきましょう。

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

最初に、最初の if の前にある 3 つの関数 ldap_connect、ldap_set_option、および ldap_bind に注目し、これら 3 つの関数の機能を順番に説明します。

ldap_connect: LDAP データベースへの接続に使用されます。形式は次のとおりです。

$server = “localhost”

$LDAPCONN=LDAP_Connect($server)

If $ LDAPCONN の戻り値が数値型の場合、戻り値が 0 の場合は接続失敗、それ以外の場合は接続成功となります。

ldap_set_option($link_identifier,$option, &$retval): 3 つのパラメータを受け取ります

$link_identifier

ldap_connect() 関数によって返される LDAP 接続識別子 (LDAP を決定します)接続が成功したかどうか)

$オプションは次の値を受け取ることができます:

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 接続識別子(接続が成功したかどうかを LDAP で判断)

$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=*)」は、すべてのエントリを検索することを意味します(読み取り関数の場合、すべての属性を意味します)。

bwapp のソース コード: ldap_search($ds, $dn,$filter)、$ds=ldap_connect(),

$dn=”DC=bwapp,DC=local”, $filter=(cn=*) (つまり、cn のすべての範囲) これら 3 つのパラメータは、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行目はldapサービスの有無の判定です。 name (データベース名に相当)。

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

200 行目から 236 行目は、対応する dn が存在するかどうか、つまり、対応する ldap パスが存在するかどうかを判断するもので、存在しない場合は、対応するプロンプト メッセージが表示されます。存在する場合は、ldap クエリである ldapi.php を呼び出します。 ldapiでクエリ結果を取得した後、結果をテーブルとして出力します。

LDAP クエリ結果の php ファイルの紹介

テーブルが出力される場所は ldapi.php ファイル内です 次に、ldapi.php 内のコードを見てください。

231 行目から直接開始します。231 行目から 240 行目まではすべて上記のとおりです。LDAP ディレクトリをバインドします。コードは次のとおりです。理解できない場合は、LDAP バインディングを見てください。パート

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

#LDAP ディレクトリが正常にバインドされると、クエリが開始されます。クエリ コードは 242 行目から始まります。

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

POST パラメータ ユーザーの値の受信から、エイリアス ($search_field_1、$search_field_2、$search_field_3) の確立、フィルター ($filter) の指定 (フィルターは SQL ステートメントに似たクエリ ステートメント)、構文ルールは次のとおりです。

##Operator文字使用等号 任意の * は、NULL を除く任意の値と等しいフィールドを表します。 ( ) ## フィルタを & と組み合わせます。対応する系列のすべての条件が true である必要があります。 組み合わせたフィルター。対応する系列の少なくとも 1 つの条件が true である必要があります。 ##Non ! フィルター条件に一致するすべてのオブジェクトを除外します。 ##################################

読み込みの問題を引き起こす可能性のあるすべてのオブジェクトを返す:

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 で、電子メール アドレスが「個人」または「グループ」として定義されているすべてのオブジェクトを検索します。

(&(|(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 関数の 4 番目のパラメーターとして使用します。これは、このエイリアスを使用して、受信した結果をキーと値のペアの形式で保存することを意味します。次に、結果を $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 ステートメントの本質は括弧の結合にあります。

ここですべてのユーザーをクエリしたいのですが、ユーザーに * を直接入力すると、$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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。