Web笔记 | URL跳转漏洞(开放重定向)

URL跳转漏洞(也叫--开放重定向 Open Redirection), 出现在应用程序未对传入的跳转URL变量进行校验的时候,会导致用户被诱导跳转到恶意网站,或与XSS、SSRF、CSRF漏洞进行组合利用,绕过站点的安全防护。

URL 形如:https://example.com/login?return=https://PotentiallyEvil.com/

后端代码形如 (Java) :response.sendRedirect(request.getParameter("url"))

*可以理解为,要访问的网址本身设计了从 URL 的参数中跳转到另一个地址,如果这个跳转的参数可以为用户构造的参数值,那么会存在钓鱼的风险。当用户在已登录的状态下访问该链接时,可以绕过 Referrer 字段对 CSRF token 的校验(跳转时请求的 Referrer 携带当前站点信息),组合实现对 CSRF 漏洞的利用。

📍漏洞危害与影响

  1. 钓鱼、隐藏反射XSS Payload(因为URL的前部分是信任站点);
  2. 结合实现CSRF漏洞的利用,绕过对安全策略对Referrer的校验;
  3. 敏感信息泄露:根据Referrer Policy和URL所携带的参数,跳转后携带的Referrer信息可能会导致信息泄露。

有可能泄露的敏感信息类型示例(从 URL、Referrer 中泄露):

  • CSRF Token:如果Token放在URL中(GET请求),或通过Referrer传递;
  • OAuth2.0的授权码如果在URL中,且跳转目标不受控,可通过Referrer劫持授权码;
  • Authorization Token:Bearer Token或JWT如果放在URL参数中(如?token=xxx),会在Referrer中暴露;
  • URL 中出现的个人身份信息、地理位置/经纬度信息;

📍漏洞存在的场景、功能点

  1. 用户注册、登录、统一身份认证;
  2. 用户转发、分享、评论、收藏内容;
  3. 通过单击链接的方式返回上一页的位置;
  4. 站内单击其他网址链接时发生的跳转;

📍 **漏洞修复:**通过白名单的方式设置跳转域名或者 IP

其他防御建议

  • 服务端 :对跳转 URL 进行严格的白名单校验,禁止携带内网 IP 或javascript: 协议;
  • 客户端 :不要将不可信数据直接赋值给 window.location,使用 URL 构造函数进行解析和白名单匹配;
  • OAuth :严格校验 redirect_uri 的完整性,并强制使用 state 参数防御 CSRF。

验证与绕过技巧

状态码302的响应包

验证思路: 观察哪些功能需要进行跳转,并关注任何涉及跳转操作的URL,常见的参数值有 return、redirect、redirect_to、redirect_url、url、jump、goto、target、link、callback、link、domain、checkout_url 等,输入任意URL地址看是否可以任意跳转

绕过技巧:https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet

组合利用:csrf, ssrf, xss

思路:

  1. 什么场景下进行组合利用

  2. 如何进行组合利用

1. 与CSRF的组合:窃取凭证

  • 场景 A:绕过 CSRF 的 Referrer 校验
  • 场景 B:劫持 OAuth 2.0 /SSO 的 redirect_uri 获取授权码

A. 站点在防御CSRF的时候,会校验 Referrer 头是否为本域。如果网站存在 Open Redirection,会被当做"跳板"。

  • 构造示例:将构造的表单放在存在URL跳转漏洞(开放重定向)页面路径下,https://trusted-site.com/redirect?url=https://evil.com/callback,由于 Referrer 头通常只包含域名和路径,不包含参数。
  • 效果:此时,发起 CSRF 请求时,Referrer 的值为 https://trusted-site.com/redirect,属于同源。服务端校验通过。

B. 在 OAuth 流程中,redirect_uri 参数用于指定登录成功后的回调地址 。如果该参数存在 Open Redirect,且缺乏 state 参数的严格校验(或存在 CSRF),会导致登录的授权码authorization_code 被劫持。

2. 与SSRF的组合:突破限制策略

站点为了防止 SSRF 时会采取策略,只允许请求白名单内的域名。此时,如果白名单内的某个域名存在 URL 跳转漏洞,则可以通过构造的请求绕过 SSRF 防护。

3. 与XSS的组合:绕过XSS的过滤

一些 WAF 或网站在过滤 XSS 时,只检测请求参数中是否包含 <script>alert等关键字,但忽略了 Location 跳转。如果网站存在一个基于 window.location 的跳转漏洞,可以利用跳转执行 XSS。

参考引用

1 《Web漏洞解析与攻防实战》

2 OWASP Cheat Sheet Series: https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html

3 URL validation bypass cheat sheet *****(绕过技巧):

https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet

4 https://cloud.tencent.com/developer/article/2183251 (基础实例)

5 https://cloud.tencent.com/developer/article/1516344​​​​​​ (进阶实例)

附:白盒代码审计参考

https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html

附:基于 DOM 的 URL 跳转

参考自:

类似于反射型 XSS 和 DOM 型 XSS 的区别,URL 跳转漏洞也有服务器端跳转DOM 前端跳转。DOM 类型的前端跳转不经过服务器。用户发送的跳转参数并未到达服务器,而是被前端的 JS 所解析,解析后引发跳转。

基于 DOM 的 URL 跳转漏洞挖掘需要关注网页前端 JS 代码中的关键字:

  • location
  • location.host
  • location.hostname
  • location.href
  • location.pathname
  • location.search
  • location.protocol
  • location.assign()
  • location.replace()
  • open()
  • element.srcdoc
  • XMLHttpRequest.open()
  • XMLHttpRequest.send()
  • jQuery.ajax()
  • $.ajax()
相关推荐
云水一下18 分钟前
DVWA从入门到精通(十一):XSS (Stored)(存储型XSS)
web安全·xss·dvwa·存储型
MartinYeung53 小时前
[论文学习]SecureGate:通过令牌级门控学习何时安全地揭示PII-深度解析
学习·安全
广州市顺风搬家服务有限公司3 小时前
实验室搬迁科普专业流程防护标准与合规核心要点
网络·其他·安全
Xi-Xu4 小时前
什么时候需要 Multi-agent:不是分工,而是运行边界
人工智能·经验分享·安全
2501_943782357 小时前
【共创季稿事节】密码生成器:如何构建一个安全的随机密码生成工具
android·数据库·安全·鸿蒙·鸿蒙系统
轩渃7 小时前
Claude Fable5回归即翻车:跑分暴跌、安全拦截、账单猫腻,AI模型的信任危机
人工智能·安全·回归
Chockmans7 小时前
春秋云境CVE-2021-42897(保姆级教学)
计算机网络·安全·web安全·网络安全·安全威胁分析·春秋云境·cve-2021-42897
风控PM说10 小时前
入门第二课:业务催生风险,常见的业务风险有哪些?
安全
四月天4321 小时前
web安全-SSTI(服务器模板注入)
笔记·学习·web安全·网络安全
独守一片天1 天前
HarmonyOS 6.1.0 Call Service 来电识别与安全通信怎么设计?
安全·华为·harmonyos