0x01 简介
报错注入是sql注入的一种常见类型,通过构造特殊的sql语句,让信息以报错的形式显示出来。然而报错注入又有很多种,这里只写基于updatexml()和extractvalue()的报错注入,暂时先了解这两种吧。
0x02 一个简单的例子
打开一个sqli-labs环境,可以看到id=1时的返回结果
构造如下语句,可以看到,报错显示XPath语法错误并且返回了当前的数据库名
0x03 updatexml函数和extractvalue函数
UPDATEXML (XML_document, XPath_string, new_value);
- 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
- 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
- 第三个参数:new_value,String格式,替换查找到的符合条件的数据
- 作用:改变文档中符合条件的节点的值(改变XML_document中符合XPATH_string的值)
EXTRACTVALUE (XML_document, XPath_string);
- 这两个参数和上面的意思一样
- 作用:对XML文档进行查询(查询XML_document中符合XPATH_string的值)
0x05 原理分析
updatexml函数和extractvalue函数的第二个参数XPath_string未满足XPath语法,报错并带出关键信息。有一点需要注意,这两个函数能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取
0x04 Payload
updatexml
and updatexml(1,concat(0x7e,(select database()),0x7e),1)
extractvalue
and extractvalue(1,concat(0x7e,(select database()),0x7e))
还有很多骚操作,比如 有一道题的payload是这样的
1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,20)),0x7e),1)#
还有一道题是这样的
//无空格的注入语句
1'^updatexml(1,concat(0x7e,(select(database())),0x7e),1)#
0x05 更多报错注入方法
https://www.jianshu.com/p/2c281626a5dd
https://www.cnblogs.com/xdans/p/5412468.html