二维码劫持原理及恶意行为分析
字数 1537 2025-08-18 11:38:32

二维码劫持原理及恶意行为分析

二维码登录基本原理

  1. 初始化阶段

    • 用户打开登录页面,选择扫描二维码登录
    • 系统加载二维码图片
  2. 轮询阶段

    • 客户端与服务器建立长连接,持续轮询检测二维码状态
    • 轮询接口示例:https://login.wx2.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=...
  3. 扫描阶段

    • 用户使用手机扫描二维码,状态变为"scan"(HTTP状态码201)
    • 网页持续向授权服务器轮询授权码
  4. 确认阶段

    • 用户手机显示"确认登录"按钮
    • 点击后状态变为"confirm"(HTTP状态码200)
    • 服务器返回凭证window.redirect_uri
  5. 登录完成

    • 网页获取授权码后申请凭证
    • 成功登录并进入个人中心

二维码劫持攻击类型

1. 无确认登录漏洞

攻击原理

  • 某些应用扫描二维码后直接登录,无二次确认
  • 攻击者可伪造二维码诱导用户扫描

攻击场景

  • 伪装为红包领取、加好友等二维码
  • 用户扫描后攻击者可直接登录用户账号

防御措施

  • 必须实现二次确认机制
  • 明确提示用户当前是登录操作

2. 登录票据盗取漏洞

攻击原理

  • 获取关键认证参数(key/uuid等)构造登录链接
  • 关键参数可能通过以下方式泄露:
    • URL跳转
    • 引用站外图片
    • 其他可控制的外部请求

攻击步骤

  1. 获取二维码字符(uuid)和微信号(username)
  2. 通过Referer泄露等方式获取key值
  3. 构造完整登录请求:
    http://example.com/login?username=...&key=...&uuid=...
  4. 攻击者直接访问该链接即可登录

防御措施

  • 对关键参数进行签名保护
  • 限制关键参数的有效期
  • 避免在URL中直接传递敏感参数

3. 二维码CSRF漏洞

与传统CSRF区别

  • 需要用户先完成二维码扫描步骤
  • 攻击者无法直接触发确认操作

攻击原理

  1. 用户扫描攻击者提供的二维码
  2. 页面隐藏iframe自动提交"确认登录"请求
  3. 完成登录劫持

攻击实现

  • 构造包含两个步骤的POC:
    1. 诱导用户扫描二维码
    2. 自动提交确认请求的CSRF代码

防御措施

  • 增加CSRF Token防护
  • 确认操作需用户主动触发
  • 限制二维码的有效期

技术细节与攻击实现

二维码状态监控

  • 通过浏览器插件实时提取状态参数:
    • securityId:安全标识
    • barcode:二维码字符
  • 监控状态变化:
    • timeout:二维码过期
    • scan:已扫描
    • confirm:已确认

二维码更新机制

  • 过期后更新二维码字符接口:
    https://login.weixin.qq.com/jslogin?appid=...&fun=new&lang=zh_CN
  • 攻击者可实时更新二维码到恶意网站

关键参数获取

  1. uuid获取

    • 从二维码链接提取:https://login.weixin.qq.com/qrcode/Qe3ev-uOPg==
    • 二维码字符即为Qe3ev-uOPg==
  2. key值获取

    • 通过Referer泄露:
      • 构造URL跳转或外部资源引用
      • 在服务器日志中查看Referer获取key
    • 其他参数传递漏洞

防御建议

  1. 认证流程强化

    • 必须实现二次确认机制
    • 明确提示用户操作类型
    • 限制二维码有效期(建议30-60秒)
  2. 参数安全

    • 对关键参数进行HMAC签名
    • 避免在URL中直接传递敏感参数
    • 实现一次性令牌机制
  3. CSRF防护

    • 关键操作需验证CSRF Token
    • 确认操作需用户主动触发
  4. 监控与日志

    • 记录异常登录行为
    • 实现异地登录提醒
  5. 开发规范

    • 避免使用长轮询实现敏感操作
    • 关键接口实现频率限制
    • 定期安全审计认证流程
二维码劫持原理及恶意行为分析 二维码登录基本原理 初始化阶段 : 用户打开登录页面,选择扫描二维码登录 系统加载二维码图片 轮询阶段 : 客户端与服务器建立长连接,持续轮询检测二维码状态 轮询接口示例: https://login.wx2.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=... 扫描阶段 : 用户使用手机扫描二维码,状态变为"scan"(HTTP状态码201) 网页持续向授权服务器轮询授权码 确认阶段 : 用户手机显示"确认登录"按钮 点击后状态变为"confirm"(HTTP状态码200) 服务器返回凭证 window.redirect_uri 登录完成 : 网页获取授权码后申请凭证 成功登录并进入个人中心 二维码劫持攻击类型 1. 无确认登录漏洞 攻击原理 : 某些应用扫描二维码后直接登录,无二次确认 攻击者可伪造二维码诱导用户扫描 攻击场景 : 伪装为红包领取、加好友等二维码 用户扫描后攻击者可直接登录用户账号 防御措施 : 必须实现二次确认机制 明确提示用户当前是登录操作 2. 登录票据盗取漏洞 攻击原理 : 获取关键认证参数(key/uuid等)构造登录链接 关键参数可能通过以下方式泄露: URL跳转 引用站外图片 其他可控制的外部请求 攻击步骤 : 获取二维码字符(uuid)和微信号(username) 通过Referer泄露等方式获取key值 构造完整登录请求: http://example.com/login?username=...&key=...&uuid=... 攻击者直接访问该链接即可登录 防御措施 : 对关键参数进行签名保护 限制关键参数的有效期 避免在URL中直接传递敏感参数 3. 二维码CSRF漏洞 与传统CSRF区别 : 需要用户先完成二维码扫描步骤 攻击者无法直接触发确认操作 攻击原理 : 用户扫描攻击者提供的二维码 页面隐藏iframe自动提交"确认登录"请求 完成登录劫持 攻击实现 : 构造包含两个步骤的POC: 诱导用户扫描二维码 自动提交确认请求的CSRF代码 防御措施 : 增加CSRF Token防护 确认操作需用户主动触发 限制二维码的有效期 技术细节与攻击实现 二维码状态监控 通过浏览器插件实时提取状态参数: securityId :安全标识 barcode :二维码字符 监控状态变化: timeout :二维码过期 scan :已扫描 confirm :已确认 二维码更新机制 过期后更新二维码字符接口: https://login.weixin.qq.com/jslogin?appid=...&fun=new&lang=zh_CN 攻击者可实时更新二维码到恶意网站 关键参数获取 uuid获取 : 从二维码链接提取: https://login.weixin.qq.com/qrcode/Qe3ev-uOPg== 二维码字符即为 Qe3ev-uOPg== key值获取 : 通过Referer泄露: 构造URL跳转或外部资源引用 在服务器日志中查看Referer获取key 其他参数传递漏洞 防御建议 认证流程强化 : 必须实现二次确认机制 明确提示用户操作类型 限制二维码有效期(建议30-60秒) 参数安全 : 对关键参数进行HMAC签名 避免在URL中直接传递敏感参数 实现一次性令牌机制 CSRF防护 : 关键操作需验证CSRF Token 确认操作需用户主动触发 监控与日志 : 记录异常登录行为 实现异地登录提醒 开发规范 : 避免使用长轮询实现敏感操作 关键接口实现频率限制 定期安全审计认证流程