Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
codeql-workshop-cve-2021-21380 — CVE-2021-21380 をカバーする CodeQL ワークショップ | Kitploit
ツール/GitHubGitHub/rvermeulen/codeql-workshop-cve-2021-21380
静的分析脆弱性分析コード分析ウェブセキュリティ学習と教育ラボと実践
GitHubrvermeulen/codeql-workshop-cve-2021-21380

codeql-workshop-cve-2021-21380

CVE-2021-21380 をカバーする CodeQL ワークショップ

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
リポジトリを見る
1251年前未レビュー
共有

Java 向け CodeQL ワークショップ: SQL インジェクションを見つける

このワークショップでは、CVE-2021-21380 で文書化された XWiki プラットフォームの評価コンポーネントにおける SQL インジェクションを見つけるために、構文解析と意味解析を使用します。

Contents

  • Java 向け CodeQL ワークショップ: SQL インジェクションを見つける
    • Contents
    • 前提条件とセットアップ手順
      • ローカルマシンの場合
        • インストール
        • セットアップ手順
    • ワークショップ
      • 学習内容
      • 問題の説明
      • 演習
        • 演習 1
        • インターメッツォ 1
        • 演習 2
        • 演習 3
        • インターメッツォ 2
        • 演習 4
        • 演習 5
        • インターメッツォ 3
        • 演習 6
        • 演習 7
        • 演習 8
    • 次のステップ?

前提条件とセットアップ手順

ローカルマシンの場合

可能であれば、ワークショップの前にこのセクションを完了してください。

インストール

  • Visual Studio Code をインストールします。

  • CodeQL 拡張機能 for Visual Studio Code をインストールします。

  • CodeQL CLI をインストールする 必要はありません: 拡張機能が自動的に処理します。

  • このリポジトリをクローンします:

    root@kitploit:~
    git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
    

セットアップ手順

  • ワークショップで使用する CodeQL データベース をインポートします:
    • エクスプローラービューで xwiki-platform-CVE-2021-21380.zip ファイルを右クリックし、CodeQL: Set Current Database コマンドを選択します。
    • データベースは、アクティビティバーの QL アイコンからアクセスできる CodeQL データベースビューに表示されます。
  • Java コードを解析し、演習と解答のテストを実行するための依存関係をインストールします。
    • コマンドパレット (Cmd/Ctrl+Shift+P) から、CodeQL: Install Pack Dependencies コマンドを検索して実行します。
    • VS Code ウィンドウの上部で、ボックスに github と入力してリストをフィルタリングします。
    • cve-2021-21380-exercises、cve-2021-21380-exercises-tests、cve-2021-21380-solutions、cve-2021-21380-solutions-tests の横のチェックボックスをオンにします。
    • OK/Enter をクリックします。
  • 解答のテストを実行して、すべてが期待通りに動作することを確認します。
    • テストビューを開き、ツリー内の solutions アイテムの横にある run tests (解答にカーソルを合わせると再生アイコンが表示されます) を押します。

ワークショップ

学習内容

ワークショップはいくつかの演習に分かれており、Java の QL 言語サポートを紹介し、既知の SQL インジェクションを見つけるための最終的なクエリで終了します。 これらの演習では以下を学びます:

  • 構文情報について推論する方法。
  • 意味情報について推論する方法。
  • パターンを表現するための Java の QL 言語サポートを探求する。
  • 既存のモデリングを再利用および拡張する方法を探求する。
  • 複数の構成要素を使用して最終的なクエリを構成する。

問題の説明

このワークショップでは、XWiki プラットフォーム の評価 API コンポーネントにおける既知の SQL インジェクションの脆弱性 を探します。このような脆弱性は、外部ユーザーによって制御される情報が、安全でない方法で SQL クエリを構築して実行するアプリケーションコードに到達した場合に発生する可能性があります。

このワークショップで扱う既知の SQL インジェクションは、GitHub Advisory Database の GHSA-79rg-7mv3-jrr5 でレビューされています。SQL インジェクションとその可能性のある亜種を見つけるために、以下のサブ問題に取り組みます:

  • 信頼されていない情報のソースを特定し、QL でモデル化する。
  • シンク、つまり SQL クエリを実行するメソッドを特定し、QL でモデル化する。
  • 上記の解決策を組み合わせて、taint 追跡を使用してソースとシンクの間に情報の流れがあるかどうかを判断する。

演習

最初のいくつかの演習では、抽象構文木 (AST) を使用して構文情報を推論し、以下を特定します:

  • セキュリティアドバイザリで脆弱性の理解を深めるために説明されているメソッド
  • 信頼されていないデータを含むパラメータ (私たちの ソース)
  • SQL ステートメントを受け入れるメソッド呼び出し (私たちの シンク)

演習 1

プログラム内で getAverageRating という名前のすべてのメソッドとその宣言型を見つけるには、クエリ exercise1.ql を完成させます。

ヒント
  • java モジュールは、プログラム内のメソッドを推論するためのクラス Method を提供します。
  • クラス Method は、メソッドの名前を推論するためのメンバー述語 getName および hasName を提供します。
  • クラス Method は、メソッドを宣言する型を推論するためのメンバー getDeclaringType を提供します。

解答はクエリ exercise1.ql にあります。

インターメッツォ 1

演習 1 の解答はメソッドのリストを返します。そのうちのいくつかは RatingsManager というインターフェースで定義され、いくつかはクラス AbstractRatingsManager および RatingsScriptService で定義されています。

クエリが返す情報と XWiki コンポーネントのドキュメント から、以下を推測できます:

  • XWiki はコンポーネント指向の設計を使用して、拡張とカスタマイズを可能にしています。
  • 脆弱なメソッドはコンポーネントの一部です。
  • コンポーネントは、Role で注釈されたインターフェースと、Component で注釈された実装で構成されます。
  • ScriptService を拡張するコンポーネントは、スクリプトを通じて Wiki ページからアクセス可能になります。

演習 2

注釈 Component で注釈されたすべてのクラスを見つけるには、クエリ exercise2.ql を完成させます。 注釈の型の完全修飾名は org.xwiki.component.annotation.Component であることに注意してください。

ヒント
  • /クラスドメイン型/、そのスーパー型の共通部分は、/特性述語/でキーワード this を使用してアクセスできます。
  • Class クラスは、関連する注釈を取得するためのメソッド getAnAnnotation を提供します。
  • Annotation クラスは、その型を推論するためのメンバー述語 getType を提供します。
  • Type クラスは、型の名前を推論するためのメンバー述語 getName および hasName を提供します。
  • RefType クラス (クラスとインターフェースを表す) は、reftype の完全修飾名を推論するためのメンバー述語 getQualifiedName および hasQualifiedName を提供します。

解答はクエリ exercise2.ql にあります。

演習 3

ScriptService インターフェースを実装するすべてのコンポーネントを見つけるには、クエリ exercise3.ql を完成させます。

ヒント
  • Class 型は、クラスのスーパー型 (つまり、extends または implements する型) を推論するためのメンバー述語 getASuperType を提供します。

解答はクエリ exercise3.ql にあります。

インターメッツォ 2

この時点で、ユーザーが呼び出すことができ、そのパラメータをワークショップの後半で信頼されていないデータのソースと見なすメソッドを構文的に特定しました。

次の演習では、可能性のあるシンクを調査および特定します。演習 1 の結果から、実装の 1 つがメソッド getAverageRatingFromQuery を呼び出していることがわかります。同様のクエリを使用して getAverageRatingFromQuery の宣言型を見つけることができ、それにより AbstractRatingsManager クラスの実装が search メソッドに渡される SQL ステートメントを構築していることを確認できます。

search メソッドは依存関係で実装されているため、その実装は利用できません。次の演習では、利用可能な型情報を使用して、この search メソッド呼び出しとその宣言型を特定します。

演習 4

メソッド search へのすべてのメソッド呼び出しを見つけ、その宣言型を特定するには、クエリ exercise4.ql を完成させます。

ヒント
  • MethodCall 型は、メソッド呼び出しを推論する手段を提供します。
  • MethodAccess 型は、メソッド呼び出しのターゲットを推論するためのメンバー述語 getMethod を提供します。

解答はクエリ exercise4.ql にあります。

演習 5

インターフェース XWikiStorageInterface (修飾名 com.xpn.xwiki.store.XWikiStoreInterface) によって宣言されたメソッドへのすべてのメソッド呼び出しを見つけるには、クエリ exercise5.ql を完成させます。

ヒント
  • instanceof キーワードを使用して、値が型によって表される値のセットに属することを表明できます。 例えば、インターフェースメソッドへのすべての呼び出しを特定するには:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

解答はクエリ exercise5.ql にあります。

インターメッツォ 3

この時点で、QL を使用して可能性のあるソースとシンクを構文的に記述しました。プログラム内のこれらのポイント間で情報が流れるかどうかを判断するために、taint 追跡を使用してプログラムを意味解析します。 サポートする言語の標準ライブラリは、2 つのデータフローメカニズムを提供します:

  1. DataFlow モジュールは、値を保持する情報の流れをサポートします。
  2. TaintTracking モジュールは、値が変更された場合でも情報の流れをサポートします。

後者は、SQL インジェクションなどのインジェクション脆弱性では、信頼されていないデータが操作対象となるより大きなステートメントの一部になることが一般的であるため、重要です。

このワークショップでは、既存の SQL インジェクション taint 追跡設定を再利用し、モデル化したソースとシンクで拡張して SQL インジェクションを見つけます。設定を拡張する方法を理解するために、まず以下の設定の定義を見てみましょう。

root@kitploit:~
class QueryInjectionFlowConfig extends TaintTracking::Configuration {
  QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" }

  override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }

  override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink }

  override predicate isSanitizer(DataFlow::Node node) {
    node.getType() instanceof PrimitiveType or
    node.getType() instanceof BoxedType or
    node.getType() instanceof NumberType
  }

  override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
    any(AdditionalQueryInjectionTaintStep s).step(node1, node2)
  }
}

設定で使用される isSource と isSink の両方の述語は、これまでに見た instanceof キーワードを使用してプログラムの位置を特定します。RemoteFlowSource と QueryInjectionSink の両方のクラスは abstract クラスです。 これは標準ライブラリでよく見られるパターンであり、このパターンにより RemoteFlowSource および QueryInjectionSink クラスによって表される値のセットを拡張できます。

abstract クラス を拡張する QL の class は、スーパークラスによって表される値のセットを絞り込むのではなく、サブクラスによって表される値をスーパークラスに追加します。 次の演習では、これらのサブクラスを実装し、最終的なクエリを構築します。

演習 6

演習 3 で特定したコンポーネントクラスのパブリックメソッドのパラメータで RemoteFlowSource の値セットを拡張するには、クエリ exercise6.ql を完成させます。

ヒント
  • instanceof キーワードを使用して、値が型によって表される値のセットに属することを表明できます。 例えば、インターフェースメソッドへのすべての呼び出しを特定するには:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

解答はクエリ exercise6.ql にあります。

演習 7

演習 5 で特定したストレージインターフェースのメソッドへの呼び出しの引数で QueryInjectionSink の値セットを拡張するには、クエリ exercise7.ql を完成させます。

ヒント
  • exists 式を使用すると、一時変数を導入し、exists のスコープ内で推論できます。

    次の例では、exists 式を使用して、メソッドのセットを呼び出されるメソッドに絞り込んでいます。

    root@kitploit:~
    from Method m
    where m.hasName("foo") and exists(MethodCall ma | ma.getMethod() = m)
    select m
    
  • MethodCall クラスは、メソッドアクセスの修飾子を推論するためのメンバー述語 getQualifier を提供します。

解答はクエリ exercise7.ql にあります。

演習 8

前の演習の解答を組み合わせて、クエリ exercise8.ql を完成させることで最終的な解答にします。

解答はクエリ exercise8.ql にあります。

次のステップ?

  • クエリには XWiki フレームワークの一部をモデル化するモジュールが含まれています。これを独自のモジュールファイルにリファクタリングし、クエリで使用してください。
  • 信頼されていないデータのソースをスクリプトサービスのコンポーネントに限定しました。これを他のソースに拡張する方法を検討してください。
  • シンクについては、XWikiStoreInterface の直接使用に限定しました。インターフェースの実装の直接使用を含めるようにシンクを拡張してください。Class クラスはメンバー述語 extendsOrImplements を提供し、Method クラスはメンバー述語 overridesOrInstantiates を提供します。これらが役立つ可能性があります。
  • ソースの定義を使用して、クエリ 'Untrusted data passed to external API' で信頼されていないデータの興味深い使用法を見つけてください。
ツールをダウンロード