蓝域黑客测试:SQL注入-MYSQL报错注入原理分析
这篇是之前写的报错注入分析,有些地方表述不是很成熟 在测试注入无法回显数据时,报错注入是一种很好的选择。 0x00原理 构造 payload 让信息通过错误提示回显出来。 - 0x01 应用场景
Sqli-labs Less-5 存在报错注入的代码:
有点复杂哈,那么浓缩下来看,就是存在以下代码:
然后利用产生错误信息的语句(函数),在其中插入我们想要执行的语句之后,从而实现报错注入。 - 0x02 利用
凡是可以让错误信息显示的语句(函数),都能实现报错注入。
函数名称 | 利用
Tips: 以 0x 开始的数据表示16进制,0x7e 表示为 - 0x03 实践 floor() 报错原理
研究了这个几天,参考了一些博客,发现一些大佬表达能力比我强太多,脑壳疼...
刚才已经说了 利用 floor() 的报错注入实际上是由 rand() , count() , group by 三个函数语句联合使用造成的,想要搞清楚原理我们首先来分析单个,
我们通过 page 年龄这个字段来对表中数据分组:
可以看到我们出现了一个新的数据表,有 page 、 count(*) 这两个字段,count(*) 字段下表示每个年龄人的数量, Tips:这里有一点需要注意, group by 后跟的字段名是作为虚拟表的主键,主键不能重复,这也是报错的关键点。
报错的主要原因是虚拟表的主键重复,那我们来看一下是哪里,在什么情景下重复了。
这里加上 floor() 函数的用法:
所以,floor(rand()*2) 和 floor(rand(0)*2) 表示产生0或者1。
可以看到 floor(rand()*2) 产生的数值没有规律,而floor(rand(0)*2) 的规律是01101...,具体可以再多插入些数据测试下,肯定是这样的。
下面就是重中之重了,
执行前虚拟表为空,执行时, group by 根据 concat((select version()),0x7e,floor(rand(0)*2)) 分组,因为 floor(rand(0)*2) 是有规律的,所以第一次的生成结果为5.7.240 ,以 5.7.240 查询虚拟表发现虚拟表中没有该值的主键,所以就将这条语句的结果放入虚拟表中。在放入虚拟表中 函数会再次运算,这时候变成 5.7.241 ,所以插入的值变成了 5.7.241。
当原数据表只有一条时,显然 group by 只会分一组 主键唯一并不会报错,当数据变成两条以上时,如果查询第二条插入时运算结果变成 5.7.241 ,就会报错,而三条数据以上一定会报错。 查询第一条记录,执行
结果为 5.7.240 (第一次运算) ,查询虚拟表没有 5.7.240 的键值,插入时 group by concat((select version()),0x7e,floor(rand(0)*2)) 再次运算,结果为 5.7.241 (第二次运算),放在虚拟表中,此时表中
key | count(*) 查询第二条记录,再次执行 group by concat((select version()),0x7e,floor(rand(0)*2)) ,结果为 5.7.241 (第三次运算),查询发现 5.7.241 的键值存在,所以不会再次计算,直接 count(*)+1 ,此时表中
key | count(*) 查询第三条记录,再次执行 group by concat((select version()),0x7e,floor(rand(0)*2)) ,结果为 5.7.240 (第四次运算),虚拟表中没有键值为 5.7.240 ,所以插入数据,在插入时再次计算,作为主键 5.7.241 ,而此时 5.7.241 已经存在在虚拟表中,主键必须唯一,所以产生报错。 Tips:综上所述,当数据表记录大于三时,使用 group by floor(rand(0)*2) 一定报错。
总结:利用 floor() 函数,group by 子句,rand() 函数联用的报错注入是因为 group by 子句在查询虚拟表和插入虚拟表时,两次相同语句执行的结果不一致导致的错误报出。 extractvalue() 报错原理 函数解释:
第一个参数表示目标 xml 文档,第二个参数表示 xml 路径。
当我们尝试报错注入时:
Tips: extractvalue() 能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用 substring() 函数截取。 测试代码:
总结:利用 xpath 字符串格式报错进行注入,要注意查询字符长度限制。 updatexml() 报错原理 函数解释:
updatexml() 报错与 extractvalue() 报错类似,都是由于 xpath 格式错误报错,同样能查询字符串的最大长度为32,同样在第二个参数出插入我们需要的语句代码。 测试代码:
总结:利用 xpath 字符串格式报错进行注入,要注意查询字符长度限制。 |
版权保护: 本文由admin所发布,转载请保留本文链接: http://www.yemogege.cn/wzaq-stwz/343.html