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

この記事は 「脆弱性"&'<<>\ Advent Calendar 2016」10日目の記事です。小ネタですみません。

301や302のリダイレクトのレスポンスボディにてXSSが存在することが稀にありますが、30x応答ではボディ部分は表示されないのでXSSが存在しても脅威は発生しないというのが多くの方の理解ではないでしょうか。

GET /redir?q=http://example.jp/?"><script>alert(1)</script> HTTP/1.1
Host: example.jp

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


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

ところが、実際には(少なくとも)Firefoxではリダイレクトを止めることでレスポンスボディがブラウザ内に表示されXSSによるスクリプトが動作します。
Firefoxでリダイレクトを止める方法は複数の方法が知られていますが、今日解説するのは、21/tcpなどのブラウザではアクセスが禁止されているポートへリダイレクトさせる方法です。

ブラウザでは、例えば25/tcpにPOSTすることでブラウザからにせのSMTPを投げてメールを送信してしまうような問題を防ぐため、21/tcpや25/tcpなど特定のいくつかのポートへのアクセスが禁止されています。このようなアクセスが禁止されているポートへリダイレクトした場合、Firefoxでは30x応答のレスポンスボディがブラウザ内に表示されるため、30xページにXSSが存在していた場合には攻撃が成立します。

GET /redir?q=http://example.jp:21/?"><script>alert(1)</script> HTTP/1.1
Host: example.jp

HTTP/1.1 301 Moved Permanently
Location: http://example.jp:21/?"><script>alert(1)</script> ← リダイレクトされない
Content-Type: text/html; charset=utf-8


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

このように、30x応答でもXSSが存在していた場合には攻撃を成立させることができますので30xだからと油断せずにきちんと対策が必要です。

30xでXSSを成立させる方法は他にもあるので、時間があれば別の方法についても別途解説したいと思います。ではごきげんよう