Hello there, ('ω')ノ
MIMEスニッフィングを使用してXSSを実行するためのCSPバイパスを。
脆弱性:
XSS
CSPバイパス
記事:
https://infosecwriteups.com/content-security-policy-bypass-to-perform-xss-3c8dd0d40c2e
ツール:
FireFox
概要:
最近、クロスサイトスクリプティングの脆弱性を実行すると。
CSPが実行中の外部Javascriptコード(XSS)をブロックしていたために。
通常のXSSペイロードがトリガされず。
別のエンドポイント(これもCSPによってブロックされて)で。
別のXSSの脆弱性を見つけて、それらを組み合わせてCSPバイパスを実現して。
MIMEスニッフィングを使用してXSSをトリガすることができて。
最初のXSSの発見:
下記は、インデックスにあるエンドポイントを示していて。
このエンドポイントのパラメータ値は、ウェブサイトの本文に反映されて。
/?name=kleiton0x00
下記のHTMLの単純なペイロードを入力してみると。
ペイロードが反映され、HTMLコンテンツとして表示されて。
<h1>kleiton0x00</h1>
下記の単純なXSSペイロードを入力すると。
<script>alert(1)</script>
WAFによって何もフィルタリングまたはブロックされない場合は。
Javascriptペイロードをトリガーできるはずで。
Webサイトに正常に挿入されたもののalert(1)はなく。
ページソースを見ると、何もフィルタリングまたは削除されておらず。
CSPの検出:
ブラウザ(コンソール)の開発者ツールを見てみると。
スクリプトがContent-Security-Policyによってブロックされていることに気づいて。
これは何を意味するのかというと。
コンテンツセキュリティポリシー(CSP)は、セキュリティの追加レイヤであって。
具体的には、Webサイトに挿入される外部コードをブロックするHTTPヘッダで。
通常、適切に実装されたCSPは、内部エンティティ(ドメイン自体)による。
スクリプトのみを許可するので。
まず、CSPがどのように機能して。
どのソースからスクリプトをWebサイト内にロードできるかを検出する必要があって。
HTTPヘッダのContent-Security-Policyを見ると。
CSPには、Webサイト自体とそのディレクトリおよびサブドメインからの。
スクリプトを受け入れるルールがあることがわかって。
独自の悪意のあるJavascriptを挿入できないため、制限されているようで。
XSSに対する別の脆弱なエンドポイントの発見:
それを回避することはできないので、さらにXSSを見つけることに。
すると、インデックスのページソースを開いたところ。
スクロールしているときに、パラメータを持つphpコードに気づいて。
/js/countdown.php?end=2534926825
すぐに、/js/countdown.phpに移って。
endパラメータに単純な文字列値を入力して、Webサイトの動作を確認すると。
/js/countdown.php?end=2534926825kleiton0x00
文字列(kleiton0x00)がソースコードに反映されているのがわかったので。
javascriptコードの挿入を開始できて。
2番目のXSSを実行するためにJavascript文字列の破壊:
単純な文字列を入力する代わりに、js文字列を壊してみることに。
これを行う方法として。
下記を追加して、2行目の現在のJavascriptコードを閉じることに。
);
これで、コードが閉じるので新しいJavascriptコードを追加できて。
この場合だと、alert(1);で。
残念ながら、同じ行に下記のコードが残っているので。
*1000).getTime();
それらを取り除く方法として、入力の最後に//を追加して。
最終的なペイロードは、下記のようになって。
);alert(1);//
したがって、完全なURLは下記のとおりで。
http://website.com/js/countdown.php?end=2534926825);alert(1);//
ただし、このURLに移動すると、XSSが再びCSPによってブロックされて。
XSSは、反映されず。
MIMEスニッフィングを使用して2つのXSSでCSPをバイパス:
インデックスページで見つけた最初のXSSと。
countdown.phpで見つけた2番目のXSSを組み合わせることに。
MIMEスニッフィングがXSSの脆弱性をもたらす可能性があることを見てみると。
攻撃者が、MIMEスニッフィングを利用してXSS攻撃を実行するには。
満たす必要のある特定の前提条件があって。
前提条件は両方ともクライアント側にあることがポイントで。
攻撃者は、悪意のあるJavaScriptを挿入できるように。
サーバの応答のコンテンツを制御できる必要があって。(2番目に見つかったXSS)
);alert(1);//
攻撃者は、HTMLインジェクションまたは。
Javascriptインジェクション(最初に見つかったXSS)を介して。
実行可能なコンテキストを導入できるはずで。
XSSペイロードは。
最初のXSS(<script>alert(1)</script>)で見つかったものに基づいて。
Javascriptを実行する代わりに、下記のcountdown.phpのURLをロードして。
http://website.com/js/countdown.php?end=2534926825);alert(1);//
したがって、最初のXSSペイロードを脆弱なphpファイルのURLと組み合わせると。
最終的なペイロードは、下記のようになって。
<script src=’http://website.com/js/countdown.php?end=2534926825);alert(1);//></script>
XSSの脆弱性が発生する可能性があって。
攻撃者がXSS攻撃を実行するためにCSPをバイパスして。
MIMEスニッフィングを使用してalert(1)コードを正常に実行できて。
Best regards, (^^ゞ