报错注入常用的三种方式:floor()、extractvalue()、updatexml()

报错注入(Error-Based Injection)是一种利用数据库报错信息进行数据泄露的注入技术。攻击者通过构造特殊的 SQL 语句,导致数据库返回错误信息,从而获取数据库内部的敏感信息。本文将详细介绍三种常见的报错注入方式:floor()、extractvalue()、和 updatexml(),并说明它们的原理与使用方式。

一、floor() 报错注入

1.1 原理

floor() 是 MySQL 中的数学函数,通常用于返回小于或等于指定数值的最大整数。在报错注入中,通过利用 floor() 函数的数学运算,如果输入非法数据(如除以零),数据库将抛出错误,并返回错误信息。攻击者可以通过构造这样的注入语句来泄露数据库信息。

1.2 示例

假设有以下 SQL 查询:

SELECT * FROM users WHERE id = 1;

攻击者可能会构造如下注入语句:

SELECT * FROM users WHERE id = 1 AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x) a);

该查询语句利用 FLOOR(RAND(0)*2) 造成重复分组,导致数据库抛出错误。错误信息中将包含 database() 的结果,从而泄露数据库名。

1.3 防御措施

  1. 使用预编译语句:避免直接将用户输入嵌入 SQL 查询中,使用参数化查询。
  2. 隐藏错误信息:生产环境中不要将详细的数据库错误信息返回给用户,避免错误信息泄露系统内部信息。
  3. 输入验证和过滤:对输入数据进行严格的验证和过滤,避免恶意数据进入查询语句。

二、extractvalue() 报错注入

2.1 原理

extractvalue() 是 MySQL 中用于提取 XML 数据的函数。如果传入非法的 XPath 表达式,会导致数据库抛出错误。攻击者可以通过构造错误的 XPath 表达式,使数据库返回包含敏感信息的错误消息。

2.2 示例

假设有如下 SQL 查询:

SELECT * FROM users WHERE id = 1;

攻击者可能会构造如下注入语句:

SELECT * FROM users WHERE id = 1 AND extractvalue(1, CONCAT(0x7e, (SELECT database()), 0x7e));

此查询语句利用 extractvalue() 函数,传入非法的 XPath 表达式,并通过 CONCAT 函数将数据库名拼接到错误信息中。MySQL 将抛出错误并返回数据库名。

2.3 防御措施

  1. 使用预编译语句:避免直接拼接 SQL 查询,使用预编译语句来防止注入攻击。
  2. 隐藏错误信息:限制生产环境中错误信息的输出,避免详细错误信息暴露给用户。
  3. 验证输入数据:对输入数据进行严格的验证,确保合法性。

三、updatexml() 报错注入

3.1 原理

updatexml() 是 MySQL 中用于更新 XML 节点的函数。类似于 extractvalue(),updatexml() 也可以通过构造非法的 XPath 表达式来引发错误,利用错误信息泄露数据库内部的敏感数据。

3.2 示例

假设有如下 SQL 查询:

SELECT * FROM users WHERE id = 1;

攻击者可能会构造如下注入语句:

SELECT * FROM users WHERE id = 1 AND updatexml(1, CONCAT(0x7e, (SELECT version()), 0x7e), 1);

此查询利用 updatexml() 函数传入非法的 XPath 表达式,将 MySQL 版本号拼接到错误信息中。MySQL 会抛出错误,并在错误信息中泄露数据库版本号。

3.3 防御措施

  1. 使用参数化查询:通过参数化查询避免 SQL 注入,不要将用户输入直接拼接到 SQL 查询语句中。
  2. 隐藏详细错误信息:在生产环境中,将详细的错误信息记录到日志文件中,而不是直接返回给用户。
  3. 输入验证:对所有用户输入进行严格的合法性检查,避免恶意数据进入数据库查询语句。

四、思维导图

报错注入常用方式
    1. floor() 报错注入
        1.1 利用数学函数报错
        1.2 示例
        1.3 防御措施
    2. extractvalue() 报错注入
        2.1 利用 XPath 表达式报错
        2.2 示例
        2.3 防御措施
    3. updatexml() 报错注入
        3.1 利用 XPath 表达式报错
        3.2 示例
        3.3 防御措施

五、总结

报错注入是一种通过引发数据库错误信息来获取内部数据的技术,常见的报错注入方法包括 floor()、extractvalue() 和 updatexml()。通过利用这些函数在 SQL 查询中制造错误,攻击者可以从数据库的错误信息中提取敏感信息。防御报错注入的关键是使用参数化查询、隐藏详细错误信息以及对用户输入进行严格的验证和过滤。