Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
SC3010-Computer-Security — Struts2とPowerShellを使用してCVE-2017-5638 OGNL Injection脆弱性を再現する。 | Kitploit
ツール/GitHubGitHub/aipeacs/sc3010-computer-security
静的分析脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ペイロード開発ラボと実践Archived
GitHubaipeacs/sc3010-computer-security

SC3010-Computer-Security

281ヶ月前未レビュー

Struts2とPowerShellを使用してCVE-2017-5638 OGNL Injection脆弱性を再現する。

リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

SC3010-Computer-Security — CVE-2017-5638 攻撃の再現

このリポジトリは SC3010 Computer Security コースプロジェクト の一部です。
Apache Struts 2(バージョン 2.3.5~2.3.31 および 2.5~2.5.10)における重大なリモートコード実行脆弱性である CVE-2017-5638 を再現します。この脆弱性は、約1億4700万人分の個人記録を流出させた 2017年のEquifaxデータ侵害 で悪用されたことで広く知られています。

この脆弱性は単一の設計上の欠陥に起因します。Apache Struts が multipart/form-data のアップロードリクエストの解析に失敗すると、生の Content-Type ヘッダーをサニタイズせずに埋め込んだエラーメッセージを生成し、その文字列が OGNL 式評価器に渡されます。したがって、Content-Type ヘッダー内に OGNL 式を仕込んだ攻撃者は、それを Tomcat プロセスの実行ユーザーとしてサーバー側で実行させることができます。

このリポジトリには以下が含まれます:

  • ファイルアップロードエンドポイントを備えた、動作する 脆弱な Java/Maven サーバー(Struts2 2.3.28)。
  • インジェクションから RCE までの一連の流れを実演する PowerShell エクスプロイトスクリプト。
  • 呼び出しチェーンの各ステップを対応付けた、Apache Struts 2.3.28 の注釈付き 参照ソースファイル。

背景知識

  • OGNL インジェクションはどのように機能するのか?

リポジトリ構成

SC3010-Computer-Security/
├── simulation/
│   ├── backend/          # Vulnerable Apache Struts2 2.3.28 server (Java/Maven)
│   └── attack-script/    # Exploit script for CVE-2017-5638
│       └── exploit_cve_2017_5638.ps1   # PowerShell (cross-platform)
├── struts-src-code/          # Apache Struts2 reference source + legal notices
│   ├── licenses/             # LICENSE, NOTICE, and component licenses
│   └── src/
│       ├── struts2-core/     # Request pipeline classes + vulnerable JakartaMultiPartRequest
│       ├── xwork2/           # ActionContext.java, OgnlUtil.java
│       └── ognl/             # OgnlContext.java
├── diagrams/                 # State-machine + sequence diagrams, annotated OGNL payload
└── _notes/                   # Background reading

エクスプロイトシミュレーション

  • セットアップと使用方法については simulation/README.md を参照してください。

攻撃ステートマシン図

以下の図は、Struts2 リクエストパイプラインにおける各分岐判断を示しています。赤い経路は攻撃者が強制する経路であり、灰色の → ... 分岐はエクスプロイト時に該当しない安全な経路です。

flowchart TD
    Start(["Attacker sends HTTP POST /upload.action<br/>Content-Type: &#37;&#123;OGNL_PAYLOAD&#125;.multipart/form-data"])
    Start --> PIPE

    PIPE["<b>Struts2 filter → wrap → parse pipeline</b><br/>doFilter() → PrepareOperations.wrapRequest()<br/>→ Dispatcher.wrapRequest() → new MultiPartRequestWrapper()"]
    PIPE --> D_CT{"Content-Type contains<br/>multipart/form-data?"}
    D_CT -- "No → normal request ..." --> OUT_NORM([non-upload path ...])
    D_CT -- "Yes (attacker appends<br/>.multipart/form-data to payload)" --> PARSE

    PARSE[/"<b>JakartaMultiPartRequest.parse()</b><br/>→ Commons FileUpload.parseRequest()"/]
    PARSE --> D_VALID{"FileUpload can parse<br/>Content-Type?"}
    D_VALID -- "Yes → normal file upload ..." --> OUT_OK([files extracted, action executes ...])
    D_VALID -- "No — malformed Content-Type<br/>throws InvalidContentTypeException<br/>(message = raw Content-Type string)" --> CATCH

    CATCH["parse() catch block<br/>calls buildErrorMessage(e, &#123;&#125;)"]
    CATCH --> FIND

    FIND[/"<b>buildErrorMessage()</b><br/>→ LocalizedTextUtil.findText(class, errorKey, locale, e.getMessage(), args)"/]
    FIND --> D_KEY{"Resource bundle has key<br/>struts.messages.upload.error.*?"}
    D_KEY -- "Yes → safe localised message ..." --> OUT_SAFE([error displayed safely ...])
    D_KEY -- "No — falls back to<br/>e.getMessage() as the default<br/>(attacker's raw Content-Type)" --> TRANSLATE

    TRANSLATE["TextParseUtil.translateVariables()<br/>scans string for &#37;&#123;...&#125; expressions"]
    TRANSLATE --> D_OGNL{"String contains<br/>&#37;&#123;...&#125; OGNL expression?"}
    D_OGNL -- "No → plain error string ..." --> OUT_PLAIN([safe error message ...])
    D_OGNL -- "Yes — evaluates OGNL<br/>inside attacker content" --> SANDBOX

    SANDBOX[/"<b>OGNL sandbox bypass</b><br/>#ognlUtil.getExcludedClasses().clear()<br/>#ognlUtil.getExcludedPackageNames().clear()"/]
    SANDBOX --> ACCESS

    ACCESS[/"<b>Unrestricted reflection</b><br/>#context.setMemberAccess(DEFAULT_MEMBER_ACCESS)"/]
    ACCESS --> RCE

    RCE[/"<b>RCE</b><br/>Runtime.getRuntime().exec(cmd)"/]
    RCE --> Done([Command executed as Tomcat process user])

    style Start fill:#d32f2f,color:#fff
    style Done fill:#d32f2f,color:#fff
    style OUT_NORM fill:#9e9e9e,color:#fff
    style OUT_OK fill:#9e9e9e,color:#fff
    style OUT_SAFE fill:#9e9e9e,color:#fff
    style OUT_PLAIN fill:#9e9e9e,color:#fff
    style SANDBOX fill:#b71c1c,color:#fff
    style ACCESS fill:#b71c1c,color:#fff
    style RCE fill:#b71c1c,color:#fff
    style CATCH fill:#e65100,color:#fff
    style TRANSLATE fill:#e65100,color:#fff

完全な状態遷移図と分岐の説明については、diagrams/cve-2017-5638-state-machine.md を参照してください。
シーケンス図のビューと注釈付き OGNL ペイロードの内訳については、diagrams/cve-2017-5638-attack-chain.md を参照してください。


サードパーティソフトウェアに関する通知

このリポジトリは、学術的なセキュリティ研究目的で Apache Struts 2.3.28 のソースコードの一部を再現しています。

Apache Struts は Copyright © 2000–2016 The Apache Software Foundation です。
Apache License, Version 2.0 の下でライセンスされています。
ライセンスのコピーは struts-src-code/licenses/LICENSE.txt で入手できます。
Apache License で要求される完全な帰属通知は struts-src-code/licenses/NOTICE.txt にあります。

Apache Struts 2 は追加のサードパーティコンポーネントをバンドルしており、それぞれが独自のライセンスに従います:

コンポーネントライセンスファイル
OGNL (Object-Graph Navigation Library)struts-src-code/licenses/OGNL-LICENSE.txt
XWorkstruts-src-code/licenses/XWORK-LICENSE.txt
FreeMarkerstruts-src-code/licenses/FREEMARKER-LICENSE.txt

ソース参照:

  • apache/struts @ STRUTS_2_3_28 — Struts2 コアおよび XWork
  • jkuhnert/ognl — OGNL 3.0.x
  • Gemini — 一般的な OGNL 言語に関する相談
ツールをダウンロード