DVWA从入门到精通(十七):Open HTTP Redirect(开放重定向)
摘要本文是《DVWA从入门到精通》系列的第十七篇带你全面掌握Open HTTP Redirect开放重定向模块的攻防全流程。从HTTP重定向的基本原理出发逐步讲解Low、Medium、High三个级别的攻击手法与源码分析并深入探讨Impossible级别的终极防御方案。文章包含绝对URL与相对路径的绕过、协议头过滤的多种绕过技巧、参数注入绕过、以及严格白名单防御等核心技术让你真正做到“知其然更知其所以然”。一、什么是开放重定向1.1 重定向的基本原理HTTP重定向是Web应用中非常常见的功能——当你在浏览器中访问一个URL时服务器除了直接返回网页内容还可以告诉你“这个资源不在这儿你去另一个地方找吧”。服务器会返回一个3xx系列的状态码如302 Found并在响应头中加上Location: 新的URL浏览器看到这个响应后会自动跳转到新的地址。这个过程本身是完全合法且必要的比如网站改版换域名用户登录后跳回原来访问的页面短链接服务跳转到目标地址1.2 开放重定向漏洞的本质开放重定向Open Redirect漏洞的根源在于应用程序允许用户通过参数如?redirect控制跳转的目标地址但没有对这个地址进行严格的检查和限制。用一个生活化的例子来理解你家小区门禁很严陌生人进不来。但你家有个后门门上贴了个纸条写着“推开门就能到XX地方”。攻击者不需要破解门禁只需要把纸条上的地址改成“到我的陷阱屋”然后骗一个小区居民去推那扇门。居民一看是小区内部的后门毫无防备地推开结果就中招了。开放重定向就是这个“后门”——网站本身是安全的门禁很严但重定向功能后门上的纸条被攻击者篡改了。从技术角度来看当Web应用程序接受不受信任的输入时可能会发生未经验证的重定向和转发这可能导致Web应用程序将请求重定向到包含在不受信任输入中的URL。攻击者可以将不受信任的URL输入修改为恶意网站从而成功发起网络钓鱼诈骗并窃取用户凭据。1.3 开放重定向的危害虽然开放重定向本身通常被归类为“中危”漏洞但它在实际攻击链中扮演着至关重要的角色危害说明钓鱼攻击攻击者构造一个看起来完全合法的链接域名是可信的用户点击后却被带到高仿的钓鱼页面恶意软件分发跳转的终点可以是一个自动下载恶意程序的页面绕过安全检测一些安全软件会检查链接的域名是否在黑名单攻击者先用白名单域名做第一次跳转绕过检测信任滥用用户看到的是来自可信域名的URL降低了警惕性会话劫持结合其他漏洞重定向可用于窃取用户的会话令牌1.4 常见触发场景开放重定向漏洞通常出现在以下场景登录后的跳转功能如/login?redirect/dashboard外部链接的跳转页面如/goto?url...OAuth认证的回调URL下载资源的重定向短链接服务二、准备工作2.1 靶场环境确保DVWA已部署并正常运行访问地址http://你的服务器IP/dvwa/login.php使用admin/password登录2.2 必备工具工具用途浏览器Chrome/Firefox访问靶场观察跳转行为Burp Suite抓包分析、修改请求参数Medium/High级别必需2.3 基础知识储备理解HTTP状态码3xx系列了解URL的组成部分协议、域名、路径、参数了解header(location: ...)函数的工作原理三、Low级别毫无防护的“裸奔”状态3.1 安全级别设置将DVWA Security设置为Low级别然后进入Open HTTP Redirect模块。3.2 界面观察Open HTTP Redirect模块的页面显示了两个链接——“Quote 1”、“Quote 2”。点击任意一个链接页面会跳转到一个显示引文的页面同时URL中会出现redirect参数。例如点击“Quote 1”后地址栏变为3.3 源码分析查看Low级别的核心代码?php if (array_key_exists (redirect, $_GET) $_GET[redirect] ! ) { header (location: . $_GET[redirect]); exit; } http_response_code (500); ? pMissing redirect target./p ?php exit; ?这段代码存在致命的开放重定向漏洞缺陷说明无任何过滤不检查redirect参数的值是否合法无白名单/黑名单不限制重定向的目标范围直接信任用户输入用户说什么就跳转到哪里无协议验证不检查是否跳转到外部域名3.4 攻击方法直接跳转到任意网站由于Low级别没有任何防护攻击者可以直接将redirect参数修改为任意URL。第一步构造恶意URL在浏览器地址栏中输入http://10.0.0.149/vulnerabilities/open_redirect/source/low.php?redirecthttps://www.baidu.com第二步观察结果页面立即跳转到了百度首页。第三步构造钓鱼链接攻击者可以将这个链接伪装成合法的DVWA链接发给受害者http://10.0.0.149/vulnerabilities/open_redirect/source/low.php?redirect//10.0.0.149/test.html放心点击结果被带到了钓鱼网站//10.0.0.149/test.html。3.5 Low级别总结缺陷说明无任何过滤用户输入直接被用作重定向目标可跳转到任意外部URL包括钓鱼网站、恶意软件站点高危漏洞可被用于大规模钓鱼攻击四、Medium级别协议头过滤的“第一次尝试”4.1 安全级别设置将DVWA Security切换为Medium级别。4.2 观察变化在Medium级别下尝试Low级别的方法直接输入https://www.baidu.com发现被阻止了——页面显示“Absolute URLs not allowed”不允许绝对URL。4.3 源码分析查看Medium级别的核心代码?php if (array_key_exists (redirect, $_GET) $_GET[redirect] ! ) { if (preg_match (/http:\/\/|https:\/\//i, $_GET[redirect])) { http_response_code (500); ? pAbsolute URLs not allowed./p ?php exit; } else { header (location: . $_GET[redirect]); exit; } } http_response_code (500); ? pMissing redirect target./p ?php exit; ?Medium级别的变化改进说明增加了协议头过滤使用正则表达式匹配http://和https://4.4 正则表达式的局限Medium级别只过滤了以http://或https://开头的绝对URL但存在多种绕过方式防护措施存在缺陷危害过滤http://、https://完整协议头未拦截//协议相对 URL过滤逻辑简陋仍可跳转任意外网用于网络钓鱼仅黑名单过滤关键词无域名白名单、无完整 URL 解析校验中危漏洞防护不彻底4.5 攻击方法双斜杠协议继承攻击者可以使用双斜杠//http://10.0.0.149/vulnerabilities/open_redirect/source/medium.php?redirect//www.baidu.com浏览器会继承当前页面的协议http或https自动补全为http://www.baidu.com或https://www.baidu.com。4.6 Medium级别总结防护改进Medium防护原理局限性 / 绕过方式正则黑名单拦截http://、https://使用正则匹配完整协议头禁止绝对 URL 跳转拦截带 http/https 的外网地址1. 协议相对 URL//域名可直接绕过无协议标识不触发正则匹配2. 仍无域名白名单、无路径校验跳转目标完全可控五、High级别白名单参数的“路径限制”5.1 安全级别设置将DVWA Security切换为High级别。5.2 观察变化在High级别下尝试Medium级别的各种绕过方法www.baidu.com、//www.baidu.com发现都被阻止了。5.3 源码分析查看High级别的核心代码?php if (array_key_exists (redirect, $_GET) $_GET[redirect] ! ) { if (strpos($_GET[redirect], info.php) ! false) { header (location: . $_GET[redirect]); exit; } else { http_response_code (500); ? pYou can only redirect to the info page./p ?php exit; } } http_response_code (500); ? pMissing redirect target./p ?php exit; ?High级别的变化改进说明简易白名单校验强制要求 redirect 参数字符串内必须包含info.php子串strpos () 包含匹配检测仅校验是否存在目标字符串不校验域名、路径前后位置非法地址拦截不携带info.php的任意跳转地址直接返回 500 错误拒绝5.4 白名单的漏洞内嵌URL绕过High 级别仅要求字符串中存在info.php未限制 info.php 出现的位置、不校验整体地址是站内还是外网。 本漏洞利用方式为外网 URL 内嵌合法关键字绕过在外部网址中插入info.php子串满足 strpos 检测直接跳转外网。5.5 攻击方法一外部 URL 内嵌关键字绕过构造可利用Payloadhttp://10.0.0.149/vulnerabilities/open_redirect/source/high.php?redirecthttps://www.baidu.com/?paraminfo.php原理分析redirect 完整值https://www.baidu.com/?paraminfo.phpstrpos 检测到字符串包含info.php校验直接放行服务端将完整外网链接传入Location响应头浏览器直接跳转百度外网成功突破限制实现外部跳转。结果成功跳转到外部网站5.6 攻击方法二查询字符串注入Payloadhttp://10.0.0.149/vulnerabilities/open_redirect/source/high.php?redirectinfo.php%3Fid%3D1%26next%3Dhttps://www.baidu.comURL 解码后info.php?id1nexthttps://www.baidu.com原理与真实效果high.php 通过 strpos 检测到info.php放行并重定向到站内的 info.phpDVWA 原生info.php仅为信息展示页面无读取 next 参数的跳转代码页面只会停留在站内不会自动跳转外部百度该利用方式在原生 DVWA 环境下完全无效。5.7 High级别总结防御机制作用绕过方法 局限性强制 redirect 包含 info.php拦截不含该字符串的跳转地址1. 外网 URL 参数内嵌 info.php一步直接跳转外网稳定可用2. info.php 拼接跳转参数仅理论可行DVWA 原生 info 无跳转逻辑无法出网strpos 宽松匹配白名单仅校验关键字是否存在不校验整体域名只做字符串包含检测不区分站内 / 外部域名防护逻辑存在重大缺陷六、Impossible级别终极防御方案6.1 安全级别设置将DVWA Security切换为Impossible级别。6.2 源码分析查看Impossible级别的核心代码?php $target ; if (array_key_exists (redirect, $_GET) is_numeric($_GET[redirect])) { switch (intval ($_GET[redirect])) { case 1: $target info.php?id1; break; case 2: $target info.php?id2; break; case 99: $target https://digi.ninja; break; } if ($target ! ) { header (location: . $target); exit; } else { ? Unknown redirect target. ?php exit; } } ? Missing redirect target.6.3 Impossible级别的严格白名单防御Impossible级别采用了最严格的防御策略防御层技术手段作用第一层强类型校验is_numeric()仅允许数字传入 redirect 参数直接拦截所有字符串、URL、带特殊符号输入第二层Switch数字映射固定跳转地址输入数字1/2/99一对一绑定写死的跳转目标无任何自定义拼接第三层其余全部拦截非数字、不在case内的数字均提示未知跳转目标拒绝执行重定向6.4 为什么Impossible级别无法被绕过攻击方式Impossible 防护逻辑能否成功利用直接输入外部 URLbaidu 等先校验is_numeric()字符串直接拦截❌ 完全失效High 级别绕过URL 内嵌 info.phppayload 是字符串无法通过数字校验❌ 完全失效// 省略协议头、URL 编码、参数拼接全部属于字符串第一层校验直接拦截❌ 完全失效多参数污染 HPP、嵌套查询串参数值非数字无法进入 switch 逻辑❌ 完全失效精确白名单匹配是防御开放重定向的唯一正确方式——只允许跳转到预定义的安全目标拒绝一切其他输入。七、防御开放重定向的最佳实践通过DVWA四个级别的对比我们可以总结出防御开放重定向的最佳实践7.1 必须实施的防御措施措施说明优先级固定映射 / 严格白名单预定义有限跳转标识一一绑定目标地址禁止用户直接传入 URL⭐⭐⭐⭐⭐拒绝用户直接传入 URL不把用户输入直接拼入 Location 响应头⭐⭐⭐⭐⭐禁用包含式匹配strpos禁止仅检测关键字存在极易被绕过⭐⭐⭐⭐⭐校验域名归属若允许外跳使用可信域名列表白名单禁止任意外网⭐⭐⭐⭐7.2 推荐的辅助措施措施说明优先级优先站内相对路径限制仅站内页面跳转彻底杜绝外网跳转风险⭐⭐⭐⭐跳转确认页面跳转至外部站点前增加弹窗 / 页面提示告知用户即将离开本站⭐⭐⭐重定向行为日志记录记录跳转参数、客户端 IP方便事后审计溯源⭐⭐限制跳转次数、有效期防止恶意批量钓鱼链接分发⭐⭐7.3 常见误区在实际开发中以下做法不能有效防御开放重定向仅黑名单过滤http://、https://可被//协议相对 URL 绕过Medium 级别缺陷使用strpos做关键字包含校验仅要求字符串携带指定文本High 级别缺陷直接接收完整 URL 作为参数不做任何域名校验Low 级别高危缺陷URL 编码、正则过滤关键词存在大量变形绕过手段。八、开放重定向的实战检测思路在实际的渗透测试中如何快速发现开放重定向漏洞8.1 检测步骤抓包寻找页面跳转相关 GET/POST 参数传入外部 URLhttps://baidu.com测试是否直接跳转若拦截完整 http 协议使用//baidu.com协议相对地址绕过测试若要求包含指定关键字在外网 URL 路径 / 参数内拼接关键字测试若仅接收数字 / 固定标识尝试枚举所有映射值判断是否存在可控外跳观察是否存在二次跳转页面可拼接跳转参数实现间接出网。8.2 常见参数名参数名说明redirect最通用跳转参数url、target、dest、destination页面跳转、文件跳转常用return、return_to、continue、next登录 / 注册完成回调跳转goto、link简易页面跳转callbackOAuth、第三方登录回调高危参数8.3 常见绕过手法汇总防护类型绕过方法对应级别无任何过滤直接传入完整外部 URLLow黑名单过滤 http/https 协议头双斜杠//协议相对地址、特殊协议变形Mediumstrpos 关键字包含校验需携带指定字符串在外部 URL 的查询参数 / 路径中内嵌指定关键字High数字强校验 固定地址映射白名单不存在可用绕过方式Impossible九、总结本文完整完成了开放重定向漏洞的原理学习、分级实战与防御总结系统掌握了该漏洞的完整攻防体系。我们首先理解了开放重定向的核心原理即Web应用未对用户可控的跳转参数做严格校验允许攻击者篡改重定向目标地址进而实现跳转劫持该漏洞主要危害为网络钓鱼、恶意程序分发、站点信任滥用及安全策略绕过在社工攻击链中具备重要利用价值。在分级实战中Low级别无任何过滤校验攻击者可直接修改redirect参数跳转至任意外部恶意网址Medium级别采用正则黑名单过滤http://与https://协议头存在明显防护缺陷可通过双斜杠协议相对地址等方式轻松绕过并非可靠防护手段High级别采用strpos字符串包含校验机制要求参数必须携带info.php关键字原文所述参数污染绕过方式并不成立真实有效绕过方式为在外部URL中内嵌info.php关键字欺骗服务端校验实现外网跳转Impossible级别摒弃了不安全的字符串匹配逻辑采用数字强类型校验固定地址映射的终极白名单机制并非in_array完全匹配通过预设固定跳转标识绑定可信目标地址完全杜绝用户可控篡改跳转目标的可能性彻底修复开放重定向漏洞。最后本文总结了开放重定向的安全防御最佳实践杜绝黑名单过滤、模糊包含匹配等不安全写法坚持采用精准固定映射白名单、禁止用户直接控制跳转目标、校验可信域名范围等核心防护手段。开放重定向虽多为中危漏洞但却是钓鱼社工攻击的核心跳板依托可信域名降低用户警惕性危害极大生产环境中通过严格白名单限制、杜绝用户可控跳转参数的组合防护方式可彻底根除该类漏洞风险。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。

相关新闻

最新新闻

日新闻

周新闻

月新闻