XPATH 报错注入 (extractvalue() 和 updatexml() )
在mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数:当这两个函数在执行时,如果出现 xml文档路径错误 就会产生报错
- updatexml()
- extractvalue()
updatexml()
- 功能: MySQL 数据库中用于在 XML 数据类型字段中更新指定值的函数
使用
updatexml() 函数会在指定的 XML 数据类型字段中查找匹配 xpath_expr 元素路径表达式的元素,然后用新的元素值 new_val 来更新这个元素的值。 例如,对于以下 XML 字段:
UPDATEXML(xml_target, xpath_expr, new_val)
// xml_target:要更新的 XML 数据类型字段
// xpath_expr:要更新的 XML 数据类型字段中指定元素的路径表达式
// new_val:新的元素值
执行以下 SQL 语句:(修改
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<price>44.95</price>
)
这将用新的价格值 ‘49.95’ 更新 id=1 的 book 的价格.
UPDATE books SET xml_column =
UPDATEXML(xml_column, '/book/price', '49.95')
WHERE id = 1;
漏洞成因
当我们的 xpath_expr
出现错误, MYSQL 就会报出 XPATH 语法错误的消息,比如:
由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误
select * from test where ide = 1 and (updatexml(1,0x7e,3));
extractvalue()
- 功能: 从XML文本字段中提取指定节点的值(或属性值)
使用
例如,如果有一个XML文本字段值如下:
EXTRACTVALUE(xml_target, xpath_expr)
// xml_target是要提取值的XML文本字段
// xpath_expr是表示要提取节点的路径
如果我们要从此XML文本中提取title节点的值,可以使用如下的EXTRACTVALUE()函数:
<book>
<title>Java Programming</title>
<author>John</author>
</book>
SELECT EXTRACTVALUE(xml_text, '/book/title') AS title
FROM books
WHERE book_id = 1;
漏洞成因
当我们的 xpath_expr
出现错误, MYSQL 就会报出 XPATH 语法错误的消息,比如:
select user,password from users where user_id=1 and (extractvalue(1,0x7e));
由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误
floor() 函数报错注入
使用
floor()是MySQL数据库中的一种数学函数,它可以返回一个数的整数部分。如果数已经是整数,则返回其本身。其语法如下:<font style="color:rgb(0, 0, 0);">FLOOR(X)</font>
执行后,返回结果为:
SELECT FLOOR(3.14);
这样,floor()函数就完成了对数值的整数化处理操作。
+------+
| FLOOR(3.14) |
+------+
| 3 |
+------+
漏洞成因
在利用之前我们首先要明白一点 group by
的原理是什么?
group by
在 Mysql 中的作用是用于将查询结果根据我们指定的列或表达式进行分组, 现在有一个关注点 分组
那么要分组就必然会创建一个临时表来存储我们的数据吧,只有这样才能统计.
那么又是如何统计的?
group by
会根据我们指定的列进行分组那么相应的我们指定的列就会成为主键, 现在又有一个关注点主键
,主键
在 Mysql 中具有唯一性, 当主键重复时就会报错
现在我们已经有了一个大概的思路,就是通过一系列方法导致临时表的主键重复报错
后续深入查看: Mysql报错注入之floor(rand(0)*2)报错原理探究 - FreeBuf网络安全行业门户
这个漏洞基本被修复了, CTF 可能会用