ホームページ  >  記事  >  運用・保守  >  LDAP インジェクションを理解する方法

LDAP インジェクションを理解する方法

王林
王林転載
2023-05-22 21:47:133032ブラウズ

1. LDAP インジェクション

LDAP (Light Directory Access Portocol) は、X.500 標準に基づく軽量のディレクトリ アクセス プロトコルで、ディレクトリ データベース メソッドにアクセスするためのサービスとプロトコルを提供します。一般に、ディレクトリ データベースを使用してディレクトリ サービスを形成するために使用されます。このディレクトリは、クエリ、参照、検索用に最適化された専門的な分散データベースであり、Linux/Unix システムのファイル ディレクトリに似たツリー構造でデータを編成します。公開証明書、セキュリティ キー、会社の物理デバイス情報など、頻繁に変更されないデータをディレクトリに保存するのに適しています。 SQL と同様に、LDAP はクエリ構文を備えた検索プロトコルであり、潜在的なインジェクション攻撃のリスクがあります。 LDAP インジェクションとは、クライアントがクエリ リクエストを送信する際の入力文字列に特殊文字が含まれることで、LDAP の元のクエリ構造が変更され、より多くの不正なデータへのアクセスが可能になる攻撃方法を指します。

この記事では、JAVA 言語のソース コードを例として、CWE ID 90 の LDAP インジェクションの脆弱性: LDAP クエリで使用される特殊な要素の不適切な中和 (「LDAP インジェクション」) の原因と修復方法を分析します。サンプル。詳細については、次を参照してください:

  • CWE ID 90: LDAP クエリで使用される特殊要素の不適切な中和 ('LDAP インジェクション')

    http:/ /cwe .mitre.org/data/settings/90.html

  • CWE ID 639: ユーザー制御キーによる認証バイパス

    http://cwe.mitre. org/ data/settings/639.html

2. LDAP インジェクションの危険

LDAP インジェクションは、によって導入されます。ユーザーパラメータを使用すると、LDAP フィルタを構築することでアクセス制御とユーザー権限昇格をバイパスする悪意のある LDAP クエリが生成されます。通常のフィルターの構築を通じて、AND および OR 演算の挿入が実装され、機密情報が取得されます。

2018 年 1 月から 2019 年 1 月にかけて、CVE に関連する脆弱性情報が合計 4 件ありました。脆弱性の一部は次のとおりです。

##CVE 番号##CVE-2018-12689phpLDAPadmin 1.2.2 は cmd.php 経由で許可されますか? cmd=loginform リクエスト内の細工された serverid パラメータ、またはログイン パネル内の細工されたユーザー名とパスワードを使用した LDAP インジェクション。 CVE-2018-5730MIT krb5 1.6 以降では、認証された kadmin が「linkdn」および「containerdn」データベース パラメーターを指定することで、プリンシパルを LDAP Kerberos データベースに追加できます。 DN コンテナ チェックをバイパスするか、DN 文字列を DN コンテナ チェックの拡張として提供します。 CVE-2016-8750 4.0.8 より前の Apache Karaf は、LDAPLoginModule を使用して LDAP 経由でユーザーを認証します。ただし、ユーザー名は正しくエンコードされていないため、LDAP インジェクション攻撃に対して脆弱であり、結果としてサービス妨害が発生します。 CVE-2011-4069PacketFence html/admin/login.php 3.0.2 より前では、リモート攻撃者が認証をバイパスする細工されたユーザー名を介して LDAP インジェクション攻撃を実行できます。 。

3. サンプル コード

この例は、Samate Juliet Test Suite for Java v1.3 (https://samate.nist.gov/SARD/testsuite.php) からのものです。ソース ファイル名: CWE90_LDAP_Injection__connect_tcp_01.java。

3.1 欠陥コード

LDAP インジェクションを理解する方法LDAP インジェクションを理解する方法

上記のコード例 39 ~ 61 行目では、プログラムは TCP 接続を確立し、ソケットを読み取ります。 データは変数 data に割り当てられ、LDAP クエリ ステートメントが 118 行目で動的に構築され、119 行目で実行されます。 LDAP は、人事組織の共通オブジェクト クラスをカプセル化します。たとえば、個人には、姓 (sn)、名 (cn)、電話番号 (telephoneNumber)、パスワード (userPassword) などの属性が含まれます。このクエリは、変数 data という名前の従業員が存在するかどうかを確認するものですが、変数 data の内容に対してフィルタリングは実行されません。最も単純なインジェクション方法を使用すると、受信パラメータの値が「*」の場合、構築される動的クエリ条件は「(cn=*)」となり、全従業員の情報をクエリする可能性があり、情報漏洩につながります。

上記のサンプルコードを 360 Code Guard でテストした結果、「LDAP インジェクション」の脆弱性があることが判明し、セキュリティ レベルは高いと評価されました。データ汚染の原因とデータ フローの方向は、トレース パス分析を通じて取得でき、図 1


LDAP インジェクションを理解する方法

に示すように、コードの 120 行目で欠陥が報告されます。 #図 1: LDAP インジェクション検出の例

3.2 修正コード


LDAP インジェクションを理解する方法

上記の修正コードでは、119 行目で次のようになります。 javax.naming.ldap パッケージ下の拡張クラス BaseControl は、処理する必要があるパラメータを受け取ります (120 行目) control オブジェクトは、getEncodedValue( ) パラメータを受け取るメソッド data はエンコードされており、エンコードされた値は文字に対応する ASN.1BER エンコード値です。エンコードされたバイト配列にはコマンドの解析に関与する特殊文字が含まれていないため、通常の構造と内容を持つ LDAP クエリ ステートメントを構築できるため、LDAP インジェクションの発生を回避できます。

360 Code Guard を使用して修復されたコードを検出すると、「LDAP インジェクション」欠陥がないことがわかります。図 2 に示すように:


LDAP インジェクションを理解する方法

図 2: 修復後の検出結果

4. LDAP インジェクションを回避する方法

LDAP インジェクションの根本原因は、攻撃者が LDAP メタキャラクターを使用して LDAP クエリの意味を変更することです。 LDAP フィルタを構築するとき、プログラマはどの文字をコマンド解析として扱い、どの文字をデータ解析として扱うべきかを明確にする必要があります。攻撃者がプログラマの事前設定されたさまざまな状況に侵入するのを防ぐために、ホワイトリスト方式を使用して、LDAP クエリ内のユーザー制御の値が完全に事前に決定された文字セットからのものであり、LDAP メタ文字が含まれないようにする必要があります。ユーザー制御の数値範囲要件に LDAP メタキャラクタを含める必要がある場合は、対応するエンコード メカニズムを使用して、LDAP クエリ内のこれらのメタキャラクタの意味をエスケープする必要があります。 ###############のように&、! ,|,=,,,,,-,",',; これらの文字は通常の状況では使用されません。これらの文字がユーザーの入力に表示される場合は、バックスラッシュでエスケープする必要があります。

    #また、(,)、\、*、/、NUL などの文字も含まれます。これらの文字はバックスラッシュで処理するだけでなく、対応する ASCII コード値に変換する必要があります。 .
概要

以上がLDAP インジェクションを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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