二维码劫持原理及恶意行为分析
字数 1537 2025-08-18 11:38:32
二维码劫持原理及恶意行为分析
二维码登录基本原理
-
初始化阶段:
- 用户打开登录页面,选择扫描二维码登录
- 系统加载二维码图片
-
轮询阶段:
- 客户端与服务器建立长连接,持续轮询检测二维码状态
- 轮询接口示例:
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
- 其他参数传递漏洞
- 通过Referer泄露:
防御建议
-
认证流程强化:
- 必须实现二次确认机制
- 明确提示用户操作类型
- 限制二维码有效期(建议30-60秒)
-
参数安全:
- 对关键参数进行HMAC签名
- 避免在URL中直接传递敏感参数
- 实现一次性令牌机制
-
CSRF防护:
- 关键操作需验证CSRF Token
- 确认操作需用户主动触发
-
监控与日志:
- 记录异常登录行为
- 实现异地登录提醒
-
开发规范:
- 避免使用长轮询实现敏感操作
- 关键接口实现频率限制
- 定期安全审计认证流程