Shikata Ga Nai

Private? There is no such things.

Content-Security-Policy Bypass to perform XSS using MIME sniffingを訳してみた

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

 

f:id:ThisIsOne:20211001064314p:plain

 

下記のHTMLの単純なペイロードを入力してみると。

ペイロードが反映され、HTMLコンテンツとして表示されて。

 <h1>kleiton0x00</h1>

 

f:id:ThisIsOne:20211001064251p:plain

 

下記の単純なXSSペイロードを入力すると。

 <script>alert(1)</script>

 

WAFによって何もフィルタリングまたはブロックされない場合は。

Javascriptペイロードをトリガーできるはずで。

Webサイトに正常に挿入されたもののalert(1)はなく。

ページソースを見ると、何もフィルタリングまたは削除されておらず。

 

f:id:ThisIsOne:20211001064352p:plain

 

CSPの検出:

ブラウザ(コンソール)の開発者ツールを見てみると。

スクリプトがContent-Security-Policyによってブロックされていることに気づいて。

 

f:id:ThisIsOne:20211001064425p:plain

 

これは何を意味するのかというと。

コンテンツセキュリティポリシー(CSP)は、セキュリティの追加レイヤであって。

具体的には、Webサイトに挿入される外部コードをブロックするHTTPヘッダで。

通常、適切に実装されたCSPは、内部エンティティ(ドメイン自体)による。

スクリプトのみを許可するので。

まず、CSPがどのように機能して。

どのソースからスクリプトをWebサイト内にロードできるかを検出する必要があって。

 

HTTPヘッダのContent-Security-Policyを見ると。

CSPには、Webサイト自体とそのディレクトリおよびサブドメインからの。

スクリプトを受け入れるルールがあることがわかって。

独自の悪意のあるJavascriptを挿入できないため、制限されているようで。

 

f:id:ThisIsOne:20211001064517p:plain

 

XSSに対する別の脆弱なエンドポイントの発見:

それを回避することはできないので、さらにXSSを見つけることに。

すると、インデックスのページソースを開いたところ。

スクロールしているときに、パラメータを持つphpコードに気づいて。

 /js/countdown.php?end=2534926825

 

f:id:ThisIsOne:20211001064620p:plain

 

すぐに、/js/countdown.phpに移って。

endパラメータに単純な文字列値を入力して、Webサイトの動作を確認すると。

 /js/countdown.php?end=2534926825kleiton0x00

 

文字列(kleiton0x00)がソースコードに反映されているのがわかったので。

 javascriptコードの挿入を開始できて。

 

f:id:ThisIsOne:20211001064553p:plain

 

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は、反映されず。

 

f:id:ThisIsOne:20211001064713p:plain

 

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>

 

f:id:ThisIsOne:20211001064813p:plain

 

XSSの脆弱性が発生する可能性があって。

攻撃者がXSS攻撃を実行するためにCSPをバイパスして。

MIMEスニッフィングを使用してalert(1)コードを正常に実行できて。

 

Best regards, (^^ゞ