SQLインジェクションの見つけ方の例-その2-
送信した値ごとの応答結果の差分を見て判定したりもする。
SELECT * FROMmember WHERE name = 'tanaka' AND 'a' = 'a';
条件式が真
送信値:tanaka' AND 'a' = 'a
構成されるSQL文
検索結果:1件
田中
SELECT * FROM member WHERE name = 'tanaka' AND 'a' = 'b';
条件式が偽
送信値:tanaka' AND 'a' = 'b
構成されるSQL文
検索結果:0件
なし
SELECT * FROM member WHERE name = 'tanaka' BND 'a' = 'a';
文法として逸脱しているもの
送信値:tanaka' BND 'a' = 'b
構成されるSQL文 エラー
例えばor条件だと
UPDATE member SETpassword = 'xxxx' WHERE id = 1;
本来の意図する処理
受け渡す値:1
UPDATE member SET password = 'xxxx' WHERE id = 1 OR 1 = 1;
カラム名「id」が1の値となっているレコードのみ、カラム名
「password」の値をxxxxに更新する
or条件のSQL文の断片を渡した場合
受け渡す値:1 OR 1 = 1
全てのレコードのカラム名「password」の値をxxxxに更新するこ
とになってしまう!
34.
複文もヤバい場合がある
UPDATE member SETpassword = 'xxxx' WHERE flag = 1 AND id = 1;
本来の意図する処理
受け渡す値:1
カラム名「flag」が1の値かつカラム名「id」が1の値となっているレ
コードのみ、カラム名「password」の値をxxxxに更新する
複文となるSQL文の断片を渡した場合
受け渡す値: 1; SELECT 1;--
カラム名「flag」が1の値となっている全てのレコードのカラム名
「password」の値をxxxxに更新することになってしまう!
UPDATE member SET password = 'xxxx' WHERE flag = 1; SELECT 1;-- AND id = 1;