MySQL 报错注入是一种 SQL 注入攻击技术,攻击者通过构造特殊的 SQL 语句,使数据库在执行时产生错误信息,从而泄露数据库结构、数据内容等敏感信息。这种攻击利用了数据库错误信息中包含的详细信息(如表名、列名、数据类型等)来获取数据。
当应用程序未对用户输入进行严格过滤,且会将数据库错误直接返回给用户时,攻击者可以通过构造包含错误触发函数的 SQL 语句,迫使数据库返回包含敏感信息的错误提示。
-
extractvalue()用于从 XML 字符串中提取值,当参数不符合 XML 格式时会报错,可用于泄露信息:
and extractvalue(1,concat(0x7e,(select user()),0x7e))
-
updatexml()用于更新 XML 文档,参数错误时会报错:
and updatexml(1,concat(0x7e,(select database()),0x7e),1)
-
floor() + rand() + group by利用 MySQL 分组统计时的特性触发错误:
and (select 1 from (select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.tables group by x)a)
-
严格过滤用户输入:对所有用户输入进行合法性校验,过滤特殊字符和 SQL 关键字。
-
使用参数化查询:采用预编译语句(如 PDO、PreparedStatement),避免直接拼接 SQL 字符串。
-
关闭错误信息暴露:在生产环境中禁用数据库错误信息直接返回给用户,改为自定义错误提示。
-
限制数据库用户权限:应用程序连接数据库的账号应仅授予必要权限,避免使用 root 等高权限账号。
-
定期安全审计:检查应用程序代码中可能存在的注入漏洞,及时修复。
报错注入会严重威胁数据库安全,开发时必须做好输入验证和输出过滤,从根本上防止 SQL 注入攻击。