exp()
原理概述
当传递一个大于709的值时,
函数exp()
就会引起一个溢出错误适用版本:5.5.5~5.5.49
对于数据较大的次方,其次方每增加1,其结果都将跨度极大,而mysql能记录的double数值范围有限,一旦结果超过范围,则该函数报错
故,当传递一个大于709的值时,函数exp()就会引起一个重叠错误。
如图:可以很明显的看到溢出错误
在MySQL
中,exp
与ln
和log
的功能相反,也就是log
和ln
都返回以e为底数的对数,而exp()
即为以e为底的对数函数,如图进行换算:
常见payload
1 | ------------------------------------------------------------------------ |
常见问题汇总
1、a或x代表什么?
a或x可以是任意的字母,代表的是查询返回的值组成一个集合,这个集合的名字为a或x或其他的,
2、~是什么意思?
当涉及到注入时,我们使用否定查询来造成“DOUBLE value is out of range
”的错误。
将0按位取反就会返回“18446744073709551615
”,再加上函数成功执行后返回0的
缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT
值。
1 | mysql> select ~0; |
我们通过子查询与按位求反,造成一个DOUBLE overflow error
,并借由此注出数据。
故~代表取反符号,取反原因见上
3、exp如果嵌套,那么执行顺序是什么?
拿``exp(~(select * from(select user())a))举例
- 先查询 select user() 这里面的语句,将这里面查询出来的数据作为一个结果集 取名为 a
- 然后 再 select * from a 查询a ,将 结果集a 全部查询出来
‘
4、select from a ,如果a为root@localhost,那么语句变为select from root@localhsot?没有root@localhost表怎么办?
做如下实验:
1 | >`exp(~(select*from(select user())x))` |
我们会发现会返回exp(~((select 'root@localhost' from dual)))
这便是通过子查询与按位求反,从而报错注出数据``root@localhost`
dual是一个虚拟表,用来构成select的语法规则,即虚拟表为了满足形如select ...from .....;
格式
比如select 'root@localhost' from dual;
oracle保证dual里面永远只有一条记录
数据库中都存在dual表,只是mysql中的dual表没有值select * from dual 这种语句会报错,而在Oracle中会返回一行记录(dual表有一条默认值),二者都可以用dual来满足语法结构。
updatexml()
原理概述
适用版本: 5.1.5+
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,了解Xpath语法
第三个参数:new_value,String格式,替换查找到的符合条件的数据作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而我们的注入语句为:
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: ‘:root@localhost’另外,updatexml最多只能显示32位,需要配合SUBSTR使用。
前后添加~使其不符合xpath格式从而报错。
我们通常在第二个xpath参数填写我们要查询的内容。
与exp()不同,updatexml是由于参数的格式不正确而产生的错误,同样也会返回参数的信息。
常见payload
1 | updatexml(1,concat(0x7e,(select user()),0x7e),1) |
extractvalue()
原理概述
适用版本: 5.1.5+
extractvalue():从目标XML中返回包含所查询值的字符串
extractvalue (XML_document, XPath_string)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
extractvalue注入的原理:依旧如同updatexml一样,extract的第二个参数要求是xpath格式字符串,而我们输入的并不是。所以报错。
常见payload
1 | and extractvalue(null,concat(0x7e,(select @@datadir),0x7e)); |