利用sql报错帮助进行sql注入

我们可以利用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:想必这也是会有错误页面的原因)!

原文地址:https://www.cnblogs.com/zjdyl/p/4248950.html