我们可以利用sql报错帮助进行sql注入,这里以sql server 为例:
sql查询时,若用group by子句时,该子句中的字段必须跟select 条件中的字段(非聚合函数)完全匹配,如果是select * ,那就必须将该表中所有列名都包含在group by 中;若少了哪个,就会报错,报错中会提示如下;
选择列表中的列 '列名'无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
这个提示的列名是按该表中的顺序来的,这时我们可以利用这点进行sql注入中枚举所有列的工作;
先使用 select * from 表名, having 1=1
这时报错中提示的便是第一个列名,
然后 select * from 表名, group by 第一个列名
这时报错中提示的便是第二个列名,
以此类推,便枚举出所有列
类似的,同过报错提示,还可以知道许多信息,比如,查询条件中与列名实际类型不符合时,会有类型转换失败提示,如:
select * from Class
where name=3
会提示:在将 nvarchar 值 '高数' 转换成数据类型 int 时失败。
这样我们就能知道 name 列的第一行内容;(在我尝试时发现报错都是尝试将字符转int,所以列名本来为int的,就无法使用,不知对不对?)
或where name=11/USER
提示:在将 nvarchar 值 'dbo' 转换成数据类型 int 时失败。
这样得到user变量的值(这个可用在全局变量和内置函数上,如@@version等等,据说还可以知道任意列名的值,但我没成功)
等等。
当然,数据库的报错一般情况下不会直接显示在应用界面,出现在应用界面的提示完全由程序决定;(ps:想必这也是会有错误页面的原因)!