【扩充版】“任意用户漏洞”全景手册 20+实战案例

admin 2026-01-09 03:07:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文剖析20余个SRC真实案例,涵盖验证码爆破、密码重置逻辑缺陷及OAuth越权等任意用户漏洞。揭示弱加密、参数篡改等风险,提供具体修复方案。核心建议是服务端不信任客户端数据,确保凭证绑定用户且一次有效,严格进行三要素校验,以此加固认证系统安全。 综合评分: 89 文章分类: 漏洞分析,WEB安全,SRC活动,实战经验


cover_image

【扩充版】“任意用户漏洞”全景手册 20+ 实战案例

原创

繁星01

安全君呀

2026年1月8日 12:26 北京

点击上方蓝色文字关注↑↑↑↑↑

将安全君呀设为”星标⭐️”

第一时间收到文章更新

声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。

文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。

前言

以下 25 条覆盖“验证码→登录→密码重置”完整链路,均来自近一年 SRC 真实案例。

01

四位数验证码可爆破

• 场景:登录/注册/换绑手机仅 4 位数字,有效期 10 min,接口无次数限制。

• 利用:Burp Intruder 0-9999 全量跑,平均 3-5 min 即命中。

• 修复:① 6 位以上;② 5 次错误即锁;③ 同 IP 1 h 限 30 次。

02

验证码回显(Response Reflection)

• 场景:服务端把验证码藏在 JSON 里返回前端,再由 JS 比对。

• 利用:拦截响应包即可看到 code=“123456”,改 client 端结果为 true 即可通过。

• 修复:后端必须自行比对,禁止把验证码返回到客户端。

03

只验证验证码,未校验绑定关系

• 场景:手机 A 的验证码可以验证手机 B 的表单。

• 利用:先给自己手机发码→获得正确验证码→把手机号改成受害者→提交。

• 修复:比对 session 里保存的“手机号+验证码”与提交的是否一致。

04

修改返回包(状态码/JSON)

• 场景:/checkCode 返回 {“code”:400,”msg”:”错误”}。

• 利用:Intercept Response → 改 {“code”:200,”msg”:”正确”} → 前端直接跳转重置页。

• 修复:关键状态必须由后端签发 JWT 或 session-flag,客户端仅做展示。

05

双写手机号(批量短信轰炸)

• 场景:mobile=13555555555,13500000000&code=134567

• 利用:逗号分隔即可给 N 个号码发同一条短信,瞬间耗尽短信包量。

• 修复:mobile 字段强制 string 单号码;数组格式需后端白名单长度≤1。

POST/cc/register/mobile/smssendHTTP/1.1Host:xxx.comUser-Agent:Mozilla/5.0(WindowsNT5.1;rv:21.0)Gecko/20100101Firefox/21.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding:gzip,deflateReferer:Cookie:Connection:keep-aliveContent-Type:application/x-www-form-urlencodedContent-Length:60mobile=13555555555,13500000000&c0de=134567

06

第三方 OAuth 登录 → UID 越权

• 场景:微博授权后返回 {“uid”:”123456″,”token”:”xxx”}。

• 利用:把 uid 改成目标用户即可直接获得其本站 session。

• 修复:以第三方返回的 openid+unionid 做本地账号绑定,不可信任客户端传来的 UID。

07

随意验证码(万能 6 位)

• 场景:后端 WHERE code=$input 且 code 字段为空时 SQL 短路。

• 利用:输入 000000/111111 必过。

• 修复:code=空 或 NULL 时直接抛异常;用严格==比对。

08

验证码字段为空/null

• 场景:mobile=13555555555&code=null

• 利用:PHP 弱类型 null==0==false,绕过。

• 修复:empty($code) || strlen($code)!=6 直接拒绝。

POST/cc/register/mobile/smssendHTTP/1.1Host:xxx.comUser-Agent:Accept:tion/xml;q=0.9,*/*;q=0.8Accept-LanguageAccept-Encoding:gzip,deflateReferer:Cookie:Connection:keep-aliveContent-Type:application/x-www-form-urlencodedContent-Length:60mobile=13555555555&code=null
或:mobile=13555555555&code=

09

修改手机号—短信劫持

步骤:

  1. 输入用户名 admin

  2. 拦截发送短信包,改手机号为自己的

  3. 下一步提交新密码时再把手机号改回 admin

结果:admin 的密码重置码发到攻击者手机。

修复:session 固化“待验证手机”,任何后续步骤必须与之一致。

10

重置链接参数可预测

链接:/reset?uid=123&d=base64(md5(uid+timestamp))

• 利用:timestamp 只到秒,跑 60 个值即可拼出正确 d。

• 修复:d 使用 HMAC(uid+expire, serverKey) 并设 15 min 过期。

11

万能密码(SQL 注入)

ASP/ASPX/PHP/JSP 常用 payload 已列出,补充 2 条最新绕过:

'or''='&password={any}

'||1#(MySQL 模式)

修复:预编译+ORM;禁用拼接;失败 3 次锁定账号。

asp aspx万能密码"or"a"="a').or.(.a.='.aor1=1--admin'or1=1#
PHP万能密码admin'"密码*/''or 1=1/*"or"a"="a
jsp万能密码1'or1'='1admin'or 1=1/*
任意用户登录:admin'or'1'='1

12

接口暴露用户敏感字段

场景:/u/getUserInfo?user=abc 返回

{“uid”:1,”email”:”[email protected]”,”mobile”:”13800138000″}

利用:先批量跑用户名→得到 uid/手机/邮箱→再用九、十重置密码。

修复:敏感字段走加密通道,对外仅返回脱敏后四位。

13

步骤序号越权(URL 参数)

找回密码三步:

  1. /getpwc1.html

  2. /getpwc2.html

  3. /getpwc3.html

直接 GET /getpwc3.html?step=3 即可进入最后一步输入新密码。

修复:每一步完成后把标识写入服务端 session,后端校验 step 顺序。

14

UID 遍历+无验证码

场景:/resetPwd POST 数据 {“uid”:10001}

利用:10000-10100 跑一遍,即可批量下发重置邮件。

修复:加图形/短信验证码;uid 与当前登录身份二次校验。

15

邮件令牌未绑定账号

重置链接:/reset?token=8a9b8c9d

数据库里 token 表没有 user_id 外键,导致任何有效 token 可重置任意账号。

修复:token 记录包含 uid 与过期时间,校验时 WHERE token=? AND uid=?。

16

子域名共享 Cookie 导致会话混淆

公司把 wiki.xxx.com 与 passport.xxx.com 配在 *.xxx.com,token 储存在主域 Cookie。

攻击者在 wiki 子域拿到 Cookie 后,可直接访问 passport 重置接口。

修复:敏感业务单独二级域 passport.xxx.com,Cookie 设 Domain=passport.xxx.com; HttpOnly; SameSite=Strict。

17

JSONP 劫持获取用户 UID

场景:/api/getUid?callback=abc 返回 abc({“uid”:123})

攻击者在自己页面调用即可获得已登录用户的 uid,再用于十、十四。

修复:敏感接口禁止 JSONP;改用 CORS 并加 Authorization 头。

18

GraphQL 批量查询

{users(first:100){edges{node{uid email}}}}

无节点级权限,一次性拉全站用户列表。

修复:GraphQL 加 @auth 指令,限制查询深度与条数。

19

密码找回凭证可复用

/token/verify 接口返回 HTTP 302,Location 带一次性 code。

Location: /reset?code=ABC123

code 未置过期,可被多次使用。

修复:code 校验后立即删除或标记 used=1。

20

弱加密可逆

重置链接里 uid=AES(uid, ECB, key=1234567890abcdef)

key 固定且 ECB 模式,可离线解密/伪造任意 uid。

修复:改用 HMAC 或 RSA 签名,服务器端保存密钥。

21

服务器时间泄露

返回头 Server-Timing: dt=1234567890

攻击者由此得知服务器秒级时间,辅助预测十中的 timestamp。

修复:关闭非必要服务器头。

22

日志外泄

/static/logs/2025/04/27.log 可直接下载,内含所有重置 token。

修复:禁止 Web 访问日志目录;日志脱敏或移至 OSS 内网。

23

验证码音频路径可猜解

/audio/20250427/13555555555.wav

按手机号+日期生成,可暴力下载听取语音验证码。

修复:audio 文件名使用随机 UUID,与手机号无关联。

24

邮箱别名绕过

某些系统把 [email protected] 与 [email protected] 视为同一账号,但重置时只对 alias 做校验,导致原账号被劫持。

修复:标准化邮箱,去掉 +alias 后再入库。

25

HTTP 参数污染

mobile=13800000000&mobile=13900000000

后端取第一个,框架取第二个,验证与最终重置号码不一致。

修复:禁止同名参数;严格用 getParameter(name) 并只接受单值。

26

修复原则

  1. 服务端永远不信任客户端传来的身份标识;

  2. 所有凭证一次有效+过期+绑定用户;

  3. 任何验证步骤必须“三要素”同检:用户标识、凭证、操作对象。

Tips

欢迎大家在下面点赞评论加关注,让我们一起在网安之路越走越远!!!

长按扫描下方二维码加关注,了解更多网安知识哦!

END


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全君呀 繁星01《【扩充版】“任意用户漏洞”全景手册 20+ 实战案例》

评论:0   参与:  0