Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XSS再入門

74,316 views

Published on

XSSの初心者向け説明です。初心者向けだけど、きっちり理解したい方向け…

Published in: Technology

XSS再入門

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

×