alert(1)では、危険性がわからなかった人にも優しいXSS解説
XSSとは、攻撃者によって意図しないHTMLやJavaScriptを挿入される脆弱性です。
XSSを説明する際に、ローカルサーバーを立ち上げた後にブラウザ上でhttp://localhost:8080/?keyword=<script>alert(1)</script>
にアクセスすると警告ダイヤルが表示される例を目にすることが多いと思います。
なるほど、危なさそうだ!と思いながら具体的な攻撃手法が思い浮かばずモヤモヤしていました。本記事では、このモヤモヤを解決するため攻撃方法を紹介します。絶対に、他者のサイトで実行しないで下さい。
$ php -v PHP 7.1.32 $ php -S localhost:8080 -t `pwd`
<?php setcookie("email", "example@gmail.com", time()+3600, "/", "localhost", FALSE, FALSE); ?> <body> <?php echo $_GET['keyword']; ?> </body>
setcookie
で設定されたクッキーは、document.cookieで取得できます。
setcookie
で設定したCookie値はdocument.cookie
の最後尾にあったので、汎用性がない方法ではありますがdocument.cookie.split(" ").slice(-1)[0]
で取り出せます。
ここで、http://localhost:8080/?keyword=<script>alert(1)</script>
をhttp://localhost:8080/?keyword=<script>alert(document.cookie.split(" ").slice(-1)[0])</script>
に変更すると自分のCookie値が取り出せていることがわかります。
自分のCookie情報を取れたとしても、意味はありません。攻撃するのには、他者のCookie情報が必要なのです。
次に、Window.locationを紹介します。ドキュメントの中に、location = "http://www.mozilla.org";
があります。これは、指定したURIに移動することできます。以下のように、実行すると当ブログのTOPページに移動することが確認できます。
http://localhost:8080/?keyword=<script>location="https://www.imaharutech.work"</script>
XSSがあるサイトでは、自サイトからlocationを利用してリダイレクトのようなことを行うことができます。
上記とdocument.cookie
を組み合わせると他者のCookie値を抜き取ることができます。
つまり攻撃専用のダミーサイトを立ち上げ、src
やaction
が利用できるHTMLタグを設置し攻撃サイトへCookie値を含んでリダイレクトさせるのです。
対策
HTTP Only
HttpOnlyを設定すると、 JavaScriptからクッキーの読み出しを禁止することができます。
<?php setcookie("email", "example@gmail.com", time()+3600, "/", "localhost", FALSE, TRUE); // HttpOnly: True ?> <body> <?php echo $_GET['keyword']; ?> </body>
TRACEメソッドの禁止
Http Onlyをするだけは、TRACEメソッドとXMLHttpRequestを組み合わせた攻撃に耐えることはできません。
現在のブラウザでは、XMLHttpRequestからTRACEメソッドを実行することはできないようですがApacheを利用する場合、
TraceEnable Off
の設定をしておくといいでしょう。
また、NginxはデフォルトでTRACEメソッドを許可していません。
エスケープ
二つの対策方法は、重要な情報にアクセスできないという制限をしたのみで根本的な問題解決になっていません。
XSSは、HTMLやJavaScriptを判別することなく利用していることが原因で起こってしまう脆弱性でした。
HTMLとJavaScriptをただの文字列にして解釈してやれば問題は解決します。
そのためには、HTMLやJavaScriptと解釈してしまう<
などを文字実体参照に置換すればいいです。
PHPの場合、htmlspecialchars
を利用します。
エスケープとサニタイズは違うので興味がある調べてみて下さい。
まとめ
XSS対策には、特殊文字をエスケープする
参考文献
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
- 作者:徳丸 浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/06/21
- メディア: 単行本