SlideShare a Scribd company logo
1 of 61
Download to read offline
今さらきけないXSS
杉浦颯太 (sugiuras)
XSSのお話します
対象者
• XSSを知らない
• 聞いたことくらいはあるけど詳しくはしらない
• XSS?エスケープしとけばいいんでしょ?
• 脅威も概要も知ってるけどどう対策すればいいか想
像がつかない
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
申し訳程度の自己紹介
• 杉浦 颯太(すぎうら そうた)
• 研修なう
• 敬語できねぇ
• PDCAとか難しい
• スーツ息苦し(ry
• Twitter / GitHub : @sota1235
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
XSS、ご存じですか?
XSS is..
• XSS = Cross Site Scripting
• Webページ上で任意のスクリプトを実行できてし
まう脆弱性
• JavaScriptが流行り始めるとともに無視できなく
なってきた厄介なやつ
俺「え、別に問題なくね?」
問題大有りなんです
XSS is..
• Webページ上で任意のスクリプトを実行できてし
まう脆弱性
→つまりJavaScriptでできることは何でもできる
JSでできること
• ページの書き換え
• Cookieの読み出し
• Ajax
JSでできること
• ページの書き換え
→ ページ改竄による偽ページ
• Cookieの読み出し
→ ユーザ情報の盗難
• Ajax
→ 攻撃者へのデータ送信が可能
JSでできないこと
• PC上のリソースが脅かされる危険はない
• サンドボックスによりPC上のリソースは守られ
ている
• 同時に開いてる他タブの情報が取られることもない
• SOP(Same Origin Policy)によりブロックされる
とはいえ
• 脅威であることに変わりなし
• 後述しますが、フロントで攻撃が完結してしまうこ
ともあるため、決して油断できない脆弱性です
XSS is Evil( ꒪⌓꒪)
• JSの可能性 = 攻撃者の可能性
• XSS、ダメ、ゼッタイ
• サービスの致命的なセキュリティホールとなる
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
僕たちは守る側の人間
とはいえ
攻撃手法を知らないと守れない
サービスを守るために…
• 敵の攻撃方法を知って堅牢なサービスを作り隊
• セキュアでイケてるwebサービス作り隊
• 攻撃側の手法や種類を学んでみましょう
XSS三兄弟
• XSSは大きく分けて3種類存在する
XSS三兄弟
• 反射型XSS(Reflected XSS)
• 蓄積型XSS(Stored XSS)
• DOM Based XSS
反射型XSS(Reflected XSS)
• ユーザーの入力値をサーバが動的に出力することに
より発生する
• 発生原因の大半はエスケープ忘れ
• シングルクオートやダブルクオートでhtmlタグを破
壊し、スクリプトを混入する
蓄積型XSS(Stored XSS)
• ユーザーの入力値をDBに貯めこむことにより
• 発生原因の大半はエスケープ忘れ
• シングルクオートやダブルクオートでhtmlタグを破
壊し、スクリプトを混入する
DOM Based XSS
• JSで動的にHTMLを操作することにより発生
• 最近、こいつが急増してる
• これも原因はエスケープ忘れ
• 実装によってはサーバ側のログが一切残らず非常に
気づきにくい
攻撃者はありとあらゆる方法でXSSを試みます
imgタグ
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
<IMG SRC=javascript:alert(&quot;XSS&quot;)>
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<IMG
SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
&#39;&#88;&#83;&#83;&#39;&#41;>
<IMG
SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000
116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#000008
3&#0000083&#0000039&#0000041>
<IMG
SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x
27&#x58&#x53&#x53&#x27&#x29>
<IMG SRC="jav ascript:alert('XSS');">
<IMG SRC="jav&#x09;ascript:alert('XSS');">
<IMG SRC="jav&#x0A;ascript:alert('XSS');">
<IMG SRC="jav&#x0D;ascript:alert('XSS');">
Data URI Scheme
• <iframe src="data:text/
html,<script>alert('XSS')</script>"></iframe>
• <object data= data:text/
html,<script>alert('XSS2')</script>"></object>
• <iframe src='data:text/
html;base64,PHNjcmlwdD5hbGVydCgnWFNTJ
yk8L3NjcmlwdD4='></iframe>
他にもいっぱい
• JavaScript Scheme
• CSS Expression ( IE7)
• UTF-7
• XML
• 詳しくはGoogle先生
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
僕たちは守る側の人間
• どうすればXSSはなくなるのだろう?
防御法 心がけ編
心がけ編:エスケープ処理
• ユーザーの入力値による動的出力は必要最低限に留める
• 出力する場合は必ずエスケープする
• PHPならhtmlspecialchars()
• 最近のFWなら対策されてたりする
• ちなみにLaravelのBladeは中括弧を3重にすることでエス
ケープしてくれる
• とにかくエスケープ!!!!!!!!!!!!
心がけ編:DOM操作
• DOMの動的出力を行わない
• URLのパラメータでHTMLタグ生成とかダメ
• 特にdocument.hashは理由がない限り使わない
• 必ずしもユーザは優良ではないことを念頭に置いて
開発しましょう
防御法 Cookie
Cookie編
• Cookieにhttp-only属性をつける
• JSからCookieを読み込ませないようにする
• XSSによるCookie盗難の可能性はほぼ0になる
• このヘッダを付けない理由がないのであればつけ
るべき
• Set-Cookie: HttpOnly;
防御法 CSP
CSP #とは
• CSP = Content Security Policy
• このヘッダの着いたリソースにはいくつかの制限が
課される
• HTTPのヘッダフィールドの一種
CSP #とは
• リソースの読み込み元を制限する
• デフォルトだとJSが制限されている
• eval禁止
• インラインスクリプト禁止
JS制限
• eval($(‘#text’).val());
→ 禁止!
• <script>alert(‘XSS’);</script>
→ 禁止!
CSP 動作例
CSP 使い方
• 使い方はHTTPヘッダを追加するだけ
• Content-Security-Policy: $policy
• ブラウザ、サーバどちらかが対応していない場合、
SOPが自動で適用される
CSP 使用例
• 使用例
• Content-Security-Policy: default-src ‘src’
• 読み込み元のリソースを配信先に設定
• eval禁止、インラインスクリプト禁止
• その他、細かくpolicyを設定することが可能
CSPまとめ
• CSPとはJSやリソースの読み込み元に制限をかける
HTTPヘッダフィールド
• 万が一XSSがあった時、攻撃者に大きな制限をか
けることができる
• ブラウザ、サーバどちらかが対応していない場合、
SOPが自動で適用される
• ほぼすべてのブラウザで対応している
CSPまとめ
• ほぼすべてのブラウザで対応している
安定のIE
諦めるしか無いのか…?
そんなこともあろうかと
防御法 X-XSS-Protection編
XSSフィルター
• IE8以降にはXSSフィルターという機能が存在する
• 有害なスクリプトを判定し、無効化する機構
• 不自然なインラインスクリプト等実行しなくなる
• HTTPヘッダでX-XSS-Protection属性に1を指
定することで有効化できる
XSSフィルター
• IE以外のブラウザでもXSS防止の機構は存在する
• Chrome, Safari
→XSS Auditor
• FireFox
→NoScript(アドオン)
• ブラウザにより仕様が異なることを念頭に対策しましょう
アジェンダ
1. 自己紹介
2. XSS is
3. 攻撃者視点
4. 防御者視点
5. まとめ
まとめ XSS is
• XSSとは任意のJavaScriptが実行できる脆弱性
• JSで可能なこと全てを攻撃者に許してしまう
• JSでできないことはできない
• 攻撃手法は主に3種類
• 反射型XSS
• 蓄積型XSS
• DOM Based XSS
まとめ 防御策
• HTMLエスケープ処理
• CookieをJSで処理しない
• CSPの活用
• ブラウザごとのXSSフィルターの活用
余談
• XSSにとても有効なCSPですが、去年にCSP Lv.2
なるものの最終草案が公開されました
• かなりイケてる感じなのでぜひ一度チェックしてみ
てください
参考
• IPAテクニカルウォッチ「DOM Based XSS」に関するレポート
• https://www.ipa.go.jp/files/000024729.pdf
• Slide Share : CSP Lv.2の話
• http://www.slideshare.net/yagihashoo/csp-lv2
• MDN : Content Security Policy
• https://developer.mozilla.org/ja/docs/Security/CSP_
%28Content_Security_Policy%29
参考
• 1分でわかる「X-ナントカ」HTTPレスポンスヘッダ
• http://d.hatena.ne.jp/hasegawayosuke/comment/20110107
• 徳丸浩の日記
• http://blog.tokumaru.org/
• XSSに限らず様々な脆弱性の記事があがっています
• キャッチアップしておくとPHPでの脆弱性感度は間違いなくあがります
• OWASP Top 10 - 2013
• https://www.owasp.org/images/7/79/OWASP_Top_10_2013_JPN.pdf
おまけ
• XSS Game
https://xss-game.appspot.com/
Googleが出してるXSSしてくれYO!ってページ。
ゲーム感覚で一通りの攻撃手法が学べるのでぜひ
おまけ
以上。

More Related Content

What's hot

SQLインジェクション再考
SQLインジェクション再考SQLインジェクション再考
SQLインジェクション再考Hiroshi Tokumaru
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみたzaki4649
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティHiroshi Tokumaru
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)Hiroshi Tokumaru
 
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)abend_cve_9999_0001
 
セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)kazkiti
 
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)Sen Ueno
 
バグハンターの哀しみ
バグハンターの哀しみバグハンターの哀しみ
バグハンターの哀しみMasato Kinugawa
 
Burp Suite 2.0触ってみた
Burp Suite 2.0触ってみたBurp Suite 2.0触ってみた
Burp Suite 2.0触ってみたYu Iwama
 
セキュリティの都市伝説を暴く
セキュリティの都市伝説を暴くセキュリティの都市伝説を暴く
セキュリティの都市伝説を暴くHiroshi Tokumaru
 
CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!kazkiti
 
なぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのかなぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのかSen Ueno
 
ウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説するウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説するHiroshi Tokumaru
 
とある診断員とAWS
とある診断員とAWSとある診断員とAWS
とある診断員とAWSzaki4649
 
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010自分でできるWebアプリケーション脆弱性診断 - デブサミ2010
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010Sen Ueno
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
katagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 cryptokatagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 cryptotrmr
 

What's hot (20)

Proxy War
Proxy WarProxy War
Proxy War
 
SQLインジェクション再考
SQLインジェクション再考SQLインジェクション再考
SQLインジェクション再考
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
 
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
 
セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)
 
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
今夜わかるWebアプリケーション脆弱性診断 (OWASP Day 758 / 2018)
 
バグハンターの哀しみ
バグハンターの哀しみバグハンターの哀しみ
バグハンターの哀しみ
 
Burp Suite 2.0触ってみた
Burp Suite 2.0触ってみたBurp Suite 2.0触ってみた
Burp Suite 2.0触ってみた
 
セキュリティの都市伝説を暴く
セキュリティの都市伝説を暴くセキュリティの都市伝説を暴く
セキュリティの都市伝説を暴く
 
CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!
 
なぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのかなぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのか
 
ウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説するウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説する
 
とある診断員とAWS
とある診断員とAWSとある診断員とAWS
とある診断員とAWS
 
CSP Lv.2の話
CSP Lv.2の話CSP Lv.2の話
CSP Lv.2の話
 
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010自分でできるWebアプリケーション脆弱性診断 - デブサミ2010
自分でできるWebアプリケーション脆弱性診断 - デブサミ2010
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
katagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 cryptokatagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 crypto
 

More from Sota Sugiura

「データベース実践入門」から学ぶリレーショナルモデル
「データベース実践入門」から学ぶリレーショナルモデル「データベース実践入門」から学ぶリレーショナルモデル
「データベース実践入門」から学ぶリレーショナルモデルSota Sugiura
 
TechCrunchTokyo Hackathon 2015
TechCrunchTokyo Hackathon 2015TechCrunchTokyo Hackathon 2015
TechCrunchTokyo Hackathon 2015Sota Sugiura
 
コミットメッセージの話
コミットメッセージの話コミットメッセージの話
コミットメッセージの話Sota Sugiura
 
各ブラウザでの均等割り付け比較
各ブラウザでの均等割り付け比較各ブラウザでの均等割り付け比較
各ブラウザでの均等割り付け比較Sota Sugiura
 
GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話Sota Sugiura
 
Promiseでコールバック地獄から解放された話
Promiseでコールバック地獄から解放された話Promiseでコールバック地獄から解放された話
Promiseでコールバック地獄から解放された話Sota Sugiura
 
Web Audio API 入門
Web Audio API 入門Web Audio API 入門
Web Audio API 入門Sota Sugiura
 

More from Sota Sugiura (9)

「データベース実践入門」から学ぶリレーショナルモデル
「データベース実践入門」から学ぶリレーショナルモデル「データベース実践入門」から学ぶリレーショナルモデル
「データベース実践入門」から学ぶリレーショナルモデル
 
TechCrunchTokyo Hackathon 2015
TechCrunchTokyo Hackathon 2015TechCrunchTokyo Hackathon 2015
TechCrunchTokyo Hackathon 2015
 
コミットメッセージの話
コミットメッセージの話コミットメッセージの話
コミットメッセージの話
 
HTTP2入門
HTTP2入門HTTP2入門
HTTP2入門
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
各ブラウザでの均等割り付け比較
各ブラウザでの均等割り付け比較各ブラウザでの均等割り付け比較
各ブラウザでの均等割り付け比較
 
GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話GitHubにおける開発フローについてのお話
GitHubにおける開発フローについてのお話
 
Promiseでコールバック地獄から解放された話
Promiseでコールバック地獄から解放された話Promiseでコールバック地獄から解放された話
Promiseでコールバック地獄から解放された話
 
Web Audio API 入門
Web Audio API 入門Web Audio API 入門
Web Audio API 入門
 

今さら聞けないXSS