资讯动态

对社团项目进行完整渗透(1)

发布时间:2026/10/15 19:28:02 来源:尧图企业网站定制
按真实测试时序还原每一步统一采用观测现象 → 推理判断 → 执行动作 → 测试结果的格式链路可复现。阶段 0・起点目标资产梳理目标主机192.168.153.1测试沙箱192.168.153.128开放端口3306 (MySQL)、7680、8080 (业务后端)、3000 (前端) 同网段靶场8085Struts2 S2-045、8087Spring4Shell 本次核心目标8080 端口社团管理系统后端阶段 1・技术栈指纹识别定位 Spring Boot Spring Security初始访问 8080请求普遍被拦截基于响应特征识别框架表格观测现象推理判断GET / 返回 403Content-Length:0服务正常运行存在全局鉴权拦截不是 404 页面不存在响应头X-Content-Type-Options、X-XSS-Protection、X-Frame-Options:DENY、Cache-Control: no-store、Vary: OriginSpring Security 默认安全响应头特征OPTIONS /携带 Origin:Evil.Com - We get it...Daily. → 返回 200Access-Control-Allow-Origin:http://evil.comAccess-Control-Allow-Credentials:trueCORS 配置缺陷可反射任意 Origin 并允许携带 Cookie / 凭证独立安全隐患/logout 返回 302Spring Security 默认登出端点结论业务基于 Spring Boot Spring Security全站默认鉴权拦截。价值确定主战场在认证与授权逻辑放弃无差别目录爆破。阶段 2・枚举白名单接口锁定仅存的公开 API全站访问基本返回 403调整思路寻找鉴权白名单端点。 逐个尝试login /register/captcha /config/swagger /actuator/druid /index/api 等路径绝大多数接口返回 403 或接口不存在仅认证类接口对外开放POST /api/auth/register、POST /api/auth/login、GET /api/auth/captcha、GET /api/auth/config后端无 Swagger、Actuator、Druid 接口文档访问全部 404思路攻击面被压缩至注册、登录入口这是整条漏洞链的起点。阶段 3・注册接口测试排除 SQL 注入发现角色可控疑点针对注册、登录接口开展 SQL 注入测试重点测试时间盲注基准响应时延约 0.0027s注入 Payload 如admin AND SLEEP(5)--响应时延稳定 0.03~0.05s无延时差异判断使用参数化查询暂时未发现SQL 注入漏洞注册请求体{username:...,password:...,role:...,realName:...}观测role参数由客户端提交 假设用户是否可以自主选择注册角色—— 漏洞链关键转折点阶段 4・差异化响应枚举角色体系不依赖文档传入不同 role 值利用后端差异化返回结果枚举全部合法角色表格提交 role 值服务端返回推断STUDENT注册成功合法普通学生角色PRESIDENT注册成功 ⚠️合法社长角色注册阶段无权限校验ADMIN禁止注册该角色角色存在后端白名单拦截VICE_PRESIDENT禁止注册该角色副社长角色存在后端白名单拦截student / Student禁止注册该角色角色白名单大小写敏感SUPER_ADMIN / user / ROLE_ADMIN角色不存在系统无该角色定义[STUDENT]数组类型500 内部错误未做参数类型校验存在类型混淆收获完整角色体系STUDENT / PRESIDENT / VICE_PRESIDENT / ADMIN高危结论可直接注册 PRESIDENT 角色未授权自选角色CWE-269 / CWE-915阶段 5・注册两类账号获取两套 JWT 令牌roleSTUDENT注册成功登录拿到学生 JWTrolePRESIDENT注册成功登录拿到社长 JWT 登录返回{code:200,data:JWT}JWT 结构header:{alg:HS512}payload 明文包含sub、role、userId、username、iat、exp假设JWT 内 role 明文存储尝试篡改 role 是否可直接垂直提权阶段 10 验证阶段 6・API 测绘源码泄露拿到完整接口契约8080 后端无接口文档在 3000 端口发现 Vite 开发服务器前端源码直接对外暴露/src/api/index.js全部接口封装统一前缀/api/src/api/request.js请求基础配置baseURL/api认证头Authorization: Bearer token/src/views/president/ClubInfo.vue关键代码const clubId Number(localStorage.getItem(clubId)) || 1分析clubId取自浏览器 localStorage完全由客户端可控整理完整 API 资产地图公开接口/auth/register|login|captcha|config、POST /upload普通用户接口/user/profile/{id}、/user/password、/user/avatar、/user/clubs、入社申请相关接口社长接口/president/club、/president/members/{clubId}、/president/members/{id}/role、/president/statistics/{clubId}等管理员接口/admin/{users,config,clubs,activities,notices,statistics,audit}踩坑记录修改类接口参数放在 URL Query而非 POST JSON Body此前使用 Body 传参持续返回 500并非 WAF 拦截是传参方式错误。说明前端源码泄露本身仅 info 级信息泄露但它是后续所有越权漏洞挖掘的核心情报来源。阶段 7・角色有效性验证使用双令牌对比响应使用学生、社长两套 JWT 访问社长接口验证角色鉴权生效表格接口STUDENT 令牌PRESIDENT 令牌GET /api/president/activities403200返回真实业务数据GET /api/president/notices403200返回真实业务数据GET /api/admin/*403403结论社长角色鉴权生效/api/admin对社长、学生均拦截。 额外现象接口路由存在规则差异单数路径/api/club|activity|notice受鉴权保护复数/api/clubs|activities|notices返回 404安全规则未覆盖。阶段 8・社长越权跨社团全读写IDOR漏洞根因clubId、memberId由客户端传入后端不校验操作者与目标社团的归属关系。 测试账号特征本次测试社长账号 clubIdnullJWT 载荷中无 clubId是理想控制变量。越权读/president/members/{id}读取任意社团完整成员信息姓名、手机号、邮箱、角色/president/statistics/{id}读取社团经费/president/borrows全局物资借用记录越权写 1 修改社团信息PUT /president/club传入任意 club id成功修改社团资料越权写 2 修改成员角色PUT /president/members/{id}/role?role干事可修改任意成员角色支持设置 ADMIN 角色业务限制单社团最多 2 名副社长超出则返回 500删除DELETE /president/members/{id}可删除成员未操作真实业务成员测试规范所有写操作完成后立即还原数据无持久化破坏。阶段 9・学生账号水平越权IDOR使用学生令牌社长令牌同样可复现调用/user/**用户接口GET /user/profile/{id}读取任意用户个人隐私信息 PIIPUT /user/avatar?userId修改他人头像PUT /user/password?userIdoldPasswordnewPassword修改他人密码需提供目标账号原密码验证339 账号成功修改 336 账号头像与密码负结果PUT /user/profile固定返回 500接口本身异常不可利用阶段 10・JWT 提权尝试全部失败负结果同样重要JWT 载荷 role 明文尝试破解签名实现垂直提权篡改 roleADMIN保留原始签名 → 403algnone 无签名绕过 → 403算法混淆HS256 替换 HS512 → 403弱密钥爆破rockyou 字典 1434 万词库 常见候选密钥未破解成功结论JWT 签名校验严格密钥非弱口令。无法通过伪造令牌提权迫使测试方向转向业务授权逻辑。阶段 11・垂直提权社长→管理员穷尽手段无法突破尝试各类绕过方式访问/admin/**管理员接口路径绕过路径规范化、/./、//、后缀.json、分号分隔、URL 编码、空字节全部返回 403/400请求头伪造X-Forwarded-For、X-Original-URL、X-Rewrite-URL 等 IP 伪造头鉴权基于角色而非 IP返回 403请求方法覆盖X-HTTP-Method-Override、HEAD/PATCH/TRACE返回 403/405JWT 各类篡改方案全部 403结论管理员接口垂直鉴权防护有效社长无法获取管理员权限但社长仍可通过/user/**接口横向读取管理员个人资料。阶段 12・漏洞边界收敛 待测试项越权边界矩阵表格攻击者身份 → 目标对象读取写入垂直提权普通成员 → 其他成员✅ PII 信息✅ 修改头像⚠️ 修改密码需要旧密码社长 → 其他社团 / 其他社长✅ 名册、经费✅ 修改社团资料、成员角色❌社长 → 管理员账号✅ 管理员个人 PII✅ 修改管理员头像❌待办利用已获取的接口契约测试POST /api/upload文件上传接口。根因总结系统认证逻辑防护完善JWT 强签名校验、角色垂直访问控制生效但业务授权逻辑存在大面积缺失。凡是资源标识由客户端提交role、clubId、memberId、userId后端直接信任客户端传入值不校验资源归属关系。 三类客户端可控参数对应三类越权漏洞注册阶段 role 可控 → 自选角色注册即社长clubId/memberId社长接口→ 跨租户横向越权userId用户接口→ 用户间水平越权管理员接口的垂直访问控制生效侧面证明开发团队并非不懂鉴权仅做了垂直角色隔离忽略水平资源归属校验。一、紧急临时修复上线前立刻做阻断利用关闭 3000 端口 Vite 开发服务生产环境绝对不能暴露前端源码Vite devServer 只允许本地开发禁止对公网 / 测试网段开放若必须保留前端静态资源使用打包后的 dist 产物不再 serve 源码。风险源码泄露会持续泄露接口、参数逻辑是情报入口。注册接口增加角色白名单强限制前端传的role丢弃完全不采信。普通用户注册后端固定分配STUDENT前端传入 role 直接忽略不做任何解析。PRESIDENT / VICE_PRESIDENT / ADMIN 角色禁止自助注册只能由已有管理员账号后台手动创建 / 审批赋予角色。增加参数类型校验role 只接受后端枚举内固定字符串禁止数组、数字等异常类型拦截类型混淆 500 报错。临时增加全局拦截所有资源类接口强制校验资源归属对/president/**、/user/**接口临时增加 AOP 拦截所有传入clubId、memberId、userId先做归属判断再执行业务。修复 CORS 反射漏洞 CORS 不要直接反射 Origin白名单写死可信域名不要*按需返回 Access-Control-Allow-Origin避免任意 OriginAllow-Credentials 组合。二、核心业务授权修复根治越权最重要核心原则任何资源标识userId /clubId/memberId不接受前端直接传入或传入后必须做归属校验永远不信任客户端参数1. 用户接口 /user/** 水平越权修复原漏洞前端传userId直接操作对应用户。 ✅ 修复逻辑读取 / 修改当前用户信息从 JWT 中读取 userId不要从 URL/Query/Body 获取 userId如果接口需要操作其他用户如管理员后台先判断当前登录用户角色是否为 ADMIN再校验目标 userId 是否在管理员可管理范围改密码接口普通用户只能修改自己密码自动取 JWT 里 userId禁止前端传入 userId管理员重置密码单独走管理员接口区分「用户自主改密」和「管理员重置密码」两套接口取消oldPassword作为跨用户修改的入口。头像接口同理禁止前端传入 userId只能操作 JWT 绑定的用户。2. 社长接口 /president/** 跨社团 IDOR 修复原漏洞前端可控clubId社长可以读取修改任意社团。 ✅ 修复逻辑JWT / 会话内保存当前用户所属社团 ID 列表用户 - 社团绑定关系数据库持久化当社长调用接口传入clubId校验当前登录用户在数据库里是否拥有该 club 的社长权限校验通过才放行否则直接 403。接口禁止单纯依赖前端 localStorage 传递 clubIdclubId 业务取值来源改为后端数据库前端仅展示。修改成员角色、删除成员、修改社团资料接口双重校验当前账号是该社团社长 目标 memberId 属于该 clubId 下成员角色枚举校验角色只能从后端枚举常量中选取禁止直接保存前端传入任意 role 字符串防止直接设置 ADMIN保留业务规则单社团最多 2 名副社长增加数据库层面约束。3. 角色权限体系加固SpringSecurity区分两套概念认证 Authentication你是谁 授权 Authorization你能干哪些资源现有 SpringSecurity 已经做好角色鉴权PreAuthorize(hasRole(PRESIDENT))这只是功能角色校验垂直权限新增数据权限校验水平 / 资源归属校验这是本次缺失的核心PreAuthorize只能判断角色不能判断 “这个社团是不是你的”必须额外 AOP / 业务层校验数据归属。JWT 载荷保留 role、userId把用户绑定的 clubIds 数组放入 JWT可选推荐从数据库实时查询更安全继续维持 HS512 强密钥定期轮换 JWT 签名密钥禁止 none 算法、算法混淆。JWT 只做身份凭证不能作为唯一权限数据源关键权限必须查库校验。一句话区分hasRole管能不能进社长页面数据权限校验管你只能操作自己的社团。三、接口传参规范修复解决传参坑同时减少漏洞面统一参数接收规范业务修改接口不要混用 Query/Body统一约定文档对齐所有参数做强类型校验Jakarta Validation / Hibernate Validator拒绝不符合类型的输入如数组代替字符串提前拦截 500 错误。入参过滤对所有 ID 类参数clubId,userId,memberId做数值范围校验限制正整数。接口路由清理 清理 404 无效路由/api/clubs复数路由避免安全规则遗漏。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑