HTML 5 and Security Part 2 Open redirect

  • Slides: 29
Download presentation
HTML 5 and Security Part 2: Open redirect and CSRF HTML 5セキュリティ その 2

HTML 5 and Security Part 2: Open redirect and CSRF HTML 5セキュリティ その 2 : オープンリダイレクト 、CSRF Nov 14 2013 Yosuke HASEGAWA #owaspjapan

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

自己紹介 はせがわようすけ v ネットエージェント株式会社 v 株式会社セキュアスカイ・テクノロジー 技術顧問 v Microsoft MVPfor Consumer Security Oct 2005 v http: //utf-8. jp/ OWASP Japan Local Chapter Meeting #8 #owaspjapan

お知らせ announcement

お知らせ announcement

HTML 5 調査報告 from JPCERT/CC OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML 5 調査報告 from JPCERT/CC OWASP Japan Local Chapter Meeting #8 #owaspjapan

Open redirect オープンリダイレクト v実在した例 site: www. microsoft. com/japan/ adult OWASP Japan Local Chapter Meeting

Open redirect オープンリダイレクト v実在した例 site: www. microsoft. com/japan/ adult OWASP Japan Local Chapter Meeting #8 #owaspjapan

Open redirect オープンリダイレクト vリダイレクトの方法 v. HTTP応答として 301または 302を返す v. Java. Scriptによるlocationオブジェクトへの 代入 v<meta refresh>

Open redirect オープンリダイレクト vリダイレクトの方法 v. HTTP応答として 301または 302を返す v. Java. Scriptによるlocationオブジェクトへの 代入 v<meta refresh> OWASP Japan Local Chapter Meeting #8 #owaspjapan

Redirect with 301 or 302 v脆弱な例 vオープンリダイレクトだけでなく HTTPヘッ ダインジェクションもある。 #!/usr/bin/perl use URI: : Escape;

Redirect with 301 or 302 v脆弱な例 vオープンリダイレクトだけでなく HTTPヘッ ダインジェクションもある。 #!/usr/bin/perl use URI: : Escape; my $url = uri_unescape( $ENV{QUERY_STRING} || '/' ); print "Status: 302 Foundn"; print "Location: $urlnn"; HTTP/1. 1 302 Found Date: Tue, 28 Feb 2013 12: 34: 56 GMT Location: http: //other. example. jp/ OWASP Japan Local Chapter Meeting #8 #owaspjapan

location with Java. Script v. Java. Scriptによるリダイレクト v. Java. Scriptコード増に伴い増加 // http: //example. jp/#/nextpage

location with Java. Script v. Java. Scriptによるリダイレクト v. Java. Scriptコード増に伴い増加 // http: //example. jp/#/nextpage var url = decode. URIComponent( location. hash. substring(1) ); location. href = url; vオープンリダイレクトだけ でなくXSSにも http: //example. jp/#javascript: alert(1) OWASP Japan Local Chapter Meeting #8 #owaspjapan

<meta refresh> v. IE 6, 7の<meta refresh>は癖がある v「; 」より後ろの URLが転送先に使用される <meta http-equiv="refresh" content="0; url=http:

<meta refresh> v. IE 6, 7の<meta refresh>は癖がある v「; 」より後ろの URLが転送先に使用される <meta http-equiv="refresh" content="0; url=http: //good/; url=http: //evil/"> v「; 」をエスケープしても防げない <meta http-equiv="refresh" content="0; url=http: //good/&#x 3 b; url=http: //evil/"> v<meta refresh>によるリダイレクトの動的 生成は避けたほうがよい OWASP Japan Local Chapter Meeting #8 #owaspjapan

オープンリダイレクトを防ぐために v転送先URLの確認…実は難しいよね vhttp: //example. com/ vhttp: \example. com/ vhttp: /example. com v/example. com /

オープンリダイレクトを防ぐために v転送先URLの確認…実は難しいよね vhttp: //example. com/ vhttp: \example. com/ vhttp: /example. com v/example. com / vその他にもいろいろ if( url. match( /^/[^/]/ ) ){ location. href = url; } // bad code OWASP Japan Local Chapter Meeting #8 #owaspjapan

オープンリダイレクトを防ぐために v. HTTPレスポンスヘッダの改行コード vブラウザによっては r、nどちらかだけで も改行とみなされる X-header: foo(0 x 0 D 0 x 0

オープンリダイレクトを防ぐために v. HTTPレスポンスヘッダの改行コード vブラウザによっては r、nどちらかだけで も改行とみなされる X-header: foo(0 x 0 D 0 x 0 A)Location: http: //example. com/ X-header: foo(0 x 0 D)Location: http: //example. com/ X-header: foo(0 x 0 A)Location: http: //example. com/ OWASP Japan Local Chapter Meeting #8 #owaspjapan

オープンリダイレクトを防ぐために v根本的対策 v転送先URLを事前にリストとして保持 #!/usr/bin/perl use URI: : Escape; my $index = uri_unescape( $ENV{QUERY_STRING} ||

オープンリダイレクトを防ぐために v根本的対策 v転送先URLを事前にリストとして保持 #!/usr/bin/perl use URI: : Escape; my $index = uri_unescape( $ENV{QUERY_STRING} || '' ); my $pages = { foo=>'/foo', bar=>'/bar', baz=>'/baz' }; my $url = $pages->{$index} || '/'; print "Status: 302 Foundn"; print "Location: $urlnn"; // Java. Scriptによるリダイレクト var pages = { foo: '/foo', bar: '/bar', baz: '/baz' }; var url = pages[ location. hash. substring(1) ] || '/'; location. href = url; OWASP Japan Local Chapter Meeting #8 #owaspjapan

CSRF

CSRF

CSRF v. XHR Lv. 2により攻撃しやすくなった v攻撃対象 : ファイルのアップロードフォー ム <form method="POST" action="upload" enctype="multipart/form-data"> <input

CSRF v. XHR Lv. 2により攻撃しやすくなった v攻撃対象 : ファイルのアップロードフォー ム <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 v従来の攻撃手法 v罠ページでは formを自動でsubmitする <body onload="document. forms[0]. submit(); "> <form method="POST" action="http: //target. example.

CSRF v従来の攻撃手法 v罠ページでは 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> vこれではファイルの中身は送信できない OWASP Japan Local Chapter Meeting #8 #owaspjapan

CSRF v. XHR Lv. 2によるCSRF攻撃 var xhr = new XMLHttp. Request(); var boundary =

CSRF v. XHR Lv. 2によるCSRF攻撃 var xhr = new XMLHttp. Request(); var boundary = '----boundary'; var file="abcd"; //送信するファイルの内容 var request; xhr. open( 'POST', 'http: //target. example. jp/upload', 'true' ); xhr. set. Request. Header( 'Content-Type', 'multipart/form-data; boundary=' + boundary ); xhr. with. Credentials = true; // Cookieを付与 xhr. onreadystatechange = function(){}; request = '--' + boundary + 'rn' + 'Content-Disposition: form-data; name="file"; ' + ' filename="filename. txt"rn' + 'Content-Type: application/octet-streamrn' + file + 'rn' + '--' + boundary + '--'; xhr. send( request ); OWASP Japan Local Chapter Meeting #8 #owaspjapan

CSRF v対策 v従来同様、副作用を持つ全ての箇所にトーク ンを要求する <form method="POST" action="upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="hidden"        name="token"

CSRF v対策 v従来同様、副作用を持つ全ての箇所にトーク ンを要求する <form method="POST" action="upload" enctype="multipart/form-data"> <input type="file" name="file"> <input type="hidden"        name="token" value="2 ACE 730295 E 23 F 2 C"> <input type="submit"> </form> OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTM 5時代のCSRF対策

HTM 5時代のCSRF対策

HTML 5時代のCSRF対策 v. XMLHttp. Requestを明示する リクエスト ヘッダを付与 (これだけ!!) xhr = new XMLHttp. Request(); xhr.

HTML 5時代のCSRF対策 v. XMLHttp. Requestを明示する リクエスト ヘッダを付与 (これだけ!!) xhr = new XMLHttp. Request(); xhr. open( "POST", "/inquiry", true ); xhr. set. Request. Header( "Content-Type", ". . . " ); xhr. set. Request. Header( "X-Requested-With", "XMLHttp. Request"); xhr. send( params ); POST http: //example. jp/inquiry HTTP/1. 1 Host: example. jp User. Agent: Mozilla/5. 0 X-Requested-With: XMLHttp. Request Content-Type: application/x-www-form-urlencoded OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML 5時代のCSRF対策 v罠サイトからの <form>によるPOSTで はX-Requested-Withリクエストヘッダ は付与されない <body onload="javascript: forms[0]. submit()"> <form method="POST" action="http: //example.

HTML 5時代のCSRF対策 v罠サイトからの <form>によるPOSTで はX-Requested-Withリクエストヘッダ は付与されない <body onload="javascript: forms[0]. submit()"> <form method="POST" action="http: //example. jp/inquiry"> <input type="hidden" value=". . . "> </form> POST http: //example. jp/inquiry HTTP/1. 1 Host: example. jp User. Agent: Mozilla/5. 0 Referer: http: //trap. example. com/ Content-Type: application/x-www-form-urlencoded OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML 5時代のCSRF対策 v罠サイトからの XHRによるPOSTでは罠サ イトを指す Originヘッダを持つ Preflightリ クエストが発行される xhr = new XMLHttp. Request(); xhr.

HTML 5時代のCSRF対策 v罠サイトからの XHRによるPOSTでは罠サ イトを指す Originヘッダを持つ Preflightリ クエストが発行される xhr = new XMLHttp. Request(); xhr. open( "POST", "http: /example. jp/inquiry", true ); xhr. set. Request. Header( "Content-Type", ". . . " ); xhr. set. Request. Header( "X-Requested-With", "XMLHttp. Request"); xhr. send( params ); OPTIONS /inquiry HTTP/1. 1 Host: example. jp User. Agent: Mozilla/5. 0 Origin: http: //trap. example. com Access-Control-Request-Method: POST Access-Control-Request-Headers: X-Requested-With OWASP Japan Local Chapter Meeting #8 #owaspjapan

HTML 5時代のCSRF対策 vサーバ側でX-Requested-Withヘッダと Originヘッダを確認することで CSRF対策 が可能 vセッションの保持が不要 vクロスドメイン POSTでのCSRF対策も可能 v. Java. Script必須 v<form>と違いページ遷移しない v.

HTML 5時代のCSRF対策 vサーバ側でX-Requested-Withヘッダと Originヘッダを確認することで CSRF対策 が可能 vセッションの保持が不要 vクロスドメイン POSTでのCSRF対策も可能 v. Java. Script必須 v<form>と違いページ遷移しない v. DNS rebinding対策必須 OWASP Japan Local Chapter Meeting #8 #owaspjapan

まとめ Conclusion

まとめ Conclusion

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

Question? 質問 hasegawa@utf-8. jp hasegawa@netagent. co. jp @hasegawayosuke http: //utf-8. jp/ OWASP Japan Local Chapter Meeting #8 #owaspjapan