ワンクリックで
open-redirect-testing
检测开放重定向风险;当目标存在含重定向参数的 URL(url=、redirect=、next=、return=、goto=)时触发;适用于登录后跳转、OAuth 回调、链接中转等场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
检测开放重定向风险;当目标存在含重定向参数的 URL(url=、redirect=、next=、return=、goto=)时触发;适用于登录后跳转、OAuth 回调、链接中转等场景。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
白盒建模——一次深度建模产出五张共享模型:项目架构(技术栈/分层/框架自有封装/闭源依赖位置)、 入口点(路由/中间件信任边界)、认证与权限(会话/角色/多租户/归属字段)、业务(实体/流程状态机/ 业务不变量/高价值资产)、全局威胁(攻击面×漏洞类别的适用性映射,供下游逐一全测)。本能力不做漏洞判定,为后续 漏洞维度分析建立共享底图。
OS 命令注入综合检测——覆盖直接命令拼接 / shell 元字符 / 参数注入 / 间接 RCE,按回显 / 时间 / 带外通道分诊。 流量中参数值含主机名 / URL / 文件名 / 命令片段、响应里出现 shell 错误关键字(`/bin/sh` / `cmd.exe` / `command not found`)、注入 `sleep N` 耗时增加、上传后异步处理链路时使用。
文件上传多策略综合检测——覆盖扩展名 / MIME / 魔术数 / 解析漏洞 / 上传链组合(LFI / Zip Slip / SVG XSS / SVG XXE)。 流量含 multipart/form-data 上传、响应回显落盘路径、上传后文件可被 GET 解析、上传字段含 filename / path 可控时使用。
IDOR 水平越权检测 — 通过替换资源标识符(ID/UUID/路径)访问他人资源的风险;适用于用户资料、订单、文档、租户隔离场景。
检测路径穿越和本地文件包含(LFI)风险;当目标存在文件读取/下载/预览功能且含路径参数时触发;适用于文件下载、日志查看、模板加载等场景。
黑盒建模 — 迭代式攻击面建模,按站点级 / 页面级 / 功能级三粒度推进;进入新页面即触发一次页面级建模、切换新身份各刷新一次,产出端点账本与页面语义模型,为后续漏洞维度的适用性判断提供依据。
| name | open-redirect-testing |
| description | 检测开放重定向风险;当目标存在含重定向参数的 URL(url=、redirect=、next=、return=、goto=)时触发;适用于登录后跳转、OAuth 回调、链接中转等场景。 |
| when-to-use | 当目标 URL 含重定向参数(url=、redirect=、next=、return=、goto=),如登录后跳转、OAuth 回调、链接中转时 |
| allowed-tools | bash,read_file,list_files,rg |
| user-invocable | false |
url / next / return / redirect 参数(用户可控的跳转目标字符串)→ 服务端跳转 sink(HTTP Location 头 / <meta http-equiv=refresh> / 前端 window.location 或 location.href 赋值 / OAuth redirect_uri 回调)= 开放重定向。一句话讲清成因:服务端把用户递交的字符串原样或弱校验后写入跳转目的地,攻击者借受信任域名外观把受害者引到恶意域。业务命名不可作筛选——不能用"参数名是 next 才查、callback_url 才查"作为是否检测的依据;任何参数只要最终流向 Location 头 / meta refresh / JS 跳转 / OAuth 回调,就属于此 sink 语义。同一站点经常出现 lang=zh&go=...、from=mobile&page=... 这种"非典型命名但实际触发跳转"的形态。详见同根目录 pentest/web-security-testing/SKILL.md 漏洞成因图谱 · 开放重定向行(不在本 skill 重复成因)。
以下是已知的常见开放重定向触发线索,作为基线起点而非必检硬清单:
[x] done[-] n/a (原因)[+] added (来源)基线触发线索按"sink 语义"分类(不按业务命名):
Location 头中出现请求参数原样回显或解码回显;登录后跳转、登出后跳转、表单提交后跳转、404 / 401 重定向。<meta http-equiv="refresh" content="0;url=...">;前端 JS 出现 location.href = qs.get('next')、window.location.replace(params.url)、document.location = ...。redirect_uri、callback_url、return_url 参与 OAuth/OIDC 流程;服务端是否对回调 URI 做精确白名单匹配存疑。/redirect?u=、/go?to=、/jump?dest=、短链解码后跳转。/download?u=...)。res.redirect(req.query.next)、HttpResponse.Redirect(Request["url"])、return RedirectResult(model.ReturnUrl)、response.sendRedirect(request.getParameter("u")) 等"用户可控字符串直接进 sink"形态。加载本 skill 时按这些问题思考:
redhaze.test、oastify.com 等可控域),不使用真实恶意站点。定位包含 URL/路径的参数与对应 sink:
url、redirect、next、return、returnTo、goto、continue、dest、redir、callback、u、to将参数值替换为外部 URL:
https://evil.comhttp://evil.com//evil.com(协议相对 URL)若直接外部 URL 被拒绝,尝试绕过:
| 绕过技术 | payload |
|---|---|
| 协议相对 URL | //evil.com |
| 反斜杠 | \/\/evil.com、/\evil.com |
| @ 符号 | http://trusted.com@evil.com |
| 子域名拼接 | http://trusted.com.evil.com |
| URL 编码 | %2f%2fevil.com |
| 双重编码 | %252f%252fevil.com |
| Tab/换行 / CRLF | http://evil%09.com、http://evil%0d%0a.com |
| 数据 URI / JS 协议 | data:text/html,<script>location='http://evil.com'</script>、javascript:alert(1) |
| Null 字节截断 | https://trusted.com%00.evil.com |
| 白名单子域绕过 | evil.target.com.attacker.com、target.com.attacker.com |
res.redirect(req.query.next)(无校验)— 经典 next 参数注入 Location 头(next-param-location-header-redirect)response.sendRedirect(request.getParameter("url")) + Java Servlet — 同 sink,命名不同(next-param-location-header-redirect)redirect_uri.startswith("https://app.target.com") — 可被 https://app.target.com.attacker.com 绕过(oauth-redirect-uri-wildcard-bypass)window.location.href = new URLSearchParams(location.search).get('to') — DOM 型开放重定向(js-locationhref-open-redirect)以下是开放重定向维度的典型窄化误判:
lang=zh&go=... 也可能命中。*.target.com → 安全" — 错。子域拼接 target.com.attacker.com、@ 符号 target.com@attacker.com、CRLF 注入都可能绕过;白名单要按"域名结构"严格解析,而非字符串匹配。为什么这里是「必须」:反例义务属于交付契约——"该子系统无开放重定向"或"已防护"结论是覆盖完整性的产物声明,缺失反向验证清单会让下游误信"该维度全站安全"。
写"未发现开放重定向"或"已防护"前,产物必须包含:
清单不完整 → 结论降级为 partial-coverage 并显式声明未覆盖范围。
特别警示:最容易漏的是"白名单匹配为字符串前缀/后缀"和"前端 DOM 型跳转"。前者用子域拼接 / @ 绕过可命中;后者在 HTTP 响应里看不到 Location 头,只能在浏览器里看 DOM 行为,grep 法会全部漏报。
通用闭环口径见同根目录 common/closure-verification.md(技能表 path 列同一抽取根下,需要时 read_file 读取)。核心:完整证据链才判 confirmed,中间信号最多 suspected。本漏洞特有要点:
| 现象 | 判定 |
|---|---|
| 浏览器实际重定向到攻击者控制的外部域名(地址栏证据) | confirmed |
| OAuth 回调被引到外部域且携带 authorization code / token | confirmed |
| Location 头包含用户输入但浏览器未跟随(如 JavaScript 重定向被 CSP 阻止、或被中间页拦截) | suspected |
| 重定向目标被严格白名单限制,所有绕过均失败且覆盖完整 | not vulnerable |
| 覆盖清单不完整(如未测 DOM 型跳转 / 未跨子系统) | partial-coverage |
/ 开头,且禁止 // 与 \\ 等协议相对形态)。redirect_uri 的精确匹配(包含协议、host、port、path),禁止通配符或前缀匹配。location.href。