MW211 EXIT

devlog
SQL/SQLインジェクション
2015年06月16日
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 = '■';                                      │
└──────────────────────────────────────┘
上記のようなSQL文を用意しておいて、画面から■の部分を入力してもらい、
任意の検索を行う場合を例にする。

以下のような値(文字列)を入力された場合…。
┌──────────────────────────────────────┐
│' OR 1 = 1;--                                                               │
└──────────────────────────────────────┘
そのままはめ込むと以下のようになってしまい(「--」以降はコメントとなる)
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 = '' OR 1 = 1;--';                           │
└──────────────────────────────────────┘
OR条件の「1 = 1」が如何なる時も成立してしまい全件ヒットする。

これが基本的なSQLインジェクション手法だ。

じゃ、「'」を「\'」に置換して、単なる文字にしてしまえばよいか?
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 = '\' OR 1 = 1;--';                          │
└──────────────────────────────────────┘
単なる「\' OR 1 = 1;--」という文字列で検索しにいくので成功!

それならこれでどうだ!
┌──────────────────────────────────────┐
│\' OR 1 = 1;--                                                              │
└──────────────────────────────────────┘
置換しなければ前出と同じなのだが、置換してしまうと以下のようになってしまう。
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 = '\\' OR 1 = 1;--';                         │
└──────────────────────────────────────┘
「'\\'」の部分が「\」という文字を意味することになり、
「1 = 1」が如何なる時も成立してしまう

ちなみに「'」を「''」に置換する場合も以下の通り。
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 WHERE 検索列 = '\'' OR 1 = 1;--';                         │
└──────────────────────────────────────┘
こちらは「'\''」が「'」という文字を意味するが他は同じ。全て成立してしまう。

そんなに簡単な話ではないのだ。
分類:SQL