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 のコードから始まる 5 つの変数は $message、$ログイン、$ パスワード、$server、$dn。
これら 5 つの変数の最初の変数は何に使用されますか? 2 番目は LDAP サーバーにログインするためのユーザー名、3 番目はパスワード、4 番目はサーバー アドレス、5 番目は識別名です。 (1 つの完全な LDAP パスを記述します)。
最初の if ステートメントはログイン LDAP フォームをクリアするためのものであり、2 つ目の if ステートメントは 5 つの変数が NULL 値であるかどうかを判断するものです。これらはすべて簡単な事項です。重要な点は次の else です。これから説明します。 else 最初に if 文と else 文が複数あるので、一つずつ見ていきましょう。
最初に、最初の 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) は、クエリの結果セットを返します。 この時点で、関数はほぼ分析されているので、この接続ファイルの概要を説明しましょう。 149 行目から 163 行目までは、取得したさまざまな値が空かどうかを判定し、空の場合はプロンプト メッセージがスローされます。165行目から198行目はログイン成功の判定、165行目から184行目はldapサービスの有無の判定、187行目から198行目はldapサービスの有無の判定です。 name (データベース名に相当)。
200 行目から 236 行目は、対応する dn が存在するかどうか、つまり、対応する ldap パスが存在するかどうかを判断するもので、存在しない場合は、対応するプロンプト メッセージが表示されます。存在する場合は、ldap クエリである ldapi.php を呼び出します。 ldapiでクエリ結果を取得した後、結果をテーブルとして出力します。
テーブルが出力される場所は ldapi.php ファイル内です 次に、ldapi.php 内のコードを見てください。
231 行目から直接開始します。231 行目から 240 行目まではすべて上記のとおりです。LDAP ディレクトリをバインドします。コードは次のとおりです。理解できない場合は、LDAP バインディングを見てください。パート
#LDAP ディレクトリが正常にバインドされると、クエリが開始されます。クエリ コードは 242 行目から始まります。
POST パラメータ ユーザーの値の受信から、エイリアス ($search_field_1、$search_field_2、$search_field_3) の確立、フィルター ($filter) の指定 (フィルターは SQL ステートメントに似たクエリ ステートメント)、構文ルールは次のとおりです。
文字 | 使用 | |
---|---|---|
= | 特定のフィールドに対するリクエストを作成します。フィールドには、指定された値に対するフィルターが必要です。 | 任意の |
は、NULL を除く任意の値と等しいフィールドを表します。 | ##括弧 | |
他の論理演算子が機能できるようにフィルターを分離します。 | ## フィルタを | & |
## または | | | |
##Non | ! | フィルター条件に一致するすべてのオブジェクトを除外します。 ################################## |
以上がBee-box LDAP インジェクションを使用して範囲練習を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。