*本文来自于暗盾网络安全社区:https://bbs.andunsec.com*
报错信息必须在页面中回显。
原理:通过mysql一些函数 让其报错,产生超出预期的结果,并且报错信息中包含重要信息
用sqli第5关举例(以下是sqli第五关的源码)
报错注入用于有报错回显但是没有一个合适的数据返回点的时候。
学习两种报错注入的方法
基于xpath路径 报错(mysql5.1.5+)
基于group by 和 floor函数报错
基于xpath路径 报错
要先了解两个函数:
extractvalue(使用xpath表示法从xml字符串中提取值)
这是一个对xml文件进行查询的函数,更准确地说,它是会从目标xml文件中返回所包含查询值的字符串
updatexml(改变文档中符合xml片段的值)
extractvalue有两个参数
extractvalue(XML_document,XPath_string)
看得出来第二个参数要求的是Xpath格式的字符串,语法正确是会按照路径
/该xml文件/要查询的字符串 进行查询。如果我们输入的Xpath_string不对就会报错,而如果页面回显sql报错信息就可以得到我们想要的信息了。
XML_document 可以是anything。
正常使用:
报错使用:
首先要进入一个数据库,等等才能爆出我们在哪个数据库,先选择security数据库
use security;
select extractvalue(1,concat(0x7e,database()));
这里的0x7e是ASCII码的 符号~ (找不到这个路径就会报错)
既然以及回显出数据库名了,就可以利用联合注入学习过的流程去拿想要获取的数据了。
下面的流程不熟悉的可以重新学习联合注入里面的内容。
updatexml函数(这是个修改xml文件的函数)
它有三个参数 这个函数和extractvalue基本相同
updatexml('XML_document','Xpath_string','New_value')
或者:
updatexml('目标xml文件名','在xml中查询的字符串','替换后的值')
下面流程都是一样的 不熟悉的可以重新学习联合注入里面的内容。
基于group by 和 floor函数报错
原理 :在虚拟表里面插入重复的主键 导致报错
具体原理:
count(*)函数是用来计数的。
floor()函数 是用来取整(取最小整数)
rand()函数 用来生成伪随机数(0-1之间的一个小数)
如果我固定rand()的种子为14 那么就会生成一个伪随机数
floor和(rand(任意数)*2)配合使用,就会生成固定的0或1 如floor(rand(14)*2) (输出是固定的)
1.
select * from user;
2.
select * from user group by name;
这里的group by 意思是 根据name 分组
3.
select name,count(*) from user group by name;
count(*)函数是用来计数的。
第3条语句执行时执行group by 的时候 会创建一个虚拟表 里面有个主键,这里的主键从分类的name(查询的是name)里面获取。
虚拟表的主键不存在这个值的时候,就插入新记录
关键在于rand()的特殊性(如果使用rand()的话,该值会被计算多次)
在这里的意思就是,group by 进行分组时, floor(rand(14)*2)执行一次(查看分组是否存在),如果虚拟表中不存在该分组,那么在插入新分组的时候 floor(rand(14)*2) 就又计算了一次。(其实在上述 rand(14) 产生多个数据的时候,也能观察出来。只要 rand(14) 被调用,一定会产生新值)。所以会导致连续插入两次1,导致重复并且报错!
还是sqli第五关为例子 下面是爆当前库的语句
?id=1' union select 1,count(),concat(database(),0x7e,floor(rand(14)2)) as a from information_schema.tables group by a --+
修改database()位置,和information_schema.tables 就可以得到想要的数据
原文始发于微信公众号(网安之道):MySQL—报错注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论