SlideShare a Scribd company logo
クロスサイトスクリプティング再入門
HASHコンサルティング株式会社
徳丸 浩
twitter id: @ockeghem
XSS脆弱なスクリプトの例
Copyright © 2013 HASH Consulting Corp. 2
<body><?php
echo $_GET['p'];
?></body>
値を「そのまま」表示
p=<script>alert(document.cookie)</script> で参照
なにか、問題でも?
Copyright © 2013 HASH Consulting Corp. 3
典型的なXSSサンプルに対する「素朴な疑問」
• クッキーの値がアラートで表示されても、特に危険性はないよ
うな気がする
• クッキーの値はブラウザのアドオンなどでも表示できるよね
• 任意のJavaScriptが実行されると言っても、ホームページ作
れば任意のJavaScriptが書けるし、見た人のブラウザで実行
されるよね…
Copyright © 2013 HASH Consulting Corp. 4
そもそもの疑問:JavaScriptは危険か?
• 実は、JavaScriptの実行自体は危険ではない
• Webは、未知の(ひょっとすると悪意のある?)サイトを訪問し
ても「悪いこと」が起きないように設計されている
• JavaScriptの「サンドボックス」による保護
– JavaScriptからローカルファイルにアクセスできない
– JavaScriptからクリップボードの値にアクセスできない
– ブラウザにはファイルアップロードの機能があるが、JavaScriptで
任意ファイルをアップロードはできない
– JavaScriptからプリンタに印刷することはできない(印刷ダイアログ
を表示することはできる)
Copyright © 2013 HASH Consulting Corp. 5
では、他のWebサイト上の「個人情報」
にはアクセスできないの?
Copyright © 2013 HASH Consulting Corp. 6
できない
Copyright © 2013 HASH Consulting Corp. 7
ここで、
「タブブラウザは安全なのか」問題
Copyright © 2013 HASH Consulting Corp. 8
タブブラウザに秘密情報のある光景
Copyright © 2013 HASH Consulting Corp. 9
うっかり、罠の仕掛
けてあるページを開
いたら、Gmailの内
容を読み取られな
いのか?
ワナのサイト
試してみよう!
Copyright © 2013 HASH Consulting Corp. 10
Gmailを別タブに開いてHTMLを読み出す罠
Copyright © 2013 HASH Consulting Corp. 11
<html>
<head>
<script>
var newWin = window.open(
'https://mail.google.com/mail/u/0/#inbox', 'subwin');
setTimeout(function() {
alert(newWin.document.documentElement.innerHTML);
}, 3000);
</script>
</head>
<body>
こんにちは
</body>
</html>
新しいWindowを開
いて、そこにGmail
を表示させる
Gmailのロードを待っ
て(3秒想定)、Gmail
のHTMLを表示
別Windowのdocumentにアクセスできない…
Copyright © 2013 HASH Consulting Corp. 12
Error: Permission denied to
access property 'document'
同じドメインだとdocumentにアクセスできる
Copyright © 2013 HASH Consulting Corp. 13
同じドメイン?
Copyright © 2013 HASH Consulting Corp. 14
正確にはドメインではなく ”オリジン”
Copyright © 2013 HASH Consulting Corp. 15
同一生成元ポリシー(Same-Origin Policy; SOP)とは
• オリジン = スキーム、ホスト、ポート番号の組み合わせ
• これらがすべて同じ場合、同一生成元(Same Origin)であると
いう
– http と https は異なるスキーム すなわち別オリジンとなる
• JavaScriptによるプロパティへのアクセス等は同一生成元に
対してのみ許可される
• XMLHttpRequestによるオブジェクトアクセスは、同一生成元
の場合無条件に許可される
– 異なる生成元に対するアクセスは、CORS(Cross-Origin
Resource Sharing)により可能
Copyright © 2013 HASH Consulting Corp. 16
SOPによる保護
Copyright © 2013 HASH Consulting Corp. 17
evil.example.com shop.example.jp
邪悪なサイト 正規サイト
個人情報
個人情報
ワナ 個人情報
ワナ 個人情報
XMLHttpRequest
JavaScript
JavaScript
Cookie
XSSによるJavaScripの注入
Copyright © 2013 HASH Consulting Corp. 18
evil.example.com shop.example.jp
邪悪なサイト 正規サイト(XSS脆弱)
ワナ 脆弱なページ
ワナ
JavaScript
JavaScript
脆弱なページ
JavaScript
JavaScript
①
④
③
②
XSSにより注入されたJSはSOPの保護を回避する
Copyright © 2013 HASH Consulting Corp. 19
evil.example.com shop.example.jp
邪悪なサイト 正規サイト
個人情報
ワナ
ワナ 個人情報
XMLHttpRequest
JavaScript
JavaScript
個人情報 Cookie
同一オリジン
なので、個人
情報等にア
クセス可
iframeを用いたワナのイメージ
Copyright © 2013 HASH Consulting Corp. 20
マル秘激安お得情報!!!
JavaScript
個人情報あり個人情報なし
正規サイトワナサイトと同一オリジン
http://very.evil-site.biz/
XSSによる個人情報アクセス
Copyright © 2013 HASH Consulting Corp. 21
マル秘激安お得情報!!!
http://very.evil-site.biz/
JavaScript
個人情報
正規サイト
JavaScript
注入
なぜJavaScriptを注入されるか?
Copyright © 2013 HASH Consulting Corp. 22
要素内容の場合
Copyright © 2013 HASH Consulting Corp. 23
<div>○○○○○○</div>
要素内容の終端マークは <
< を用いて要素内容を終わらせスクリプトを注入!
<div>○○○○○○<script>alert(1)</script></div>
対策は < を &lt; にエスケープする
& → &amp; エスケープも必須
通常は、 < > & をエスケープしますね
属性値の場合
Copyright © 2013 HASH Consulting Corp. 24
<input value="○○○○○○">
属性値の終端マークは "
" を用いてスクリプトを注入!
<input value="○○○○○○"><script>alert(1)</script>">
対策は " を &quot; にエスケープする
& → &amp; エスケープも必須
通常は、 < > & " をエスケープしますね
JavaScriptの場合
Copyright © 2013 HASH Consulting Corp. 25
init("○○○○○○");
文字列リテラルの終端マークは "
" を用いてスクリプトを注入!
init("○○○○○○");alert(document.cookie);//");
対策は " を ¥" にエスケープする(&quot;ではない)
¥ → ¥¥ エスケープも必須
属性値に書く場合は上記をさらにHTMLエスケープする
これで、おk?
Copyright © 2013 HASH Consulting Corp. 26
No! XSSは色々ややこしい
Copyright © 2013 HASH Consulting Corp. 27
参考文献(1)
Copyright © 2013 HASH Consulting Corp. 28
XSSの基礎を説明して
いますが、DOM base
XSSやAjaxに関する説
明はあまりありません
参考文献(2)
29
http://www.ipa.go.jp/about/technicalwatch/20130129.html
DOM base XSSに関
する体系的な説明とし
て貴重な参考資料です
参考文献(3)
Copyright © 2013 HASH Consulting Corp. 30
ブラウザセキュリティの
「面倒くささ」について、
逃げずに丹念に説明し
ています。上級者およ
び上級者を目指す方向
け
まとめ
• ブラウザには、サンドボックス、同一生成元ポリシー(SOP)などの
保護機能がある
• SOPの保護機能により、正規サイトと「怪しいサイト」はアクセスが
遮断されている
• XSSは、SOPの保護機能の元で、正規サイトの情報に、「怪しいサ
イト」からアクセスできる(これはアプリケーションの脆弱性)
• XSSがあると、ワナサイトを閲覧した利用者の個人情報が漏洩
– あるいは「なりすまし犯行予告」の書き込みをさせることも…
• XSS対策の基本は、「終端」となる記号の文脈に応じたエスケープ
• でも、色々ややこしいので参考文献で勉強を
• みなさん、よく言っておきますが、ウェブアプリの脆弱性の中で、
XSSが一番難しいですよ!
Copyright © 2013 HASH Consulting Corp. 31

More Related Content

XSS再入門