SELECT Username, UserID, Password FROM Users WHERE Username = ‘user’ AND Password = ‘pass’
通过输入john’--作为用户名,将会构造出以下WHERE语句:
WHERE Username = ‘john’ --'AND Password = ‘pass’
这时,该语句不但符合SQL语法,而且还使用户跳过了密码认证。但是如果是另外一种WHERE语句:
WHERE (Username = ‘user’ AND Password = ‘pass’)
注意到这里出现了插入语符号,这时再使用john’--作为用户名,请求语句就会错误:
WHERE (Username = ‘john' --' AND Password = ‘pass’)
这是因为有未配对的插入语符号,请求语句就不会被执行。
SELECT ProdNum FROM Products WHERE (ProdID=1234) ORDER BY ProdNum --
AND ProdName=’Computer’) AND UserName=’john’
人 们往往会忽略的是ORDER BY语句后还可以使用数字指代列名,在上例中如果ProdNum是查询请求返回的记录中的第一列,则注入1234) ORDER BY 1--返回的结果是一样的。由于上例查询请求只返回一个字段,注入1234) ORDER BY 2 --就会出错,即返回的记录无法按指定的第二个字段排序。这样,ORDER BY就可以被利用来对列数进行统计了。由于每个SELECT语句都至少返回一个字段,故攻击者可以先在注入句法中添加ORDER BY 1来确定语句是否能被正确执行,有时对字段的排序也可能会产生错误,这时添加关键字ASC或DESC可以解决该问题。一旦确定ORDER BY句法是有效的,攻击者就会对排序列号从列1到列100进行遍历(或者到列1000,直到列号被确定为无效),理论上当出现第一个错误时,前一个列号就 是要统计的列数,但在实际情况中,有些字段可能不允许排序,那么在出现第一次错误时可以再多尝试一到两个数字,以确认列号已遍历完。
SELECT ProdNum,ProdType,ProdPrice,ProdProvider FROM Products
WHERE (ProdID=1234) UNION SELECT NULL,NULL,NULL,NULL
WHERE 1=2 -- AND ProdName=’ Computer’) AND UserName=’john’