在这个剧本中,当用户输出正常的用户名和暗码,假定值分离为 zhang3、abc123,则提交的 SQL 语句以下: 复制代码 代码以下:
SELECT * FROM tbl_users
WHERE username='zhang3' AND password = 'abc123' LIMIT 0,1
假如进击者在 username 字段中输出:zhang3' OR 1=1 #,在 password 输出 abc123,则提交的 SQL 语句酿成以下: 复制代码 代码以下:
SELECT * FROM tbl_users
WHERE username='zhang3' OR 1=1 #' AND password = 'abc123' LIMIT 0,1
因为 # 是 mysql中的正文符, #以后的语句不被履行,完成上这行语句就成了: 复制代码 代码以下:
SELECT * FROM tbl_users
WHERE username='zhang3' OR 1=1
如许进击者就能够绕过认证了。假如进击者晓得数据库布局,那末它构建一个 UNION SELECT,那就更风险了:
假定在 username 中输出:zhang3 ' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #
在password 输出: abc123,
则提交的 SQL 语句酿成: 复制代码 代码以下:
SELECT * FROM tbl_users
WHERE username='zhang3 '
OR 1 =1 UNION select cola, colb,cold FROM tbl_b #' AND password = 'abc123' LIMIT 0,1
如许就相当风险了。假如agic_quotes_gpc选项为 on,引号被本义,则下面进击者构建的进击语句就会酿成如许,从而没法到达其目标: 复制代码 代码以下:
SELECT * FROM tbl_users
WHERE username='zhang3\' OR 1=1 #'
AND password = 'abc123'
LIMIT 0,1
SELECT * FROM tbl_users
WHERE username='zhang3 \' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #'
AND password = 'abc123' LIMIT 0,1
二. magic_quotes_gpc = On 时的注入进击
当 magic_quotes_gpc = On 时,进击者没法对字符型的字段停止 SQL 注入。这其实不代表这就平安了。这时候,可以经由过程数值型的字段停止SQL注入。
在最新版的 MYSQL 5.x 中,已严厉了数据类型的输出,已默许封闭主动类型转换。数值型的字段,不克不及是引号标志的字符型。也就是说,假定 uid 是数值型的,在之前的 mysql 版本中,如许的语句是正当的: 复制代码 代码以下:
INSERT INTO tbl_user SET uid="1";
SELECT * FROM tbl_user WHERE uid="1";
在最新的 MYSQL 5.x 中,下面的语句不是正当的,必需写成如许: 复制代码 代码以下:
INSERT INTO tbl_user SET uid=1;
SELECT * FROM tbl_user WHERE uid=1;