https://www.cnblogs.com/c1047509362/p/12806297.html

XPATH 报错注入 (extractvalue() 和 updatexml() )

在mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数:
  • updatexml()
  • extractvalue()
当这两个函数在执行时,如果出现 xml文档路径错误 就会产生报错

updatexml()

  1. 功能: MySQL 数据库中用于在 XML 数据类型字段中更新指定值的函数

使用

  1. UPDATEXML(xml_target, xpath_expr, new_val)
  2. // xml_target:要更新的 XML 数据类型字段
  3. // xpath_expr:要更新的 XML 数据类型字段中指定元素的路径表达式
  4. // new_val:新的元素值
updatexml() 函数会在指定的 XML 数据类型字段中查找匹配 xpath_expr 元素路径表达式的元素,然后用新的元素值 new_val 来更新这个元素的值。 例如,对于以下 XML 字段:
  1. <book id="bk101">
  2. <author>Gambardella, Matthew</author>
  3. <title>XML Developer's Guide</title>
  4. <genre>Computer</genre>
  5. <price>44.95</price>
  6. <publish_date>2000-10-01</publish_date>
  7. <description>An in-depth look at creating applications
  8. with XML.</description>
  9. </book>
执行以下 SQL 语句:(修改 <price>44.95</price>)
  1. UPDATE books SET xml_column =
  2. UPDATEXML(xml_column, '/book/price', '49.95')
  3. WHERE id = 1;
这将用新的价格值 ‘49.95’ 更新 id=1 的 book 的价格.

漏洞成因

当我们的 xpath_expr出现错误, MYSQL 就会报出 XPATH 语法错误的消息,比如:

  1. select * from test where ide = 1 and (updatexml(1,0x7e,3));
由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误

extractvalue()

  1. 功能: 从XML文本字段中提取指定节点的值(或属性值)

使用

  1. EXTRACTVALUE(xml_target, xpath_expr)
  2. // xml_target是要提取值的XML文本字段
  3. // xpath_expr是表示要提取节点的路径
例如,如果有一个XML文本字段值如下:
  1. <book>
  2. <title>Java Programming</title>
  3. <author>John</author>
  4. </book>
如果我们要从此XML文本中提取title节点的值,可以使用如下的EXTRACTVALUE()函数:
  1. SELECT EXTRACTVALUE(xml_text, '/book/title') AS title
  2. FROM books
  3. WHERE book_id = 1;

漏洞成因

当我们的 xpath_expr出现错误, MYSQL 就会报出 XPATH 语法错误的消息,比如:

  1. 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>

其中,X是要进行整数化处理的数。 例如,如果有一个数值为3.14的字段,如果我们要获取其整数部分,可以使用如下的floor()函数:
  1. SELECT FLOOR(3.14);
执行后,返回结果为:
  1. +------+
  2. | FLOOR(3.14) |
  3. +------+
  4. | 3 |
  5. +------+
这样,floor()函数就完成了对数值的整数化处理操作。

漏洞成因

在利用之前我们首先要明白一点 group by的原理是什么?

group by在 Mysql 中的作用是用于将查询结果根据我们指定的列或表达式进行分组, 现在有一个关注点 分组那么要分组就必然会创建一个临时表来存储我们的数据吧,只有这样才能统计.

那么又是如何统计的?

group by会根据我们指定的列进行分组那么相应的我们指定的列就会成为主键, 现在又有一个关注点主键,主键在 Mysql 中具有唯一性, 当主键重复时就会报错

现在我们已经有了一个大概的思路,就是通过一系列方法导致临时表的主键重复报错

后续深入查看: Mysql报错注入之floor(rand(0)*2)报错原理探究 - FreeBuf网络安全行业门户

这个漏洞基本被修复了, CTF 可能会用