OWASP Kansai Chapter Yosuke HASEGAWA
はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株 式 会 社 セキュアスカイ テクノロジー 常 勤 技 術 顧 問 CODE BLUE Security Conference Review board member セキュリティキャンプ 講 師 (Webクラス/ 高 レイヤートラック) http://utf-8.jp/ Author of jjencode and aaencode
自 分 たちの 直 面 するWebセキュリティの 問 題 を 自 分 たちの 手 で 解 決 したい 日 本 で2 番 目 のOWASPローカルチャプター 2014 年 3 月 から 活 動 開 始 3か 月 に1 回 のChapter Meeting ( 勉 強 会 )を 開 催 Webセキュリティの 悩 み 事 を 気 楽 に 相 談 し 情 報 共 有 で きる 場 スキル 役 職 業 種 国 籍 性 別 年 齢 関 係 なく 遠 慮 な くお 越 しください
はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株 式 会 社 セキュアスカイ テクノロジー 常 勤 技 術 顧 問 CODE BLUE Security Conference Review board member セキュリティキャンプ 講 師 (Webクラス/ 高 レイヤートラック) http://utf-8.jp/ Author of jjencode and aaencode
JavaScriptに 関 連 するセキュリティ 問 題 JavaScriptによるオープンリダイレクタ DOM-based XSS CORSの 設 定 不 備 クライアントサイドでの 不 適 切 なデータ 保 存 その 他 DOM APIの 不 適 切 な 使 用
JavaScriptに 関 連 するセキュリティ 問 題 JavaScriptによるオープンリダイレクタ DOM-based XSS CORSの 設 定 不 備 脆 弱 性 の 発 生 が 圧 倒 的 に 多 い クライアントサイドでの 不 適 切 なデータ 保 存 その 他 DOM APIの 不 適 切 な 使 用
対 象 動 的 にHTMLを 生 成 するWebアプリ 問 題 攻 撃 者 が 用 意 したスクリプトがHTML 内 に 挿 入 さ れる 対 策 HTMLを 生 成 する 時 点 でエスケープ URLはhttp/httpsのみに 限 定 する
被 害 者 http://shop.example.jp/?item="><script>... 攻 撃 者 GET /?item="><script>... XSSの 被 害 JSでてきることは 何 でも 偽 情 報 の 表 示 Cookie 情 報 の 漏 えい 機 密 情 報 の 漏 えい その 他 OWASP Kyushu Local Chapter Meeting 3rd <input type="text" value=""><script>... HTML 生 成 時 に エスケープされていない Web サイト
対 象 動 的 にHTMLを 生 成 するWebアプリ 問 題 攻 撃 者 が 用 意 したスクリプトがHTML 内 に 挿 入 さ れる 対 策 HTMLを 生 成 する 時 点 でエスケープ URLはhttp/httpsのみに 限 定 する
HTMLを 生 成 する 時 点 でエスケープする < < > > " " ' ' & & <html> < > データ 処 理 HTML 生 成 ユーザ
URLはhttp/httpsのみに 限 定 する src,hrefなどの 属 性 値 の 動 的 生 成 <a href="javascript:alert(1)"> <iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> URLの 動 的 生 成 時 はhttp,https 限 定 とする
反 射 型 XSS ユーザーからの 送 信 内 容 をそのまま 表 示 お 問 い 合 わせフォーム 検 索 フォームなど XSSフィルタである 程 度 防 御 蓄 積 型 XSS 攻 撃 者 のスクリプトをサーバ 内 で 保 持 掲 示 板 Webメールなど
反 射 型 XSS ユーザーからの 送 信 内 容 をそのまま 表 示 お 問 い 合 わせフォーム 検 索 フォームなど XSSフィルタである 程 度 防 御 蓄 積 型 XSS ユーザー 攻 撃 者 のスクリプトをサーバ 内 で 保 持 掲 示 板 Webメールなど GET /?item="><script>... Web アプリ <input type="text" value=""><script>...
リクエストとレスポンスに 同 じ 内 容 が 含 まれる GET /?<script>alert(1)</script> HTTP/1.1 Host: example.jp HTTP/1.1 200 OK Content-Type: text/hthml; charst=utf-8 <html> <body> <script>alert(1)</script> </body>
リクエストとレスポンスに 同 じ 内 容 が 含 まれる GET /?<script>alert(1)</script> HTTP/1.1 Host: example.jp HTTP/1.1 200 OK Content-Type: text/hthml; charst=utf-8 <html> <body> <script>alert(1)</script> </body>
反 射 型 XSS ユーザーからの 送 信 内 容 をそのまま 表 示 お 問 い 合 わせフォーム 検 索 フォームなど XSSフィルタである 程 度 防 御 蓄 積 型 XSS ユーザー 攻 撃 者 のスクリプトをサーバ 内 で 保 持 掲 示 板 Webメールなど Web アプリ 攻 撃 者 Subject: Hello <script>... Subject: Hello <script>...
サーバに 攻 撃 者 のスクリプトが 保 存 される 攻 撃 の 永 続 化 攻 撃 と 被 害 に 時 間 差 反 射 型 より 影 響 が 大 きい
反 射 型 XSS ユーザーからの 送 信 内 容 をそのまま 表 示 お 問 い 合 わせフォーム 検 索 フォームなど XSSフィルタである 程 度 防 御 蓄 積 型 XSS 攻 撃 者 のスクリプトをサーバ 内 で 保 持 掲 示 板 Webメールなど
反 射 型 XSS ユーザーからの 送 信 内 容 をそのまま 表 示 お 問 い 合 わせフォーム 検 索 フォームなど XSSフィルタである 程 度 防 御 蓄 積 型 XSS 攻 撃 者 のスクリプトをサーバ 内 で 保 持 掲 示 板 Webメールなど DOM-based XSS JavaScriptが 引 き 起 こすXSS サーバ 側 のHTML 生 成 では 問 題 なし
JavaScriptが 引 き 起 こすXSS サーバ 側 のHTML 生 成 時 には 問 題 なし JavaScriptによるHTMLレンダリング 時 の 問 題 //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html> JavaScriptの 利 用 に 合 わせて 増 加
ブラウザのXSSフィルタを 通 過 することが 多 い location.hash 内 などの 実 行 コードはサーバ 側 にログが 残 らない //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>
JavaScriptが 実 行 されるまでXSSの 存 在 が わからない 検 査 ツール 既 存 の 検 査 ツールでは 検 出 不 可 な 場 合 も 生 成 されるHTML 自 体 には 問 題 はない リクエスト/レスポンスの 監 視 だけでは 見 つからな い <XSS> 検 査 対 象 アプリ ブラウザ <xss> <XSS>
静 的 コンテンツのみでもXSSする 可 能 性 動 的 にHTMLを 生 成 する Webアプリケーション ではなく *.htmlしか 提 供 してなくてもXSSのある 可 能 性 がある ブラウザ <html> <script> document.write( location.hash.substring(1) ); </script> 静 的 な Webサーバ
攻 撃 者 はJavaScriptを 読 むことができる じっくり 読 んで 脆 弱 性 を 探 すことが 可 能 脆 弱 性 の 有 無 を 確 認 するための 試 行 リクエストは 不 要 一 撃 必 殺 でXSSを 成 功 させる
IE10, XSSフィルターを 通 過
圧 倒 的 に 不 利 な 状 況 JavaScriptコード 量 の 大 幅 な 増 加 XSSフィルタを 通 過 することがある サーバのログに 残 らないことがある これまでの 検 査 方 法 では 見 つからない 静 的 コンテンツでもXSSする 攻 撃 者 は 時 間 をかけてXSSを 探 す 開 発 時 点 で 作 りこまない 必 要 性
原 因 攻 撃 者 の 与 えた 文 字 列 が JavaScript 上 のコードのどこかで 文 字 列 からHTMLを 生 成 あるいは JavaScript コードとして 実 行 される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>
原 因 攻 撃 者 の 与 えた 文 字 列 が JavaScript 上 のコードのどこかで 文 字 列 からHTMLを 生 成 あるいは JavaScript コードとして 実 行 される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>
原 因 攻 撃 者 の 与 えた 文 字 列 が JavaScript 上 のコードのどこかで 文 字 列 からHTMLを 生 成 あるいは JavaScript コードとして 実 行 される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>
原 因 攻 撃 者 の 与 えた 文 字 列 が JavaScript 上 のコードのどこかで 文 字 列 からHTMLを 生 成 あるいは JavaScript コードとして 実 行 される //http://example.jp/#<img src=0 onerror=alert(1)> <html> <script> document.write( location.hash.substring(1) ); </script> </html>
ソース 攻 撃 者 の 与 えた 文 字 列 の 含 まれる 箇 所 シンク 文 字 列 からHTMLを 生 成 したりコードとして 実 行 す る 部 分 ソース 処 理 シンク
ソース 攻 撃 者 の 与 えた 文 字 列 の 含 まれる 箇 所 シンク 文 字 列 からHTMLを 生 成 したりコードとして 実 行 す る 部 分 location. hash document. referrer location. search ソース 処 理 シンク XHR etc...
ソース 攻 撃 者 の 与 えた 文 字 列 の 含 まれる 箇 所 シンク 文 字 列 からHTMLを 生 成 したりコードとして 実 行 す る 部 分 location. hash document. referrer location. href document. write location. search ソース 処 理 シンク innerhtml XHR etc... eval etc...
対 策 HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 使 用 しているライブラリの 更 新 サーバ 側 でのXSS 対 策 と 同 じ これまでサーバ 上 で 行 っていたことをJavaScript 上 で 行 う
対 策 HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 使 用 しているライブラリの 更 新 サーバ 側 でのXSS 対 策 と 同 じ これまでサーバ 上 で 行 っていたことをJavaScript 上 で 行 う
HTML 生 成 時 に 適 切 なDOM 操 作 JavaScriptでレンダリングされる 直 前 エスケープ ではなく 適 切 なDOM 操 作 関 数 // bad code document.write( location.hash.substring( 1 ) ); var text = document.createtextnode( location.hash.substring( 1 ) ); document.body.appendchild( text );
テキストノードだけでなく 属 性 値 も // bad code var text = "..."; // 変 数 textは 攻 撃 者 がコントロール 可 能 form.innerhtml = '<input type="text" name="key" value="' + text + '">'; <input... value=""><script>...</script "><script>...</script ""> var text = "..."; // 変 数 textは 攻 撃 者 がコントロール 可 能 var elm = document.createelement( "input" ); elm.setattribute( "type", "text" ); elm.setattribute( "name", "key" ); elm.setattribute( "value", text ); // 属 性 値 を 設 定 する form.appendchild( elm );
HTML 生 成 時 に 適 切 なDOM 操 作 関 数 テキストノードの 生 成 createtextnode, innertext, textcontent 属 性 の 設 定 setattribute シンクとなるAPIを 不 用 意 に 使 用 しない innerhtml, document.write,...
対 策 HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 使 用 しているライブラリの 更 新 サーバ 側 でのXSS 対 策 と 同 じ これまでサーバ 上 で 行 っていたことをJavaScript 上 で 行 う
URLの 生 成 時 はhttp(s)に 限 定 //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> // urlが http:// https:// で 始 まる 場 合 のみに 限 定 if( url.match( /^https?: / // ) ){ var elm = document.getelementbyid( "link" ); elm.setattribute( "href", url ); }
URLの 生 成 時 はhttp(s)に 限 定 他 のスキームが 入 り 込 まないように javascript:, vbscript:, data:, <a> 要 素 だけでなくlocationオブジェクトの 操 作 時 にも 注 意 // bad code var url = "javascript:alert(1)"; location.href = url; // XSS location.assign( url ); // XSS
対 策 HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 使 用 しているライブラリの 更 新 サーバ 側 でのXSS 対 策 と 同 じ これまでサーバ 上 で 行 っていたことをJavaScript 上 で 行 う
使 用 してるライブラリの 更 新 JavaScriptライブラリの 脆 弱 性 対 応 使 用 しているJSライブラリの 更 新 を 把 握 すること Masato Kinugawa Security Blog: jquery Mobile 1.2 Beta 未 満 は 読 み 込 んでいるだけでXSS 脆 弱 性 を 作 ります http://masatokinugawa.l0.cm/2012/09/jquery-mobile-location.href-xss.html サーバ 側 のミドルウェア 等 の 運 用 と 同 じ
対 策 HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 使 用 しているライブラリの 更 新 サーバ 側 でのXSS 対 策 と 同 じ これまでサーバ 上 で 行 っていたことをJavaScript 上 で 行 う
DbXSS 対 策 の 原 則 ( 再 掲 ) HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定
DbXSS 対 策 の 原 則 ( 再 掲 ) HTML 生 成 時 にエスケープ/ 適 切 なDOM 操 作 URLの 生 成 時 はhttp(s)に 限 定 原 則 だけでは 立 ちいかない 現 実 一 部 のHTMLタグは 許 容 したい 相 対 URLも 使 いたい
一 部 のタグだけは 許 容 したい 装 飾 やリンクのためのHTMLタグ var s = "** 注 意 ** 雨 天 時 は[こちら](http://example.jp/)です "; <b> 注 意 </b> 雨 天 時 は<a href="http://example.jp/">こちら</a>です 相 対 URLも 使 いたい <a href="/next-page">next</a> // 相 対 リンクをJSでも 生 成 したい
一 部 のタグだけは 許 容 したい 特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 [ { "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>です
一 部 のタグだけは 許 容 したい 特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 [ { "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>です
一 部 のタグだけは 許 容 したい 特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 [ { "date" : "2015/09/10", "url" : "http://example.jp/news", "title" : " 新 製 品 発 表 のお 知 らせ" }, { "date" : "2015/09/19", "url" : "http://example.jp/owasp", "title" : "Local Chapter Meeing 開 催 " } ] HTMLの 構 造 は 固 定 <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> 属 性 値 やテキストノードの 部 分 を 動 的 に 生 成
特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 自 分 でテンプレート 処 理 を 書 く? // bad code function 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 );
テンプレート 処 理 を 自 分 で 書 くのはやめるべ き 汎 用 性 に 欠 けるのに 見 通 しの 悪 いコードが 増 える 細 かな 対 策 全 てを 自 分 でケアする 必 要 がある テキストノードにエスケープが 必 要 URLにjavascript:スキーム 等 が 混 入 しないように 注 意 がいる
JSのテンプレートエンジンライブラリの 導 入 MV*フレームワークの 採 用 (vue,knockoutなど) 各 ライブラリの 挙 動 を 把 握 して 使 用 すること テキストノードへ 出 力 するときにエスケープされる か(vueのv-textとv-htmlの 違 い 等 ) 属 性 値 にjavascript:スキーム 等 が 設 定 された 場 合 にどうなるか
一 部 のタグだけは 許 容 したい 特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 [ { "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>です
一 部 のタグだけは 許 容 したい 特 定 書 式 の 繰 り 返 し テンプレート 的 な 用 途 [ { "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>です
ユーザーによる 自 由 な 入 力 HTML 構 造 が 事 前 に 定 義 されていない 安 全 なタグや 属 性 は 許 可 それ 以 外 を 禁 止 Webメール 掲 示 板 などのリッチエディット markdown
ユーザーによる 自 由 な 入 力 安 全 なタグや 属 性 だけ 許 可 それ 以 外 を 禁 止 <div>こんにちは</div> <script>alert(1)</script> <img src=# onerror=alert(1)> <s> 取 り 消 し 線 </s> <div>こんにちは</div> <img src=#> <s> 取 り 消 し 線 </s> 攻 撃 者 Web アプリ ユーザー
危 険 そうな 属 性 やタグを 全 て 削 除 する? // bad code function 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>" );
危 険 そうな 属 性 やタグを 全 て 削 除 する? // bad code function 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> このアプローチでは 絶 対 に 抜 けが 発 生 する
安 全 なタグ 要 素 だけでHTMLを 組 み 立 てな おす 安 全 なタグ 属 性 を 事 前 に 定 めておく 文 字 列 をHTMLとしてパースする 安 全 なタグ 属 性 のみでHTMLを 再 生 成 する といったことを 自 分 でやるのはしんどいので ライブラリに 任 せる
安 全 なタグ 要 素 だけでHTMLを 組 み 立 てな おす DOMPurify https://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>
相 対 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/" ); // ok setlink( "javascript:alert(1)" ); // ng setlink( "/foo" ); //??? setlink( "foo" ); //???
相 対 URLを 絶 対 URLに 正 規 化 する URLUtilsインターフェース // Chrome, Firefoxのみ var url = new URL( "/foo", location.href ); console.log( url.href ); a 要 素 で 代 用 // IE 向 け var a = document.createelement( "a" ); a.setattribute( "href", "/foo" ); console.log( a.href );
function getabsoluteurl( url ){ var elm = document.createelement( "a" ); // hrefプロパティが 絶 対 URLを 返 すかテストする elm.setattribute( "href", "/test" ); if( elm.href === "/test" ){ // IE6, IE7 elm.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; } }
相 対 URLを 絶 対 URLに 変 換 したのちにプロト コルを 確 認 する var target = parseurl( "javascript:alert(1)" ); if( target.protocol.match( /^https?:/ ) ){ /* http httpsなurlなので 処 理 する */ }
DbXSS 対 策 に 自 信 がない 万 が 一 に 備 えたい DbXSSが 発 生 しても 被 害 が 及 ばないようにする HTML5 iframe sandboxが 利 用 可 能 <iframe sandbox seamless style="border-width:0px" id="f"></iframe> document.getelementbyid("f").srcdoc = "<div><img src=# onerror=alert(1)></div>"; sandbox 属 性 を 付 与 することでJSの 実 行 が 禁 止 される
一 部 のHTMLタグは 許 容 したい 特 定 書 式 の 繰 り 返 しにはテンプレートライブラリやMV*フ レームワークを 用 いる それらのエスケープ 有 無 を 把 握 すること リンクがhttp/httpsに 限 定 されるかを 確 認 すること ユーザーによる 自 由 なHTMLタグ 入 力 を 許 容 したい DOMPurifyのようなライブラリを 用 いる 相 対 URLを 使 いたい 絶 対 URLへ 変 換 したのちにプロトコルスキームを 確 認 する 保 険 的 対 策 iframe sandboxの 活 用
スキャナで 静 的 解 析 AppScan (よく 知 らない) スキャナで 動 的 解 析 DOMinatorPro (よく 知 らない) JavaScriptのソースコードを 読 む 一 番 効 果 的? 無 料! 攻 撃 者 もできる
ブラウザのデバッガでシンクの 使 用 箇 所 を 探 す innerhtml, locationなどが 多 い シンクがコントロール 可 能 か 調 べる シンク ソースへの 経 路 を 上 っていく 実 際 に 試 す
ソースコードを 読 みながら 探 す デバッグと 同 じ 技 術 が 要 求 される 開 発 者 としての 能 力 が 要 求 される 難 読 化 (minify)されているjsを 読 む 能 力
DOM-based XSSの 脅 威 の 増 加 攻 撃 可 能 箇 所 の 増 加 脆 弱 性 診 断 の 技 術 の 不 足 攻 撃 者 有 利 な 状 況 脆 弱 性 を 作 りこまない 必 要 性
hasegawa@utf-8.jp hasegawa@securesky-tech.com @hasegawayosuke http://utf-8.jp/