定义
报错注入是一种SQL注入类型,用于使SQL语句报错的语法,用于注入结果无回显但错误信息有输出的情况。返回的错误信息即是攻击者需要的信息。
MySQL的报错注入主要利用MySQL的一些逻辑漏洞,如BigInt大数溢出等,由此可以将MySQL报错注入主要分为以下几类
1、BigInt等数据类型溢出;
2、Xpath语法错误;
3、count()+rand()+group_by()导致重复;
4、空间数据类型函数错误。
常见函数
很多函数会导致MySQL报错并显示出数据:
1、floor函数;
2、extractvalue函数;(最多32字符)
3、updatexml函数;
4、exp()函数。
rand函数知识点预备

可以看到在rand()中未设置seed时产生的随机数不同

当设置了初始化种子后

floor函数知识点预备


count(),rand()以及group by的联合使用

select count(),floor(rand(0)2)x from users group by x;
先该语句会产生一张虚拟表count()-x,该虚拟表的主键是group by后指定的x,在初始时该虚拟表为空;在执行group by的过程中,一条一条的遍历user表,获得x字段的值,该x字段的值是通过floor(rand(0)2)计算得来;得到了x的值后,根据x的值将其插入count()-x表中,如果x字段的值在虚拟表count()-x中已经存在,就将count()的值增加1,如果x字段的值在虚拟表count()-x在虚拟表中不存在,就会将新的记录插入到该虚拟表中,在插入过程中又会执行一次floor(rand(0)2)的计算,因为floor(rand(0)2)是随机生成0、1数字,这也就有一定的几率导致在插入过程中生成的x的值与遍历原表过程中得到的x的值不一致,而因为只有0和1两种情况,一旦在插入过程中生成的x的值与遍历原表过程中得到的x值不一致,就会与虚拟表中已有记录的x值重复。又因为x是该虚拟表的主键,在该虚拟表中是不可以重复的,也就出现上面的报错
总的来说floor(rand(0)*2)在该语句中会执行两次,一次是在遍历原表中的数据的时候,会计算一次x的值;一次是当虚拟表中没有该x的值,准备将新的记录插入虚拟表中的时候。一旦这两次的计算结果不一致,就会导致插入过程的报错。
extractvalue函数的使用
为何要使用concat?
extractvalue函数在取值的时候遇到前面的报错截断直接执行完成,所以无法取值后面的有效信息,所以需要使用concat函数将二者链接起来。

updatexml函数的使用

exp()函数的使用

注意,exp()产生错误,但是并没有爆出database(),但是发现database()是表达式,在脚本语言中会转化为相应的值,从而爆出数据库名。
通过报错注入获得后端数据库的版本号

通过报错注入获取后端数据库的用户和名称

通过报错注入找到dvwa这个数据库对应的数据表,limit限制输入表的数量
(注:select table_name from information_schema.tables where table_schema='dvwa'必须用’()‘封装起来,是有这样这部分才能作为数据通过contat与错误信息拼接)

查询users表中的信息(admin和password)


此时需要注意的是取出的密码不是全的,原因是extractvalue函数取值数量的限制(32位)。

MID函数的介绍

利用MID函数取出完整password

网友评论