[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
徳丸浩の日記
2008年08月22日 XSS
_今こそXSS対策についてまとめよう
沢出水(さわ いずみ)さんからトラックバックを頂戴した。
元々はホワイトリスト方式の優位は神話というエントリでホワイトリストはどう作る?を引用(批判)した事が発端の模様です。
一見真っ向対決しているようなので興味深く読ませていただいたのですが、正直、両者の主張の違いがわかりません。
どちらもXSS等インジェクション系の対策としてはアプリケーションで入力値が正しい形式の範囲内かチェックし、出力時に必要なエスケープ処理を行う、という結論に思えるんですけど…
[ホワイトリストとブラックリストより引用]
ご指摘の通りで、XSS対策は入り口でのバリデーションと表示(HTML組み立て)時のエスケープだ。しかし、元ブログの主題はホワイトリストとブラックリストの比較なので、「ただ、表面的に文章を追っただけでは『何をホワイトリストと呼ぶのか』という部分がだいぶ違う印象を受ける」というところこそが論点だったのだ。
しかし、本当に大切なことはXSS対策をどうするかなので、この機会にXSS対策についてまとめてみようと思う。
XSS対策の基本はバリデーション+エスケープ
「安全なウェブサイトの作り方改訂第3版」などでも指摘されているように、XSS対策の基本はバリデーションとエスケープだ。このうち、根本対策はエスケープの方で、バリデーション(検査)の方は保険対策となる。
入力値チェックはアプリケーションの仕様に従う
昨日の日記(プログラミングではホワイトリスティングが基本ではない)でも書いたように、入力値チェックはアプリケーションの仕様に従っておこなうしかない。その理由については以下のエントリで検討している。
当たり前のことなのだが、入力値検査を仕様よりも厳しく行うことはできない。そして、たいていのWebアプリケーションには、自由形式の入力欄がある(氏名や住所など)。だから、入力値検証だけでは、XSS対策として十分ではない。
XSS対策としてのエスケープが本質だがバリエーションが多い
入力値検査はXSS対策としては保険的な対策であるので、出力時のエスケープが本質的な対策となる。このテーマについては、過去さまざまな機会で取り上げてきた。
- 第2回 対策遅らせるHTMLエンコーディングの「神話」:ITpro
- 第3回 まだまだあるクロスサイト・スクリプティング攻撃法:ITpro
- XSS対策:どの文字をエスケープするべきなのか
- XSS対策:JavaScriptなどのエスケープ
- XSS対策:JavaScriptのエスケープ(その2)
- XSS対策:JavaScriptのエスケープ(その3)
- XSS対策:JavaScriptのエスケープ(その4)
- 画像ファイルによるクロスサイト・スクリプティング(XSS)傾向と対策
上記1.と2.では、エスケープがXSS対策の本質であることを説明したかったのだが、読者の便宜のためにXSS攻撃のバリエーションを多数紹介したところ、攻撃手法の方に関心が移ってしまったのではないかと懸念が生じた。それを補足するために、「XSS対策:…」で始まるエントリでは、XSSが発生する根本的な原理に立ち戻り、どの文字をどのようにエスケープするべきなのか、その考え方も含めて説明した。また、7.では文字エンコードに付随する問題に対する議論、8.では画像XSSに対する対策を説明を行っている。とくに8.は、とても手間の掛ったエントリなので、もっと広く読んでいただけたらなと思う(私はブログでも手抜きはしない流儀だ)。
ホワイトリストもプロアクティブも出てこない
過去のエントリを引用する形で、XSS対策の考え方を説明した。バリデーションは(ホワイトリストではなく)仕様に従って行う、エスケープはホワイトでもブラックでもない、ということで、プログラミング上のXSS対策にはホワイトリストもブラックリストも出てこない。プロアクティブという用語にしても、抽象的かつあいまいな用語で、セキュリティ業界ではバズワードと化しているし、そのような「怪しげな」用語を用いずに、具体的で意味の分かりやすい言葉を選んで説明すればすむことだ。
大切なことは原理から理論的に考えること
私が一貫して訴えていることは、脆弱性の根本原因を探り、そこを対策すべきということだ。ITproでの連載や、最近ではWASForumのカンファレンスでも説明したことだが、インジェクション系脆弱性の根本原因はリテラル(定数)が枠をはみ出し、命令として解釈されることだ。であれば、リテラルとしての正しいエスケープ方法を勉強して、リテラルの枠をはみ出さないようにすればよい。
大垣さんのブログには、「出力時に過剰とも言えるエスケープ処理」とあるが、多くの文字をエスケープすれは安全になるというものでもない。HTML上の場所に応じた適切なエスケープが必要だ
例を挙げよう。以下は、onloadイベントハンドラを動的生成している例である。
#!/usr/bin/perl use strict; use CGI; my $query = CGI->new(); my $a = "abc');alert(document.cookie)//"; my $ae = $query->escapeHTML($a); print <<END; Content-Type: text/html; charset=UTF-8 <html> <script> function a(b) {} </script> <body onload="a('$ae')"> </body> </html> END
PerlのescapeHTMLメソッドでエスケープしているし、上記CGIが生成するソースは、
<body onload="a('abc');alert(document.cookie)//')">
と一見よさそうに見えるかもしれないが、上記はalert関数が実行され、Cookie値が表示される。その理由は、JavaScriptに処理が渡る前にHTMLデコードされ、以下のようなスクリプトが実行されるからだ。
a('abc');alert(document.cookie)//')
正解は、いったんJavaScriptの文字列リテラルとしてエスケープしてから、HTMLのエスケープを行うことだが、よりよいガイドラインは、イベントハンドラやSCRIPT要素など、JavaScriptの動的生成を行わないことだ。
上記は、JavaScriptとしてのエスケープを怠っていることが原因であるので、HTMLエスケープをいくら「過剰」に行っても意味はない。
原理から正しく学ぶということは、HTMLなりJavaScriptの文法をしっかり学ぶことでもある。またエスケープを正しく行わないと、セキュリティ上の問題以外に、表示がおかしくなるなどの不具合が生じる。これはプログラマとして必須の知識なのだ。
攻撃技術の進歩に備えるためにこそ、原理からの対策を
大垣さんの指摘のように、攻撃側の技術は年々進歩している。だからといってXSS Cheat Sheetなどの攻撃手法から逆算的に防御方法を学ぶことはできない。仮にそうすれば、どうしても対症療法的になるので、大垣さんの言われる「プロアクティブな」防御法にはならない。対症療法だからこそ、「技術革新の早いWebシステムで具体的なホワイトリストの作成方法を書いても無意味となる可能性がある」のだろう。
そうではなく、原理から対策方法を学ぶことで、攻撃技術の進歩に一喜一憂する必要はなくなるのだ。そして、XSS Cheat Sheetなどの攻撃手法のドキュメントは、原理にもとづく対策方法に抜けや勘違いがないかをチェックする目的で使用すればよいだろう。たとえば、文字エンコードの問題が考慮から漏れていたとして、攻撃方法を学ぶことは、そのような抜けを見つけるのに役立つ。しかし、考慮不足が判明したら、その際には再び原理に立ち戻って対策を考えるのだ。そうすれば、XSS対策:JavaScriptのエスケープ(その4)で指摘しているように、文字エンコードの問題に「過剰なエスケープ」などで対症療法するのではなく、文字エンコードの誤りそのものをチェックするという正しい対策が生まれるのだ。
- http://pfrb.blog114.fc2.com/blog-entry-6.html ×12
- http://local-bookmark-ryshinoz.sqale.jp/entry/www.... ×1
- https://www.google.co.jp/ ×1577
- http://promamo.com/?p=2946 ×70
- http://chimiver.info/ ×60
- http://centossrv.com/bbshtml/webpatio/2249.shtml ×52
- https://www.google.com/ ×43
- http://tumblr.tokumaru.org/post/55958429832 ×38
- http://www.vniitest.ru/ ×27
- http://sk.golden-praga.ru/ ×27
- http://liderpak.ru/ ×22
- http://www.artparquet.ru/ ×21
- http://education-cz.ru/ ×21
- http://russ-tractor.ru/ ×19
- http://smolotkom.ru/ ×18
- http://richard-time.ru/ ×18
- http://portal-eu.ru/ ×18
- http://kredkonsalt.ru/ ×18
- http://golden-praga.ru/ ×18
- http://search.daum.net/ ×17
- http://www.tipkiller.com/ru/ ×15
- http://www.testagent.ru/ ×15
- http://sportliga.net/ ×15
- http://ruslan-motul.ru/ ×15
- http://dominterior.org/ ×15
- http://www.vip-penza.ru/ ×14
- http://prosmibank.ru/ ×14
- http://zebradudka.com/ ×12
- http://www.tipsoffice.com/ru/ ×12
- http://profxclan.org/ ×12
- http://notfastfood.ru/ ×12
- http://muizre.ru/ ×12
- http://mifilm.ru/ ×12
- http://forex.osobye.ru/forum ×12
- http://brus-vsem.ru/ ×12
- http://bigcities.org/ ×12
- http://banan.tv/ ×12
- http://atmagroup.ru/ ×12
- http://android-systems.ru/ ×12
- http://www.prostitutki-astana.org/ ×11
- http://www.artdeko.info/ ×11
- http://rus-teh.narod.ru/ ×11
- http://inzn.ru/ ×11
- http://game-top.su/ ×11
- http://y-mahata.s-tanno.com/pukiwiki/index.php?10_... ×10
- http://tumblr.tokumaru.org/ ×10
- http://blog.webcreativepark.net/2008/10/24-201629.... ×10
- http://zolotoy-lis.ru/ ×9
- http://www.smartpet.ru/ ×9
- http://www.respublica-otel.ru/ ×9
- http://www.prostitutki-tyumeni.org/ ×9
- http://www.prostitutki-donetska.org/ ×9
- http://www.news3d.org/ ×9
- http://www.da-hostel.ru/ ×9
- http://volkswagen.afora.ru/ ×9
- http://vetklinika.kz/ ×9
- http://soft-program.com/ ×9
- http://sergeevs.eu/ ×9
- http://ru-tao.kz/ ×9
- http://robot-forex.biz/ ×9
- http://q.hatena.ne.jp/1401954140 ×9
- http://oknakompani.ru/ ×9
- http://mypets.by/ ×9
- http://mtech-world.net/ ×9
- http://moesonce.com/ ×9
- http://kinohit1.ru/ ×9
- http://jove-wot.ru/ ×9
- http://games.kolossale.ru/ ×9
- http://blog.viagroid.ru/ ×9
- http://best-poppers.com.ua/ ×9
- http://belka-i-strelka.org/ ×9
- http://alif-ba-ta.com/ru/index.html ×9
- http://2kata.ru/ ×9
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×7
- http://www.world-mmo.com/ ×6
- http://www.tokumaru.org/ ×6
- http://www.tiens2010.ru/ ×6
- http://www.prostitutki-yaroslavlya.org/ ×6
- http://www.prostitutki-izhevska.org/ ×6
- http://www.losenkov.com/ ×6
- http://www.lazy-z.com/ ×6
- http://www.gurusmart.ru/chehol-akkumulyator-dlja-s... ×6
- http://www.fc-007.com/Page_1_Main.htm ×6
- http://vizag.kharkov.ua/index.php/service ×6
- http://vitanail.ru/ ×6
- http://vintasik.info/ ×6
- http://ventelnos.com/ ×6
- http://ufa-medosmotr.ru/ ×6
- http://tvoystartup.ru/ ×6
- http://traveluar.net/ ×6
- http://slavic-magic.ru/ ×6
- http://ruex.org.ua/ ×6
- http://rossmark.ru/ ×6
- http://referatinfo.org/ ×6
- http://pontorez.ru/ ×6
- http://pc-games.su/ ×6
- http://nordstar.pro/ ×6
- http://myaltai.ru/ ×6
- http://mrlupen.com/ ×6
- http://monylony.net/ ×6
- http://mastermolotok.ru/ ×6
- http://ladyselect.com/ ×6
- Xss 徳丸 ×7 / XSSによって生じる不具合 ×6 / XSS対策 ×6 / XSS イベントハンドラ ×5 / xss 対策 ×5 / xss 根本的対策 ×5 / xss 基本 ×5 / xss対策 ×4 / XSS 徳丸 ×4 / XSS 対策 ×4 / html xss 対策 ×4 / xss 対策法 ×4 / xss エスケープ ×4 / xss 攻撃手法 文字列 ×3 / xss javascript以外 ×3 / XSS エスケープ ×3 / XSS 手法 ×3 / メソッドXSS ×2 / javascript XSS 対策 ×2 / XSS 対策 javascript中 ×2 / XSSの検査 ×2 / XSS 攻撃手法 文字列 ×2 / 画像XSSの対策 ×2 / CGIプログラミング XSS対策 ×2 / XSS 入力チェック 漏れる ×2 / & エスケープする理由 xss ×2 / 入力値を変換 XSS対応 ×2 / xss 検証 アプリケーション ×2 / xss リテラル ×2 / javascript XSS ×2 / Spring セキュア エスケープ処理 ×1 / xss 検査 ×1 / xss 攻撃手法 文字列 hidden内 ×1 / xss 攻撃手法 文字列 alert使わない ×1 / xss 徳丸 ×1 / xss ソースの表示 ×1 / xss エスケープ 以外 ×1 / xss エスケープ破り ×1 / xss対策 jsp ×1 / xss対策 ホワイトリスト ×1 / xss エンコード ×1 / xss 攻撃手法 観点 ×1 / xss対策 入力 ×1 / struts xss ×1 / perl XSS対策 ×1 / jsp xss対策 ×1 / jsp XSS エスケープ ×1 / javascript xss encode ×1 / javascript エスケープ xss ×1 / javascript エスケープ関数 xss ×1 / java xss ×1 / java XSS 対策 ×1 / htmlエスケープ ホワイトリスト ×1 / history.back xss攻撃 ×1 / xss テスト方法 ×1 / XSS 基本 ×1 / XSS 対策 java エスケープ 方法 ×1 / XSS ホワイトリスト ×1 / XSS エスケープ処理回避 攻撃 ×1 / XSS エスケープ 入力 出力 ×1 / XSS対策 エンコード ×1 / XSS対策 検証 ×1 / XSS javascript 対策 ×1 / XSS 検証 ×1 / xss 検証ツール ×1 / JSP XSS 対策 方法 ×1 / クロスサイト エスケープ処理 ×1 / xss対策 ×1 / xss 原理 ×1 / 徳丸浩 画像 XSS ×1 / 徳丸 xss 対策 ×1 / 徳丸 struts ×1 / xss テスト ×1 / ホワイトリスト式チェックによる入力値検証 ×1 / クロスサイトスクリプティング 検査 ×1 / エスケープ XSS ×1 / 、DBの値出力時にエスケープを行う。 ×1 / xss quote エスケープ ×1 / "フロントエンド開発のためのセキュリティ" XSSの傾向と対策 ×1 / cgi バリデーション エスケープ ×1 / XSS 防御方法 ×1 / クロスサイトスクリプティング(XSS) 検査方法 ×1 / jsp xss 対策 ×1 / XSS 検証 サンプル ×1 / 徳丸浩 XSS ×1 / クロスサイトスクリプティング トークン cgi ×1
[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
HASHコンサルティング株式会社
最近の記事
- 2011年08月30日
- 1. RSSフィードをリダイレクトします
- 2011年07月01日
- 1.
- 2011年03月29日
- 1. PDO/MySQL(Windows版)の文字エンコーディング指定の不具合原因
- 2011年03月22日
- 1. PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
- 2011年01月27日
- 1. CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
- 2011年01月04日
- 1. escapeshellcmdの危険な実例
- 2011年01月01日
- 1. PHPのescapeshellcmdの危険性
- 2010年10月03日
- 1. 問題点の概要
- 2010年09月27日
- 1. 文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定
- 2010年07月25日
- 1. ツッコミSPAM対策で、ツッコミ抜きのRSSフィードを用意しました
- 2010年07月01日
- 1. ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
- 2010年04月06日
- 1. PROXY(プロキシ)経由でのDNSリバインディングと対策
- 2010年04月05日
- 1. JavaアプレットのDNSリバインディングはJRE側で対策済みだった
- 2010年03月29日
- 1. DNSリバインディングによる無線LANパスフレーズの読み出しに成功
- 2010年03月25日
- 1. DNSリバインディングによるルータへの侵入実験
- 2010年02月22日
- 1. ケータイtwitter(twtr.jp)においてDNS Rebinding攻撃に対する脆弱性を発見・通報し、即座に修正された
- 2010年02月12日
- 1. かんたんログイン手法の脆弱性に対する責任は誰にあるのか
- 2010年01月18日
- 1. iモードブラウザ2.0のXMLHttpRequestでPOSTデータの扱いが困難になった
- 2009年10月19日
- 1. quoteメソッドの数値データ対応を検証する
- 2009年10月14日
- 1. htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない
- 2009年10月09日
- 1. htmlspecialcharsのShift_JISチェック漏れによるXSS回避策
- 2009年09月30日
- 1. htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
- 2009年09月24日
- 1. SQLの暗黙の型変換はワナがいっぱい
- 2009年09月18日
- 1. 文字エンコーディングバリデーションは自動化が望ましい
- 2009年09月14日
- 1. 既にあたり前になりつつある文字エンコーディングバリデーション
- 2009年08月05日
- 1. 携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性
- 2009年03月28日
- 1. IPAは脆弱性の呼び方を統一して欲しい
- 2009年03月27日
- 2009年03月11日
- 1. U+00A5を用いたXSSの可能性
- 2008年12月22日
- 1. JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性