HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ その 2 : ...
description
Transcript of HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ その 2 : ...
HTML5 and SecurityPart 2: Open redirect and CSRF
HTML5 セキュリティ その 2 : オープンリダイレクト、 CSRF
Nov 14 2013Yosuke HASEGAWA
#owaspjapan
OWASP Japan Local Chapter Meeting #8 #owaspjapan
自己紹介
はせがわようすけネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問
Microsoft MVP for Consumer Security Oct 2005 -
http://utf-8.jp/
お知らせannouncement
OWASP Japan Local Chapter Meeting #8 #owaspjapan
HTML5 調査報告 from JPCERT/CC
オープンリダイレクトOpen redirect
OWASP Japan Local Chapter Meeting #8 #owaspjapan
Open redirect オープンリダイレクト
本来は Web サイト内でのリダイレクト機能
攻撃者の指定した任意のサイトへジャンプできてしまう
フィッシングや SEO ポイゾニングに使用される
サイト自体に被害を与えるわけではないサイトの信頼は損ねる
http://example.jp/go?url=http://evil.example.com/
http://example.jp/go?url=/next/page.html
OWASP Japan Local Chapter Meeting #8 #owaspjapan
Open redirect オープンリダイレクト
実在した例site:www.microsoft.com/japan/ adult
OWASP Japan Local Chapter Meeting #8 #owaspjapan
Open redirect オープンリダイレクト
リダイレクトの方法HTTP 応答として 301 または 302 を返すJavaScript による location オブジェクト
への代入<meta refresh>
OWASP Japan Local Chapter Meeting #8 #owaspjapan
Redirect with 301 or 302
脆弱な例オープンリダイレクトだけでなく HTTP
ヘッダインジェクションもある。#!/usr/bin/perluse URI::Escape;my $url = uri_unescape( $ENV{QUERY_STRING} || '/' );print "Status: 302 Found\n";print "Location: $url\n\n";HTTP/1.1 302 FoundDate: Tue, 28 Feb 2013 12:34:56 GMTLocation: http://other.example.jp/
OWASP Japan Local Chapter Meeting #8 #owaspjapan
location with JavaScript
JavaScript によるリダイレクトJavaScript コード増に伴い増加
オープンリダイレクトだけでなく XSS にもhttp://example.jp/#javascript:alert(1)
// http://example.jp/#/nextpagevar url = decodeURIComponent( location.hash.substring(1) );location.href = url;
OWASP Japan Local Chapter Meeting #8 #owaspjapan
<meta refresh>
IE6,7 の <meta refresh> は癖がある「 ; 」より後ろの URL が転送先に使用される
「 ; 」をエスケープしても防げない
<meta refresh> によるリダイレクトの動的生成は避けたほうがよい
<meta http-equiv="refresh" content="0;url=http://good/;url=http://evil/">
<meta http-equiv="refresh" content="0;url=http://good/;url=http://evil/">
OWASP Japan Local Chapter Meeting #8 #owaspjapan
オープンリダイレクトを防ぐために
転送先 URL の確認…実は難しいよねhttp://example.com///example.com/http:\\example.com/http:/\example.com/\example.com/その他にもいろいろif( url.match( /^\/[^\/]/ ) ){ location.href = url;} // bad code
OWASP Japan Local Chapter Meeting #8 #owaspjapan
オープンリダイレクトを防ぐために
HTTP レスポンスヘッダの改行コードブラウザによっては \r 、 \n どちらかだけで
も改行とみなされる
X-header: foo(0x0D 0x0A)Location: http://example.com/
X-header: foo(0x0A)Location: http://example.com/
X-header: foo(0x0D)Location: http://example.com/
OWASP Japan Local Chapter Meeting #8 #owaspjapan
オープンリダイレクトを防ぐために
根本的対策転送先 URL を事前にリストとして保持
// JavaScript によるリダイレクトvar pages = { foo:'/foo', bar:'/bar', baz:'/baz' };var url = pages[ location.hash.substring(1) ] || '/';
location.href = url;
#!/usr/bin/perluse URI::Escape;my $index = uri_unescape( $ENV{QUERY_STRING} || '' );my $pages = { foo=>'/foo', bar=>'/bar', baz=>'/baz' };my $url = $pages->{$index} || '/';print "Status: 302 Found\n";print "Location: $url\n\n";
CSRF
OWASP Japan Local Chapter Meeting #8 #owaspjapan
CSRF
XHR Lv.2 により攻撃しやすくなった攻撃対象 : ファイルのアップロードフォー
ム<form method="POST" action="upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"></form>
OWASP Japan Local Chapter Meeting #8 #owaspjapan
CSRF
従来の攻撃手法罠ページでは form を自動で submit する
これではファイルの中身は送信できない
<body onload="document.forms[0].submit();"> <form method="POST" action="http://target.example.jp/upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"> </form></body>
OWASP Japan Local Chapter Meeting #8 #owaspjapan
CSRF
XHR Lv.2 による CSRF 攻撃var xhr = new XMLHttpRequest();var boundary = '----boundary';var file="abcd"; // 送信するファイルの内容var request;xhr.open( 'POST', 'http://target.example.jp/upload', 'true' );xhr.setRequestHeader( 'Content-Type', 'multipart/form-data; boundary=' + boundary );xhr.withCredentials = true; // Cookie を付与xhr.onreadystatechange = function(){};request = '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="file"; ' + ' filename="filename.txt"\r\n' + 'Content-Type: application/octet-stream\r\n\r\n' + file + '\r\n' + '--' + boundary + '--';xhr.send( request );
OWASP Japan Local Chapter Meeting #8 #owaspjapan
CSRF
XHR Lv.2 による CSRF 攻撃XHR ではクロスオリジンでリクエストを発
行可能 ( サーバ側が非対応でも送信は可能 )Content-Type および送信内容を
JavaScript で組み立てて発行 ( バイナリも可 )
従来不可能だったファイルのアップロードのCSRF が攻略可能になった
OWASP Japan Local Chapter Meeting #8 #owaspjapan
CSRF
対策従来同様、副作用を持つ全ての箇所にトーク
ンを要求する<form method="POST" action="upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="hidden" name="token" value="2ACE730295E23F2C"> <input type="submit"></form>
HTM5 時代の CSRF 対策
OWASP Japan Local Chapter Meeting #8 #owaspjapan
HTML5 時代の CSRF 対策
XMLHttpRequest を明示するリクエストヘッダを付与 ( これだけ !!)xhr = new XMLHttpRequest();xhr.open( "POST", "/inquiry", true );xhr.setRequestHeader( "Content-Type", "..." );xhr.setRequestHeader( "X-Requested-With","XMLHttpRequest");xhr.send( params );
POST http://example.jp/inquiry HTTP/1.1Host: example.jpUserAgent: Mozilla/5.0X-Requested-With: XMLHttpRequestContent-Type: application/x-www-form-urlencoded
OWASP Japan Local Chapter Meeting #8 #owaspjapan
HTML5 時代の CSRF 対策
罠サイトからの <form> による POSTでは X-Requested-With リクエストヘッダは付与されない
POST http://example.jp/inquiry HTTP/1.1Host: example.jpUserAgent: Mozilla/5.0Referer: http://trap.example.com/Content-Type: application/x-www-form-urlencoded
<body onload="javascript:forms[0].submit()"><form method="POST" action="http://example.jp/inquiry"><input type="hidden" value="..."></form>
OWASP Japan Local Chapter Meeting #8 #owaspjapan
HTML5 時代の CSRF 対策罠サイトからの XHR による POST では罠
サイトを指す Origin ヘッダを持つPreflight リクエストが発行される
OPTIONS /inquiry HTTP/1.1Host: example.jpUserAgent: Mozilla/5.0Origin: http://trap.example.comAccess-Control-Request-Method: POSTAccess-Control-Request-Headers: X-Requested-With
xhr = new XMLHttpRequest();xhr.open( "POST", "http:/example.jp/inquiry", true );xhr.setRequestHeader( "Content-Type", "..." );xhr.setRequestHeader( "X-Requested-With","XMLHttpRequest");xhr.send( params );
OWASP Japan Local Chapter Meeting #8 #owaspjapan
HTML5 時代の CSRF 対策
サーバ側で X-Requested-With ヘッダと Origin ヘッダを確認することでCSRF 対策が可能セッションの保持が不要クロスドメイン POST での CSRF 対策も可
能JavaScript 必須<form> と違いページ遷移しないDNS rebinding 対策必須
まとめConclusion
OWASP Japan Local Chapter Meeting #8 #owaspjapan
まとめ
オープンリダイレクトJS によるオープンリダイレクトが増加傾向転送先 URL を事前に固定リストで保持
CSRFJS によってファイルアップロードが可能XHR ではセッションなしに CSRF 対策可能
質問タイムQuestion ?
OWASP Japan Local Chapter Meeting #8 #owaspjapan
Question? 質問
[email protected]@netagent.co.jp
@hasegawayosuke
http://utf-8.jp/