隐藏在 URL Credentials 中的 Payload:一种被忽视的 Web 绕过路径
字数 1545 2025-08-30 06:50:11
隐藏在URL Credentials中的Payload:一种被忽视的Web绕过路径
一、URL Credentials原理深度解析
HTTP URL标准结构
URL Credentials指的是URL中username:password@部分,其标准结构为:
protocol://username:password@host:port/path?query#fragment
现代浏览器处理方式
- Chrome 59+:直接去除地址栏显示用户信息
- Chrome 65+、Firefox、Safari:全面禁止带有用户名密码的URL进行跳转(尤其是HTTPS下)
- 现代浏览器访问这种格式的URL会:
- 直接报错
- 重定向失败
- 忽略用户信息部分
关键特性
- 浏览器不会将
username:password发送给目标站点,但会参与URL的host解析 - host部分仍是
@之后的部分,因此实际请求发送到了目标主机 - 某些Web应用、Nginx、CDN、WAF会对完整URL进行正则处理,可能错误解析
二、攻击核心思想
攻击者可以将payload插入到username或password字段中:
- 这些数据在浏览器访问时不可见
- 服务端通常不会注意到
- 可用于:
- DOM XSS
- 混淆日志
- 绕过WAF
- 欺骗SSRF验证
示例
https://<script>alert(1)</script>@evil.com
- 浏览器请求的是
evil.com - WAF如果只做"全局keyword匹配"或"正则主机检查",可能会忽略
<script>部分
三、DOM XSS绕过实例
目标站点配置
- 云WAF开启
- 拦截规则包含:
<script>、javascript:、onload、alert(等关键词 - 重定向接口:
/go?url=...
攻击方式
- 常规Payload:被WAF拦截(403 Forbidden)
- 绕过Payload:
/go?url=https://<script>alert(1)</script>@evil.com- payload存储在username字段
- WAF不检测
@前内容 - SSR渲染页面中若拼接该URL,容易造成二次执行(DOM XSS)
四、SSRF白名单绕过
攻击场景
目标使用Python <3.9的urllib.parse()解析URL:
import urllib.parse
urllib.parse.urlparse("https://admin:password123@evil.com/api")
返回结果:
ParseResult(
scheme='https',
netloc='admin:password123@evil.com',
path='/api',
...
)
攻击效果
- SSRF请求实际上打向
evil.com - 白名单校验误判为合法
- WAF误以为走的是可信接口,导致漏洞产生
五、日志注入与反欺骗
攻击方式
构造URL:
https://admin:admin123@evil.com
系统日志会记录完整URL,攻击者可以:
- 诱导安全人员以为admin凭据泄露
- 结合钓鱼页面伪造,构成渗透取证干扰链条
六、防御措施与架构建议
| 层级 | 建议 |
|---|---|
| 应用层 | 显式禁止含@的URL外链或重定向,统一做URL.normalize()处理 |
| 后端解析 | 使用现代标准库:Python 3.9+ urllib.parse,Java URI不带Legacy模式 |
| SSRF防御 | 在解析Host后做DNS解析+IP白名单验证,不能依赖前缀判断 |
| WAF策略 | 对@前后部分均做关键词检测;配置基于字段结构识别 |
| 日志系统 | 不记录username:password部分,或统一使用掩码 |
七、扩展攻击链
假设目标存在以下组合:
- SSRF接口
/?url=... - DOM拼接触发跳转
- 站点部署了主流云WAF
构造攻击链
- 绕过SSRF白名单校验(走evil.com)
- WAF不拦截
@前XSS Payload - 页面跳转拼接触发XSS
- 利用CSP不当、Referer泄露等获取更多信息
八、总结
URL Credentials是一种被忽视的老标准,它让攻击者能将恶意payload隐匿在@前面,躲过:
- WAF检测
- 日志记录
- 白名单验证
这种技术可以打通SSRF、XSS、钓鱼等多种攻击链路。在安全审计时,应特别注意检查@之前的内容。