什么是整型报错注入
注入点的数据类型是整型,报错是信息的显示方式。
信息出现在报错语句中;mysql_error()函数返回MySQL操作产生的文本错误信息。
不能用group_concat()一次性列出所有数据,只能用limit依次猜解。
报错函数
Updatexml()
updatexml()函数是更新xml文档的函数。
语法updatexml(目标xml文档,xml路径,更新的内容)
extractvalue()
extractvalue() :对XML文档进行查询的函数
其实就是相当于我们熟悉的HTML文件中用标签查找元素一样
语法:extractvalue(目标xml文档,xml路径)
有一点需要注意,extractvalue()和Updatexml能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位
原理
例如:SELECT ExtractValue('', '/a/b');就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
(这里我们是为了学习报错注入,所以不需要太详细的知道该函数具体原理)
利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
updatexml()雷同
Floor()
关键函数的说明
rand(0)*2
rand() 可以产生一个在0和1之间的随机数。当我们提供一个种子参数 0 后,每次产生的值都是一样的。也可以称之为伪随机(产生的数据都是可预知的)。
为什么要乘以 2 呢?这就要配合 floor 函数来说了。
floor(rand(0)*2)
floor() 返回小于等于该值的最大整数。
之前我们了解到,rand() 是返回 0 到 1 之间的随机数,那么乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1。
为什么需要这两个数呢?
group by 与 count(*)
group by 主要用来对数据进行分组(相同的分为一组),这里与count() 结合使用。就是group by把相同的分为一组,count(*)统计每一组数目
报错原理
group by 进行分组时,floor(rand(0)*2)执行一次(查看分组是否存在),如果虚拟表中不存在该分组,那么在插入新分组的时候floor(rand(0)*2)就又计算了一次。(其实在上述 rand(0) 产生多个数据的时候,也能观察出来。只要 rand(0) 被调用,一定会产生新值)。
当 group by 对其进行分组的时候,首先遇到第一个值 0 ,发现 0 不存在,于是需要插入分组,就在这时,floor(rand(0)*2)再次被触发,生成第二个值 1 ,因此最终插入虚拟表的也就是第二个值 1 ;然后遇到第三个值 1 ,因为已经存在分组 1 了,就直接计数加1(这时1的计数变为2);遇到第四个值 0 的时候,发现 0 不存在,于是又需要插入新分组,然后floor(rand(0)*2)又被触发,生成第五个值 1 ,因此这时还是往虚拟表里插入分组 1 ,但是,分组 1 已经存在了!所以报错!
Exp()原理
exp()函数返回e(自然对数的底)的X次方的值。
当传递一个大于709的值时,函数exp()就会引起一个溢出错误。
~是一个位运算符,按位取反,~0就会返回184467744073709551615。又因为函数成功执行后会返回0,所以我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。
payload
参考文章
[学习基于extractvalue()和updatexml()的报错注入](https://blog.csdn.net/zpy1998zpy/article/details/80631036)
[sql报错注入:extractvalue、updatexml报错原理](https://www.cnblogs.com/laoxiajiadeyun/p/10488731.html)
[mysql的floor()报错注入方法详细分析](https://www.cnblogs.com/sfriend/p/11365999.html)
[SQL注入 | exp()函数报错](https://blog.csdn.net/weixin_41594045/article/details/83547103)
领取专属 10元无门槛券
私享最新 技术干货