Download - HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ その 2 : オープン リダイレクト 、 CSRF

Transcript
Page 1: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

HTML5 and SecurityPart 2: Open redirect and CSRF

HTML5 セキュリティ その 2 : オープンリダイレクト、 CSRF

Nov 14 2013Yosuke HASEGAWA

#owaspjapan

Page 2: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

自己紹介

はせがわようすけネットエージェント株式会社 株式会社セキュアスカイ・テクノロジー 技術顧問

Microsoft MVP for Consumer Security Oct 2005 -

http://utf-8.jp/

Page 3: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

お知らせannouncement

Page 4: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML5 調査報告 from JPCERT/CC

Page 5: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

オープンリダイレクトOpen redirect

Page 6: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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

Page 7: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

Open redirect オープンリダイレクト

実在した例site:www.microsoft.com/japan/ adult

Page 8: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

Open redirect オープンリダイレクト

リダイレクトの方法HTTP 応答として 301 または 302 を返すJavaScript による location オブジェクト

への代入<meta refresh>

Page 9: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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/

Page 10: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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;

Page 11: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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/&#x3b;url=http://evil/">

Page 12: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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

Page 13: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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/

Page 14: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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";

Page 15: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

CSRF

Page 16: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 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>

Page 17: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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>

Page 18: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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 );

Page 19: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

CSRF

XHR Lv.2 による CSRF 攻撃XHR ではクロスオリジンでリクエストを発

行可能 ( サーバ側が非対応でも送信は可能 )Content-Type および送信内容を

JavaScript で組み立てて発行 ( バイナリも可 )

従来不可能だったファイルのアップロードのCSRF が攻略可能になった

Page 20: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 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>

Page 21: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

HTM5 時代の CSRF 対策

Page 22: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 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

Page 23: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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>

Page 24: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

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 );

Page 25: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML5 時代の CSRF 対策

サーバ側で X-Requested-With ヘッダと Origin ヘッダを確認することでCSRF 対策が可能セッションの保持が不要クロスドメイン POST での CSRF 対策も可

能JavaScript 必須<form> と違いページ遷移しないDNS rebinding 対策必須

Page 26: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

まとめConclusion

Page 27: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

まとめ

オープンリダイレクトJS によるオープンリダイレクトが増加傾向転送先 URL を事前に固定リストで保持

CSRFJS によってファイルアップロードが可能XHR ではセッションなしに CSRF 対策可能

Page 28: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

質問タイムQuestion ?

Page 29: HTML5 and Security Part 2: Open redirect and CSRF HTML5 セキュリティ  その 2  :  オープン リダイレクト 、 CSRF

OWASP Japan Local Chapter Meeting #8 #owaspjapan

Question? 質問

[email protected]@netagent.co.jp

@hasegawayosuke

http://utf-8.jp/