2018 年 8 月 22 日、Apache Struts2 には、高リスクのリモート コード実行の脆弱性 (S2-057/CVE-2018-11776) が存在する最新のセキュリティ情報がリリースされました。この脆弱性は、Semmle Security Research チームのセキュリティ研究者 Man YueMo によって発見されました。
この脆弱性は、Struts2 開発フレームワークで名前空間関数を使用して XML 構成を定義するときに、名前空間の値が設定されておらず、上位層のアクション構成にも設定されていないことが原因です (アクション設定)、またはワイルドカード名前空間を使用するため、リモートでコードが実行される可能性があります。同様に、URL タグに value と action の値が設定されておらず、上位のアクションが設定されていない場合や、ワイルドカード名前空間が使用されている場合も、リモートでコードが実行される可能性があります。構築された環境では、脆弱性は正常に再現され、コマンド echo を実行できます。この記事の最後には、必要なものが揃っています。!
作成者が使用した環境それぞれStrust2 2.3.20版とStrust2 2.3.34版であり、この脆弱性を悪用する方法としては、数値計算、ポップアップ計算機、コマンドエコーの大きく3つが考えられます。
数値計算は比較的簡単です。URLに%{100 200}を指定するとジャンプして計算結果が得られます
バージョン 2.3.20 の POC は次のとおりです。
##2.3.3 4 バージョン リファレンスPOC は次のとおりです:バージョン 2.3.34 の POC は次のとおりです:
攻撃後の影響は次のとおりです
#注意すべき点が 2 つあります。1 つ目は struts.mapper .alwaysSelectFullNamespace = true に設定する必要があります。そうでない場合、脆弱性はトリガーされません。この設定の目的は、最後の前の任意の位置で NameSpace が常に選択されるかどうかを設定することです。スラッシュ; 2 番目の結果タグによって返されるタイプは、「redirectAction またはchain」を選択します。この 2 つだけです。各構成オプションの値は、アクションを転送またはリダイレクトできます。タイプの詳細については、以下の図を参照してください。
設定が完了したら、動的分析を開始します。この脆弱性は
this.namespace メンバーの値は getNamespace( ) メソッドを呼び出し、getUriFromActionMapping() を通じて URI 文字列を返します。
#getUriFromActionMapping を通じて取得した値が tmpLocation 変数に割り当てられ、式が setLocation メソッドに入ります
取得した param 値は、translateVariables() メソッドに渡され、最終的に OnglTextPaser での OGNL 式の実行につながります。
電卓をポップアップした後、取得された lastFinalLocation の値は、現在の実行後のハンドルです。この値は、応答ジャンプのアクション アドレスとして使用されます。これは、ポップ後にアドレス バーに表示される URI です。ブラウザで計算機を起動します
ポップアップ計算機の解析はここで終了です。次に、コマンド実行のエコー結果に基づいた解析を見てみましょう。基本的には、上記と同じです。唯一の違いは、lastFinalLocation によって返される値です。これは NULL です。これは、送信後に 302 ジャンプがないことを意味します。これはまだ現在のアクションであり、戻り値は 200
# 原理を知った後、同僚 経験値検出スクリプトは Python で実装されています。このスクリプトは学習と研究専用です。
1. フレームワークのバージョンを変更する最新の正式バージョンにアップグレードします; 2. Web アプリケーションの場合、コードのセキュリティを確保するように努めます; 3. IDS ルール レベルの場合、数値計算と箇条書き電卓はステータス コードをすべて 302 に返し、ロケーション ジャンプ フィールドには特性ハンドル文字列が含まれます。コマンド echo によって返されるステータス コードが 200 の場合、コマンド結果の出力;
以上がStruts2-057 2 つのバージョンの RCE 脆弱性分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。