自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 OWASP Kansai Chapter Leader OWASP Japan Chapter Advisory Board member



Similar documents
長谷川陽介 ( はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株式会社セキュアスカイ テクノロジー CTO セキュリティキャンプ講師 (2008~) CODE BLUE カンファレンスレビュー

自己紹介 長谷川陽介 ( はせがわようすけ ( 株 ) セキュアスカイ テクノロジー常勤技術顧問 セキュリティキャンプ講師 (2008 年 ~) OWASP Kansai チャプターリーダー OWASP Japan ボードメンバー CODE BLUE カンファレ

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 OWASP Kansai Chapter Leader OWASP Japan Chapter Advisory Board member

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 セキュリティ キャンプ Webセキュリティクラス OWASP Kansai Chapter Leader OWASP Japan board member

自己紹介 XSS のほうから来ました author of jjencode, aaencode

Yosuke Secure Sky Technology Inc. Technical Advisor OWASP Kansai Chapter Leader OWASP Japan Chapter board member CODE BLUE Re

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 Microsoft MVP for Consumer Security Oct

JavaScript 演習 2 1

はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株 式 会 社 セキュアスカイ テクノロジー 常 勤 技 術 顧 問 CODE BLUE Security Conference Review board member セキュリティキ

Microsoft PowerPoint _2b-DOM.pptx

Webプログラミング演習

JavaScript の使い方

今から始めるHTML5セキュリティ

自己紹介 はせがわようすけ OWASP Kansai チャプターリーダー OWASP Japan アドバイザリボードメンバー 株式会社セキュアスカイ テクノロジー常勤技術顧問 CODE BLUE Security Conference Review board member セキュリティキャンプ講師

JavaScript演習

allows attackers to steal the username-password pair saved in the password manager if the login page or other pages in the same domain are vulnerable

2.2 Reflected XSS 攻撃攻撃者の用意した悪意のあるリンクとターゲットサーバが同じホストである場合の Reflected XSS 攻撃を, 本稿では Reflected XSS 攻撃と呼ぶ. 例えば, サーバ A の target.php に Reflected XSS 脆弱性があった

SmallTown 日付オブジェクト 日付オブジェクトを使ってページ内にいろいろな仕掛けをつくってみよう 1. 日付オブジェクトとは JavaScriptではいろいろなオブジェクトを扱えますが 日付オブジェクトもその一つです 手順としては 1 日付オブジェクトを作成する2そのオブジェクトから日にちや

Microsoft Word - DOM_Core_Improvements

コンテンツメディアプログラミング実習2

Webプログラミング演習

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

Webデザイン論

SmartBrowser_document_build30_update.pptx

JavaScript演習

AJAXを使用した高い対話性を誇るポートレットの構築

Microsoft Word - no04.doc

paper.pdf

JPCERT/CCとは 一 般 社 団 法 人 JPCERTコーディネーションセンター (JPCERT/CC (ジェーピーサート コーディネーションセンター)) Japan Computer Emergency Response Team Coordination Center

Microsoft Word - PaLearn_manual_05c.doc

Microsoft PowerPoint _2b-DOM.pptx

Microsoft Word 基_シラバス.doc

SOC Report

第 8 回の内容 クライアントサイド処理 JavaScript の基礎

untitled

Microsoft Word - no06.doc

CodeGear Developer Camp

untitled

第7回 Javascript入門

PowerPoint プレゼンテーション

プロキシ Pac ファイルとそのサンプルについて

IPSJ SIG Technical Report Vol.2014-HCI-157 No.26 Vol.2014-GN-91 No.26 Vol.2014-EC-31 No /3/15 1,a) 2 3 Web (SERP) ( ) Web (VP) SERP VP VP SERP

第7回 Javascript入門

d_appendixB-asp10appdev.indd

9 WEB監視

PowerPoint プレゼンテーション

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) 演習名 使用するフォルダ 演習 1 Z: Web データ管理 演習

医療者のための情報技術入門第 9 回プログラムがはたらくしくみを学ぶ (2) 日紫喜光良 概要 1. はじめに- 具体例から ここから Javascript のプログラミング入門 次はどうする--

自 己 紹 介 ( 株 )セキュアスカイ テクノロジー 常 勤 技 術 顧 問 OWASP Kansaiチャプターリーダー OWASP Japanボードメンバー http//utf-8.jp/

Web±ÜÍ÷¤Î³Ú¤·¤µ¤ò¹â¤á¤ëWeb¥Ú¡¼¥¸²ÄÄ°²½¥·¥¹¥Æ¥à

20th Embarcadero Developer Camp


Microsoft Word - no03.doc

■サイトを定義する

Microsoft Word - Webシステム/Webアプリケーション セキュリティ要件書 docx

4. Webブラウザのオブジェクト

ページ閲覧を計測する 手順 1: カスタム HTML タグ からタグを設定する まず タグタイプを選択 の画面で カスタム HTML を選択します タグの設定画面が開くので ユーザグラムで発行されたタグを HTML 欄に直接貼り付けてください document.write をサポートする はオフのま

Drive-by Download 攻撃に おけるRIG Exploit Kitの 解析回避手法の調査

フォームとインナー HTML を使って動的にページ内の文章を変更しよう 問題 1. つぎの指示と画面を参考に HTML を組みなさい 仕様 テキストボックスに任意の文字を入力し [ コメント ] ボタンをクリックすると 下部の文章がテキストボックスの内容に置き換わる フォーム名 : f1 テキストボ

WEBシステムのセキュリティ技術

E4X in Firefox nanto_vi (TOYAMA Nao)

タイトルを1~2行で入力 (長文の場合はフォントサイズを縮小)

Web プログラミング 1 JavaScript (3) (4 章 ) 2013/7/3( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5/

卒論タイトル

スケジューリングおよび通知フォーム のカスタマイズ

vuejs_meetup.key

HTTP 404 への対処

untitled

Web プログラミング 1 JavaScript (4) (4 章 ) 2013/7/17( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5

Web データ管理 JavaScript (3) (4 章 ) 2011/12/21( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/18

◎phpapi.indd


html5_ver2_kai.pdf

第7回 Javascript入門

HOW DO I WebBrowser コントロールで HTML5 を 使用するには ここでは以下の手順で説明します Video 要素を使用する Silverlight と JavaScript の間でやり取りする Canvas 要素を使用する Video 要素を使用する 1. Visual Stu

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

JavaScript 1.! DOM Ajax Shelley Powers,, JavaScript David Flanagan, JavaScript 2

SOC Report

Drive-by Download RIG Exploit Kit

Web

Microsoft PowerPoint XmlConsortiumWeek2.ppt

manual.dvi

目次

( )

C:\Apache Software Foundation\Apache2.2\htdocs\sample\login.html サンプルプログラム passworddisc.php <head><title> ログイン </title></head> $user=$_post['user']; $

第12回 モナドパーサ

JavaScript Web JavaScript BitArrow BitArrow ( 4 ) Web VBA JavaScript JavaScript JavaScript Web Ajax(Asynchronous JavaScript + XML) Web. JavaScr

jquery

SOC Report

スライド 1

cssnitelp47_hasegawa_v02.key

技術メモ-クリックジャッキング対策- X-FRAME-OPTIONSについて

PowerPoint プレゼンテーション

Microsoft PowerPoint _3a-SEO.pptx

Drive-by-Download攻撃における通信の 定性的特徴とその遷移を捉えた検知方式

商用監視ソフトウェアユーザの Zabbix 移行へ朗報 Zabbix Event Viewer のご紹介 【本邦初公開】

Lotus Domino XML活用の基礎!

07_経営論集2010 小松先生.indd

SOC Report

スライド 1

Transcription:

HTML5 and Security Part 4 : DOM based XSS HTML5 セキュリティその 4 : DOM based XSS 編 Sep 8 2014 Yosuke HASEGAWA

自己紹介 はせがわようすけ ネットエージェント株式会社 株式会社セキュアスカイ テクノロジー技術顧問 http://utf-8.jp/ OWASP Kansai Chapter Leader OWASP Japan Chapter Advisory Board member

お知らせ Announcement

HTML5 Security Report English edition from JPCERT/CC

今日の話題 DOM based XSS Today's topic : DOM based XSS

DOM based XSS JavaScript で DOM を組み立てるときの XSS location.href = location.hash.substring(1); document.write( document.referrer ); div.innerhtml = xhr.responsetext; サーバ側のHTML 生成には問題なし JavaScriptの利用に合わせて発生も増加

DOM based XSS

DOM based XSS

DOM based XSS ブラウザの XSS フィルタを通過することが多い location.hash 内の実行コードはサーバ側にログが残らない //http://example.jp/#<script>alert(1)</script> div.innerhtml = location.hash.substring(1); history.pushstate でアドレスバー書き換え 技術のあるユーザでも XSS に気づきにくい

DOM based XSS DOM based XSS は増えている JavaScript の大規模化に伴い増加 サーバ側での対策と原則は同じ HTML 生成時 ( レンダリング時 ) にエスケープ URL 生成時はhttp(s) のみ ライブラリの更新を忘れずに (jqueryとか) CSSやイベントハンドラの動的生成は避ける

DOM based XSS HTML 生成時にエスケープ div.innerhtml = s.replace( /&/g, "&" ).replace( /</g, "<" ).replace( />/g, ">" ).replace( /"/g, """ ).replace( /'/g, "&#x27;" ); むしろ textnode を使おう! div.appendchild( document.createtextelement( s ) );

DOM based XSS URL 生成時は http(s) のみ // bad code div.innerhtml = '<a href="' + url + '">' + url + '</a>'; if( url.match( /^https?: / // ) ){ var elm = docuement.createelement( "a" ); elm.appendchild( document.createtextnode( url ) ); elm.setattribute( "href", url ); div.appendchild( elm ); }

DOM based XSS URL 生成時は http(s) のみ リダイレクト時はオープンリダイレクタを発生させないよう同一ホストに制限 var base = location.origin + "/"; if( url.substring( 0, base.length ) == base ){ location.href = url; }

ここまで DOM based XSS の 基本です Basics of DbXSS so far

Mutation-based XSS

Mutation-based XSS : mxss DOM based XSS の一種 innerhtml / outerhtml の参照により元の DOM 構造とは異なる HTML 文字列が返されることにより XSS が発生 element1.innerhtml = element2.innerhtml; HTMLElement innerhtml String innerhtml HTMLElement 異なる HTML

Mutation-based XSS : mxss DOM based XSS の一種 innerhtml / outerhtml の参照により元の DOM 構造とは異なる HTML 文字列が返されることにより XSS が発生 The innerhtml Apocalypse How mxss attacks change everything we believed to know so far http://www.slideshare.net/x00mario/the-innerhtml-apocalypse mxss Attacks: Attacking well-secured Web-Applications by using innerhtml Mutations https://cure53.de/fp170.pdf mxss The Spanner http://www.thespanner.co.uk/2014/05/06/mxss/

Mutation-based XSS : mxss <!-- IE8 --> <div id="div1"> <input type="text" value="``onmouseover=alert(1)"> </div> <div id="div2"></div>... div2.innerhtml = div1.innerhtml; <div id="div2"> <INPUT value=``onmouseover=alert(1) type=text> </div>

Mutation-based XSS : mxss <input type="text" value="``onmouseover=alert(1)"> <INPUT value=``onmouseover=alert(1) type=text> <listing><img src=1 onerror=alert(1)></listing> <LISTING><img src=1 onerror=alert(1)></listing> <style/></style><img src=1 onerror=alert(1)></style> <STYLE></style><img src=1 onerror=alert(1)></style> <title><img src=1 onerror=alert(1)></title> <TITLE><img src=1 onerror=alert(1)></title>

Mutation-based XSS : mxss mxss innerhtml/outerhtml を参照したときに本来の DOM 構造とは異なる文字列が取得される IE 以外でも発生し得る (CDATA 要素の参照など ) 対策 攻撃者がコントロール可能な要素の innerhtml / outerhtml を参照しない 文字列ではなく DOM 操作で

ここまでのまとめ DOM based XSS JS 上で発生する XSS Mutation-based XSS JS 上で innerhtml/outerhtml を参照したときに発生する XSS 対策 文字列操作ではなく DOM 操作で createelement / textcontent

DOM 操作めんどうくさい! Manipulating DOM is messy!

DOM 操作めんどうくさい ( 例 ) [ ] var xhr = new XMLHttpRequest(); xhr.open( "GET", "http://3rdparty.example.com/", true ); xhr.onload = function(){ }; "<a href='http://example.jp/foo'>2014.09.08 新製品 </a>", "<a href='http://example.jp/bar'>2014.09.01 お知らせ </a>", "<img src=# onerror=alert(1)>" var items = JSON.parse( xhr.responsetext ); var elm = document.getelementbyid( "div" ); for( var i = 0; i < items.length; i++ ){ elm.innerhtml += "<div class='item'>" + items[ i ] + "</div>"; } ここ DOM 操作で作るのしんどい

DOM 操作めんどうくさい tostatichtml IE8+ 安全な HTML 文字列を返す お手軽 div.innerhtml = tostatichtml( s ); "<script>alert(1)</script>" "" "<img src=# onerror=alert(1)>" "<img src=#>" "<a href='javascript:alert(1)'>link</a>" "<a>link</a>"

DOM 操作めんどうくさい IE 以外はどうするか 第 4 回 次に, ブラウザ側の機能を使って HTML をパースする方法です これは createhtmldocument を使うとよいでしょう createhtmldocument は HTML5 仕様で標準化されており, 安定して使うことができます IE でも IE9 以降でサポートされています HTML パース処理を行い, 新たなドキュメントを作ったら, あとはすべての DOM ノードと Attribute を列挙して, 許可したタグと属性以外をすべて除去すれば完了です 危険性が理解されにくいネイティブアプリ内 XSS(2): フロントエンド Web 戦略室 gihyo.jp 技術評論社 http://gihyo.jp/dev/serial/01/front-end_web/000402

ブラウザの機能を使って HTML をパース DOMParser / createhtmldocument ブラウザ内蔵の HTML パーサ 現在表示している document に影響を与えずに DOM ツリーを構築可能 Opera 12 を除く

ブラウザの機能を使って HTML をパース DOMParser var s = xhr.responsetext; var parser = new DOMParser(); var doc = parser.parsefromstring( s, "text/html" ); var elm = doc.body; createhtmldocument var s = xhr.responsetext; var elm = document.implementation.createhtmldocument("").body; elm.innerhtml = s; 文字列をパースし DOM ノードを構築可能 DOM ノードから必要な要素 属性を切り出す

ブラウザの機能を使って HTML をパース DOMParser createhtmldocument は現在表示している document に影響を与えない var s = "<img src=# onerror=alert(1)>"; // 発火しない!! var parser = new DOMParser(); var doc = parser.parsefromstring( s, "text/html" );c createcontextualfragment はブラウザによって発火する

ノードから必要な要素 属性を切り出す DOMParser createhtmldocument で HTMLElement を生成 生成された HTMLElement の要素 属性を列挙して安全なものだけを抽出 a div img class title href class class alt src http:// https:// http:// https://

文字列と HTMLElement 作成した HTMLElement を文字列に変換しないこと // bad code. var parser = new DOMParser(); var doc = parser.parsefromstring( s, "text/html" ); div.innerhtml = doc.body.innerhtml; HTMLElement div. innerhtml String doc.body. innerhtml HTMLElement

文字列と HTMLElement HTMLElement から文字列への変換は mxss を引き起こす ( 可能性がある ) // bad code. IE では mxss となる var s = "<listing><img src=1 onerror=alert(1)></listing>"; var parser = new DOMParser(); var doc = parser.parsefromstring( s, "text/html" ); div.innerhtml = doc.body.innerhtml;

文字列と HTMLElement こういうコードはダメ // bad code. tostatichtml モト キを作りたい if( window.tostatichtml ){ return tostatichtml( s ); }else{ var parser = new Parser(); var doc = parser.parsefromstring( s, "text/html" ); var newnode = sanitize( doc.body ); return newnode.innerhtml; }

文字列と HTMLElement 書くならこういう感じ // tostatichtml モト キを作りたい if( window.tostatichtml ){ var div = document.createelement("div"); div.innerhtml = tostatichtml( s ); return div.childnodes; }else{ var parser = new Parser(); var doc = parser.parsefromstring( s, "text/html" ); var newnode = sanitize( doc.body ); return newnode.childnodes; // HTMLElement }

RickDOM http://github.com/hasegawayosuke/rickdom/

RickDOM 簡単かつ安全に使えるライブラリ var rickdom = new RickDOM(); var elms = rickdom.build( "<img src=# onerror=alert(1)>" ); for( var i = 0; i < elms.length; i++ ){ div.appendchild( elms[ i ] ); } 独自の許可ルールの設定も可能 var rickdom = new RickDOM(); rickdom.allowings = { img: { src: { pattern : "^https?: / /", flag: "i" } } }; var elms = rickdom.build( "<img src=# onerror=alert(1)>" ); http://github.com/hasegawayosuke/rickdom/ http://utf-8.jp/public/rickdom/

よくわかんない 不安だ Anxious

sandboxed iframe sandbox な iframe を応用 <iframe id="iframe" sandbox seamless style="border-width:0px"></iframe>... document.getelementbyid("iframe").srcdoc = xhr.responsetext; sandbox 属性により JS を禁止 (XSS を防ぐ )

sandboxed iframe sandbox な iframe を応用 <iframe id="iframe" sandbox seamless style="border-width:0px"></iframe>... document.getelementbyid("iframe").srcdoc = xhr.responsetext; sandbox 属性により JS を禁止 (XSS を防ぐ ) seamless 属性により親フレームの CSS を継承 コンテンツは srcdoc 属性に直接設定 HTMLElement なら contentdocument 経由で

sandboxed iframe "/page" などのリンクの許可 <iframe id="iframe" sandbox="allow-top-navigation" seamless style="border-width:0px"></iframe>... document.getelementbyid( "iframe" ).srcdoc = '<base href="http://example.jp/" target="_parent">' + '<a href="/page">next</a>'; allow-top-navigation で親 frame 内でのページ遷移を許可

まとめ DOM based XSS,mXSS 文字列で操作しない DOM 経由で操作 リンクはhttp(s) のみ 文字列から DOM の構築 DOMParser API が便利 sandboxed iframe DOM baed XSS の予防に便利

質問タイム Question?

Question? 質問 hasegawa@utf-8.jp hasegawa@netagent.co.jp @hasegawayosuke http://utf-8.jp/