Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai...
Transcript of Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai...
![Page 1: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/1.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
OWASP Kansai Chapter
Yosuke HASEGAWA
![Page 2: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/2.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
はせがわようすけ
▸OWASP Kansai チャプターリーダー
▸OWASP Japan アドバイザリボードメンバー
▸株式会社セキュアスカイ・テクノロジー常勤技術顧問
▸CODE BLUE Security Conference Review board member
▸セキュリティキャンプ講師 (Webクラス/高レイヤートラック)
▸http://utf-8.jp/
▸Author of jjencode and aaencode
![Page 3: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/3.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸自分たちの直面するWebセキュリティの問題を自分たちの手で解決したい
▸日本で2番目のOWASPローカルチャプター
▸2014年3月から活動開始
▸3か月に1回のChapter Meeting (勉強会)を開催
‣ Webセキュリティの悩み事を気楽に相談し情報共有できる場
‣スキル、役職、業種、国籍、性別、年齢関係なく、遠慮なくお越しください
![Page 4: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/4.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 5: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/5.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 6: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/6.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
JavaScriptに関連するセキュリティ問題
▸JavaScriptによるオープンリダイレクタ
▸DOM-based XSS
▸CORSの設定不備
▸クライアントサイドでの不適切なデータ保存
▸その他DOM APIの不適切な使用
![Page 7: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/7.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
JavaScriptに関連するセキュリティ問題
▸JavaScriptによるオープンリダイレクタ
▸DOM-based XSS
▸CORSの設定不備
▸クライアントサイドでの不適切なデータ保存
▸その他DOM APIの不適切な使用
脆弱性の発生が圧倒的に多い
![Page 8: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/8.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 9: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/9.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対象
▸動的にHTMLを生成するWebアプリ
▸問題
▸攻撃者が用意したスクリプトがHTML内に挿入される
▸対策
▸HTMLを生成する時点でエスケープ
▸URLはhttp/httpsのみに限定する
![Page 10: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/10.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
http://shop.example.jp/?item="><script>...
GET /?item="><script>...
<input type="text"value=""><script>...
HTML生成時にエスケープされていない
XSSの被害JSでてきることは何でも。 偽情報の表示 Cookie情報の漏えい 機密情報の漏えい その他
被害者 攻撃者
Webサイト
![Page 11: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/11.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対象
▸動的にHTMLを生成するWebアプリ
▸問題
▸攻撃者が用意したスクリプトがHTML内に挿入される
▸対策
▸HTMLを生成する時点でエスケープ
▸URLはhttp/httpsのみに限定する
![Page 12: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/12.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸HTMLを生成する時点でエスケープする
<html><>
< → <> → >" → "' → '& → &
データ処理
ユーザHTML生成
![Page 13: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/13.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸URLはhttp/httpsのみに限定する
▸src,hrefなどの属性値の動的生成
▸URLの動的生成時はhttp,https限定とする
<a href="javascript:alert(1)"><iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
![Page 14: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/14.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 15: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/15.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸反射型XSS
▸ユーザーからの送信内容をそのまま表示
▸お問い合わせフォーム、検索フォームなど
▸XSSフィルタである程度防御
▸蓄積型XSS
▸攻撃者のスクリプトをサーバ内で保持
▸掲示板、Webメールなど
![Page 16: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/16.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸反射型XSS
▸ユーザーからの送信内容をそのまま表示
▸お問い合わせフォーム、検索フォームなど
▸XSSフィルタである程度防御
▸蓄積型XSS
▸攻撃者のスクリプトをサーバ内で保持
▸掲示板、Webメールなど
GET /?item="><script>...
<input type="text" value=""><script>...
ユーザー
Webアプリ
![Page 17: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/17.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸リクエストとレスポンスに同じ内容が含まれる
GET /?<script>alert(1)</script> HTTP/1.1Host: example.jp
HTTP/1.1 200 OKContent-Type: text/hthml; charst=utf-8
<html><body><script>alert(1)</script></body>
![Page 18: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/18.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸リクエストとレスポンスに同じ内容が含まれる
GET /?<script>alert(1)</script> HTTP/1.1Host: example.jp
HTTP/1.1 200 OKContent-Type: text/hthml; charst=utf-8
<html><body><script>alert(1)</script></body>
![Page 19: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/19.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸反射型XSS
▸ユーザーからの送信内容をそのまま表示
▸お問い合わせフォーム、検索フォームなど
▸XSSフィルタである程度防御
▸蓄積型XSS
▸攻撃者のスクリプトをサーバ内で保持
▸掲示板、Webメールなど
Subject: Hello
<script>...
Subject: Hello
<script>...
ユーザー
Webアプリ 攻撃者
![Page 20: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/20.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸サーバに攻撃者のスクリプトが保存される
▸攻撃の永続化
▸攻撃と被害に時間差
▸反射型より影響が大きい
![Page 21: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/21.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸反射型XSS
▸ユーザーからの送信内容をそのまま表示
▸お問い合わせフォーム、検索フォームなど
▸XSSフィルタである程度防御
▸蓄積型XSS
▸攻撃者のスクリプトをサーバ内で保持
▸掲示板、Webメールなど
![Page 22: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/22.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸反射型XSS
▸ユーザーからの送信内容をそのまま表示
▸お問い合わせフォーム、検索フォームなど
▸XSSフィルタである程度防御
▸蓄積型XSS
▸攻撃者のスクリプトをサーバ内で保持
▸掲示板、Webメールなど
▸DOM-based XSS
▸JavaScriptが引き起こすXSS
▸サーバ側のHTML生成では問題なし
![Page 23: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/23.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 24: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/24.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸JavaScriptが引き起こすXSS
▸サーバ側のHTML生成時には問題なし
▸JavaScriptによるHTMLレンダリング時の問題
▸JavaScriptの利用に合わせて増加
//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 25: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/25.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ブラウザのXSSフィルタを通過することが多い
▸location.hash内などの実行コードはサーバ側にログが残らない//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 26: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/26.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸JavaScriptが実行されるまでXSSの存在がわからない
▸既存の検査ツールでは検出不可な場合も
▸生成されるHTML自体には問題はない
▸リクエスト/レスポンスの監視だけでは見つからない
<xss>
<XSS>
<XSS>
検査ツール
ブラウザ検査対象アプリ
![Page 27: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/27.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸静的コンテンツのみでもXSSする可能性
▸動的にHTMLを生成する「Webアプリケーション」ではなく、*.htmlしか提供してなくてもXSSのある可能性がある
ブラウザ 静的なWebサーバ
<html><script>document.write( location.hash.substring(1) );</script>
![Page 28: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/28.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸攻撃者はJavaScriptを読むことができる
▸じっくり読んで脆弱性を探すことが可能
▸脆弱性の有無を確認するための試行リクエストは不要
▸「一撃必殺」でXSSを成功させる
![Page 29: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/29.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
IE10, XSSフィルターを通過
![Page 30: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/30.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸圧倒的に不利な状況
▸JavaScriptコード量の大幅な増加
▸XSSフィルタを通過することがある
▸サーバのログに残らないことがある
▸これまでの検査方法では見つからない
▸静的コンテンツでもXSSする
▸攻撃者は時間をかけてXSSを探す
▸開発時点で作りこまない必要性
![Page 31: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/31.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 32: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/32.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸原因
▸攻撃者の与えた文字列が
▸JavaScript上のコードのどこかで
▸文字列からHTMLを生成あるいは JavaScriptコードとして実行される
//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 33: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/33.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸原因
▸攻撃者の与えた文字列が
▸JavaScript上のコードのどこかで
▸文字列からHTMLを生成あるいは JavaScriptコードとして実行される
//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 34: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/34.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸原因
▸攻撃者の与えた文字列が
▸JavaScript上のコードのどこかで
▸文字列からHTMLを生成あるいは JavaScriptコードとして実行される
//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 35: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/35.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸原因
▸攻撃者の与えた文字列が
▸JavaScript上のコードのどこかで
▸文字列からHTMLを生成あるいは JavaScriptコードとして実行される
//http://example.jp/#<img src=0 onerror=alert(1)><html><script>
document.write( location.hash.substring(1) );</script></html>
![Page 36: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/36.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ソース
▸攻撃者の与えた文字列の含まれる箇所
▸シンク
▸文字列からHTMLを生成したりコードとして実行する部分
ソース 処理 シンク
![Page 37: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/37.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ソース
▸攻撃者の与えた文字列の含まれる箇所
▸シンク
▸文字列からHTMLを生成したりコードとして実行する部分
ソース 処理 シンク
location.hash
location.search
document.referrer
XHR etc...
![Page 38: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/38.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ソース
▸攻撃者の与えた文字列の含まれる箇所
▸シンク
▸文字列からHTMLを生成したりコードとして実行する部分
ソース 処理 シンク
location.hash
location.search
document.referrer
XHR etc...
innerHTML
document.write
eval
location.href
etc...
![Page 39: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/39.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対策
▸HTML生成時にエスケープ/適切なDOM操作
▸URLの生成時はhttp(s)に限定
▸使用しているライブラリの更新
▸サーバ側でのXSS対策と同じ
▸これまでサーバ上で行っていたことをJavaScript上で行う
![Page 40: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/40.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対策
▸HTML生成時にエスケープ/適切なDOM操作
▸URLの生成時はhttp(s)に限定
▸使用しているライブラリの更新
▸サーバ側でのXSS対策と同じ
▸これまでサーバ上で行っていたことをJavaScript上で行う
![Page 41: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/41.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸HTML生成時に適切なDOM操作
▸JavaScriptでレンダリングされる直前
▸「エスケープ」ではなく適切なDOM操作関数// bad codedocument.write( location.hash.substring( 1 ) );
var text = document.createTextNode( location.hash.substring( 1 )
);document.body.appendChild( text );
![Page 42: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/42.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸テキストノードだけでなく属性値も// bad codevar text = "...."; //変数textは攻撃者がコントロール可能
form.innerHTML = '<input type="text" name="key" value="' + text + '">';
var text = "...."; //変数textは攻撃者がコントロール可能
var elm = document.createElement( "input" );elm.setAttribute( "type", "text" );elm.setAttribute( "name", "key" );elm.setAttribute( "value", text ); // 属性値を設定する
form.appendChild( elm );
<input ... value=""><script>....</script "">"><script>....</script "
![Page 43: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/43.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸HTML生成時に適切なDOM操作関数
▸テキストノードの生成createTextNode, innerText, textContent
▸属性の設定setAttribute
▸シンクとなるAPIを不用意に使用しない
▸innerHTML, document.write, ...
![Page 44: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/44.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対策
▸HTML生成時にエスケープ/適切なDOM操作
▸URLの生成時はhttp(s)に限定
▸使用しているライブラリの更新
▸サーバ側でのXSS対策と同じ
▸これまでサーバ上で行っていたことをJavaScript上で行う
![Page 45: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/45.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸URLの生成時はhttp(s)に限定
// urlが「http://」「https://」で始まる場合のみに限定
if( url.match( /^https?:¥/¥// ) ){var elm = document.getElementById( "link" );elm.setAttribute( "href", url );
}
//bad code// <a id="link">リンク</a>var url = "...."; //変数textは攻撃者がコントロール可能
var elm = document.getElementById( "link" );elm.setAttribute( "href", url );
<a id="link" href=" javascript:alert(1) ">リンク</a>javascript:alert(1)
![Page 46: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/46.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸URLの生成時はhttp(s)に限定
▸他のスキームが入り込まないように。javascript:, vbscript:, data:,
▸<a>要素だけでなくlocationオブジェクトの操作時にも注意
// bad codevar url = "javascript:alert(1)";location.href = url; // XSSlocation.assign( url ); // XSS
![Page 47: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/47.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対策
▸HTML生成時にエスケープ/適切なDOM操作
▸URLの生成時はhttp(s)に限定
▸使用しているライブラリの更新
▸サーバ側でのXSS対策と同じ
▸これまでサーバ上で行っていたことをJavaScript上で行う
![Page 48: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/48.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸使用してるライブラリの更新
▸JavaScriptライブラリの脆弱性対応
▸使用しているJSライブラリの更新を把握すること
▸サーバ側のミドルウェア等の運用と同じ
Masato Kinugawa Security Blog: jQuery Mobile 1.2 Beta未満は読み込んでいるだけでXSS脆弱性を作りますhttp://masatokinugawa.l0.cm/2012/09/jquery-mobile-location.href-xss.html
![Page 49: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/49.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸対策
▸HTML生成時にエスケープ/適切なDOM操作
▸URLの生成時はhttp(s)に限定
▸使用しているライブラリの更新
▸サーバ側でのXSS対策と同じ
▸これまでサーバ上で行っていたことをJavaScript上で行う
![Page 50: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/50.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 51: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/51.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸DbXSS対策の原則(再掲)
▸「 HTML生成時にエスケープ/適切なDOM操作」
▸URLの生成時はhttp(s)に限定
![Page 52: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/52.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸DbXSS対策の原則(再掲)
▸「 HTML生成時にエスケープ/適切なDOM操作」
▸URLの生成時はhttp(s)に限定
▸原則だけでは立ちいかない現実
▸一部のHTMLタグは許容したい
▸相対URLも使いたい
![Page 53: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/53.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸装飾やリンクのためのHTMLタグ
▸
▸相対URLも使いたい<a href="/next-page">next</a> // 相対リンクをJSでも生成したい
var s = "**注意** 雨天時は[こちら](http://example.jp/)です。";
<b>注意</b> 雨天時は<a href="http://example.jp/">こちら</a>です。
![Page 54: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/54.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸特定書式の繰り返し。テンプレート的な用途
▸ユーザーによる自由な入力
[{ "date" : "2015/09/10","url" : "http://example.jp/news","title" : "新製品発表のお知らせ"
},{ "date" : "2015/09/19","url" : "http://example.jp/owasp","title" : "Local Chapter Meeing開催"
}]
<div><span>2015/09/10</span><a href="http://example.jp/news">
新製品発表のお知らせ</a>
</div><div>
<span>2015/09/19</span><a href="http://example.jp/owasp">
Local Chapter Meeting開催</a>
</div>
var markdown = "**注意** 雨天時は[こちら](http://example.jp/)です。";
<b>注意</b> 雨天時は<a href="http://example.jp/">こちら</a>です。
![Page 55: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/55.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸特定書式の繰り返し。テンプレート的な用途
▸ユーザーによる自由な入力
[{ "date" : "2015/09/10","url" : "http://example.jp/news","title" : "新製品発表のお知らせ"
},{ "date" : "2015/09/19","url" : "http://example.jp/owasp","title" : "Local Chapter Meeing開催"
}]
<div><span>2015/09/10</span><a href="http://example.jp/news">
新製品発表のお知らせ</a>
</div><div>
<span>2015/09/19</span><a href="http://example.jp/owasp">
Local Chapter Meeting開催</a>
</div>
var markdown = "**注意** 雨天時は[こちら](http://example.jp/)です。";
<b>注意</b> 雨天時は<a href="http://example.jp/">こちら</a>です。
![Page 56: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/56.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸特定書式の繰り返し。テンプレート的な用途
▸HTMLの構造は固定
▸属性値やテキストノードの部分を動的に生成
[{ "date" : "2015/09/10","url" : "http://example.jp/news","title" : "新製品発表のお知らせ"
},{ "date" : "2015/09/19","url" : "http://example.jp/owasp","title" : "Local Chapter Meeing開催"
}]
<div><span>2015/09/10</span><a href="http://example.jp/news">
新製品発表のお知らせ</a>
</div><div>
<span>2015/09/19</span><a href="http://example.jp/owasp">
Local Chapter Meeting開催</a>
</div>
![Page 57: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/57.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸特定書式の繰り返し。テンプレート的な用途
▸自分でテンプレート処理を書く?// bad codefunction expandTemplate( template, json ){
var i, s, html = "";for( i = 0; i < friends.length; i++ ){
s = template.replace( /%(¥w+)%/g, function( s, param ){if( param === "date" ) return htmlEscape( json[ i ].date );else if( param === "url" ) return htmlEscape( json[ i ].url );else if( param === "title" ) return htmlEscape( json[ i ].title );else return "%" + param + "%";
} );html += s;
}return html;
}
elm.innerHTML = expandTemplate( '<div>' +'<span>%date%</span><a href="%url%">%title%</a>', json );
![Page 58: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/58.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸テンプレート処理を自分で書くのはやめるべき
▸汎用性に欠けるのに見通しの悪いコードが増える
▸細かな対策全てを自分でケアする必要がある
‣ テキストノードにエスケープが必要
‣ URLにjavascript:スキーム等が混入しないように注意がいる
![Page 59: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/59.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸JSのテンプレートエンジンライブラリの導入
▸MV*フレームワークの採用 (vue,knockoutなど)
▸各ライブラリの挙動を把握して使用すること
▸テキストノードへ出力するときにエスケープされるか(vueのv-textとv-htmlの違い等)
▸属性値にjavascript:スキーム等が設定された場合にどうなるか
![Page 60: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/60.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸特定書式の繰り返し。テンプレート的な用途
▸ユーザーによる自由な入力
[{ "date" : "2015/09/10","url" : "http://example.jp/news","title" : "新製品発表のお知らせ"
},{ "date" : "2015/09/19","url" : "http://example.jp/owasp","title" : "Local Chapter Meeing開催"
}]
<div><span>2015/09/10</span><a href="http://example.jp/news">
新製品発表のお知らせ</a>
</div><div>
<span>2015/09/19</span><a href="http://example.jp/owasp">
Local Chapter Meeting開催</a>
</div>
var markdown = "**注意** 雨天時は[こちら](http://example.jp/)です。";
<b>注意</b> 雨天時は<a href="http://example.jp/">こちら</a>です。
![Page 61: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/61.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のタグだけは許容したい
▸特定書式の繰り返し。テンプレート的な用途
▸ユーザーによる自由な入力
[{ "date" : "2015/09/10","url" : "http://example.jp/news","title" : "新製品発表のお知らせ"
},{ "date" : "2015/09/19","url" : "http://example.jp/owasp","title" : "Local Chapter Meeing開催"
}]
<div><span>2015/09/10</span><a href="http://example.jp/news">
新製品発表のお知らせ</a>
</div><div>
<span>2015/09/19</span><a href="http://example.jp/owasp">
Local Chapter Meeting開催</a>
</div>
var markdown = "**注意** 雨天時は[こちら](http://example.jp/)です。";
<b>注意</b> 雨天時は<a href="http://example.jp/">こちら</a>です。
![Page 62: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/62.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ユーザーによる自由な入力
▸HTML構造が事前に定義されていない
▸安全なタグや属性は許可、それ以外を禁止
▸Webメール
▸掲示板などのリッチエディット
▸markdown
![Page 63: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/63.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ユーザーによる自由な入力
▸安全なタグや属性だけ許可、それ以外を禁止
ユーザーWebアプリ
攻撃者
<div>こんにちは</div><script>alert(1)</script><img src=# onerror=alert(1)><s>取り消し線</s>
<div>こんにちは</div>
<img src=#><s>取り消し線</s>
![Page 64: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/64.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸危険そうな属性やタグを全て削除する?
// bad codefunction safeHtml( html ){return html.replace( /<script>/ig, "").replace( /onerror=/ig, "" ).replace( /onload=/ig, "" ) ...
}
var elm.innerHTML = safeHtml("<div>こんにちは</div>" +
"<script>alert(1)</script>" +"<img src=# onerror=alert(1)>" +"<s>取り消し線</s>"
);
![Page 65: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/65.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸危険そうな属性やタグを全て削除する?
▸このアプローチでは絶対に抜けが発生する
// bad codefunction safeHtml( html ){return html.replace( /<script>/ig, "").replace( /onerror=/ig, "" ).replace( /onload=/ig, "" ) ...
}
var elm.innerHTML = safeHtml("<s<script>cript>alert(1)</script>"
); // <script>alert(1)</script>
![Page 66: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/66.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸安全なタグ、要素だけでHTMLを組み立てなおす
▸安全なタグ、属性を事前に定めておく
▸文字列をHTMLとしてパースする
▸安全なタグ、属性のみでHTMLを再生成する
▸といったことを自分でやるのはしんどいので、ライブラリに任せる
![Page 67: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/67.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸安全なタグ、要素だけでHTMLを組み立てなおす
▸DOMPurifyhttps://github.com/cure53/DOMPurify<script src="purify.js"></script>....var html =
"<div>こんにちは</div>" +
"<script>alert(1)</script>" +"<img src=# onerror=alert(1)>" +"<s>取り消し線</s>";
elm.innerHTML = DOMPurify.sanitize( html );
<div>こんにちは</div>
<img src="#"><s>取り消し線</s>
![Page 68: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/68.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸相対URLも使いたい
// urlが「http://」「https://」で始まる場合に <a id="link">を設定function setLink( url ){if( url.match( /^https?:¥/¥// ) ){
var elm = document.getElementById( "link" );elm.setAttribute( "href", url );elm.textContent = url;
}}
setLink( "http://example.jp/" ); // oksetLink( "javascript:alert(1)" ); // ngsetLink( "/foo" ); // ???setLink( "foo" ); // ???
![Page 69: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/69.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸相対URLを絶対URLに正規化する
▸URLUtilsインターフェース
▸a要素で代用
// Chrome, Firefoxのみvar url = new URL( "/foo", location.href );console.log( url.href );
// IE向け
var a = document.createElement( "a" );a.setAttribute( "href", "/foo" );console.log( a.href );
![Page 70: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/70.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
function getAbsoluteUrl( url ){var elm = document.createElement( "a" );// hrefプロパティが絶対URLを返すかテストするelm.setAttribute( "href", "/test" );if( elm.href === "/test" ){
// IE6, IE7elm.setAttribute( "href", url );return elm.getAttribute( "href", 4 );
}else{elm.setAttribute( "href", url );return elm.href;
}}
function parseUrl( url ){try{
// URLコンストラクタが使用できる場合はそのまま使用するvar result = new URL( url );return result;
}catch( e ){
// URLコンストラクタが使用できない場合は<a>要素を使用するvar elm = document.createElement( "a" );// IEでは相対URLをhref属性に設定した場合にいくつかのプロパティが正しく// 取得できないため、いったん絶対URLに変換してからhref属性に設定するelm.setAttribute( "href", getAbsoluteUrl( url ) );var result = {
protocol: elm.protocol,host: elm.host,hostname: elm.hostname,port: elm.port,pathname: elm.pathname,search: elm.search,hash: elm.hash,href: elm.href,origin: elm.origin
};if( elm.protocol === "http:" ){
result.host = result.host.replace( /:80$/, "" );}else if( elm.protocol === "https:" ){
result.host = result.host.replace( /:443$/, "" );}if( result.origin === undefined ){
result.origin = result.protocol + "//" + result.host;}return result;
}}
![Page 71: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/71.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸相対URLを絶対URLに変換したのちにプロトコルを確認する
var target = parseUrl( "javascript:alert(1)" );if( target.protocol.match( /^https?:/ ) ){
/* http、httpsなURLなので処理する */}
![Page 72: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/72.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸DbXSS対策に自信がない。万が一に備えたい
▸DbXSSが発生しても被害が及ばないようにする
▸HTML5 iframe sandboxが利用可能
▸sandbox属性を付与することでJSの実行が禁止される
<iframe sandbox seamless style="border-width:0px" id="f"></iframe>
document.getElementById("f").srcdoc = "<div><img src=# onerror=alert(1)></div>";
![Page 73: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/73.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸一部のHTMLタグは許容したい
▸特定書式の繰り返しにはテンプレートライブラリやMV*フレームワークを用いる
‣ それらのエスケープ有無を把握すること
‣ リンクがhttp/httpsに限定されるかを確認すること
▸ユーザーによる自由なHTMLタグ入力を許容したい
▸DOMPurifyのようなライブラリを用いる
▸相対URLを使いたい
▸絶対URLへ変換したのちにプロトコルスキームを確認する
▸保険的対策
▸iframe sandboxの活用
![Page 74: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/74.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 75: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/75.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸スキャナで静的解析
▸AppScan (よく知らない)
▸スキャナで動的解析
▸DOMinatorPro (よく知らない)
▸JavaScriptのソースコードを読む
▸一番効果的?
▸無料!
▸攻撃者もできる
![Page 76: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/76.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ブラウザのデバッガでシンクの使用箇所を探す
▸innerHTML, locationなどが多い
▸シンクがコントロール可能か調べる
▸シンク→ソースへの経路を上っていく
▸実際に試す
![Page 77: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/77.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸ソースコードを読みながら探す
▸デバッグと同じ技術が要求される
▸開発者としての能力が要求される
▸難読化(minify)されているJSを読む能力
![Page 78: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/78.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
![Page 79: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/79.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
▸DOM-based XSSの脅威の増加
▸攻撃可能箇所の増加
▸脆弱性診断の技術の不足
▸攻撃者有利な状況
▸脆弱性を作りこまない必要性
![Page 80: Yosuke HASEGAWA - UTF-82015/10/02 · OWASP Kansai Local Chapter Meeting 6th #owaspkansai 自分たちの直面するWebセキュリティの問題 を自分たちの手で解決したい](https://reader034.fdocuments.in/reader034/viewer/2022051604/5ffce38c6387085bbc175ada/html5/thumbnails/80.jpg)
OWASP Kansai Local Chapter Meeting 6th #owaspkansai
[email protected]@securesky-tech.com
@hasegawayosuke
http://utf-8.jp/