文件
websafe-kb/06-case-studies/fujian-gov-procurement/reports/privilege_escalation_report.md
hao cda31e86c7 初始化: Web安全攻防知识库
- 靶场环境: DVWA/WebGoat/Pikachu/BWAPP/SQLi-Labs/XSS-Labs
- SQL注入工具: sqli-scanner.py, blind-sqli.py, sqli-exploit.go
- XSS工具: xss-fuzzer.py, xss-scanner.go
- 认证攻击: web-brute.py, jwt-cracker.py
- 服务端安全: port-scanner.py, tls-scanner.py
- 防御配置: nginx-hardening.conf
- 案例研究: 福建政采网安全评估报告 (13份)
- 同步脚本: sync-gitea.sh
2026-03-16 17:10:23 -07:00

7.0 KiB
原始文件 Blame 文件历史

提权攻击与本地存储利用分析报告

测试时间2026-03-10 测试目标zfcg.czt.fujian.gov.cn 登录态安全性


一、JWT Token 深度解析

1.1 Token 头部 (Header)

{"alg":"RS256","typ":"JWT"}
  • 签名算法RS256RSA + SHA256,属于非对称加密签名,安全性优于 HS256。
  • 评估 算法选择合理,无法通过暴力猜解密钥伪造 Token。

1.2 Token 载荷 (Payload) 完整解码

{
  "userStatus": "1",
  "loginType": 1,
  "user_name": "福建万行项目管理有限公司",
  "userTypeInfos": [{"userTypeId":"3","commonType":"3","systemType":"3","status":"1"}],
  "userName": "福建万行项目管理有限公司",
  "userId": "045B6EAE4A7549478279462DAD77862B",
  "client_id": "gp-gateway-center",
  "aud": ["ALL"],
  "organizationInfos": [{
    "orgId": "8a1d0f918c2ff0bc018c5cda4bd50ec8",
    "orgName": "福建万行项目管理有限公司",
    "orgCode": "91350111MAD4RQ9K3C",
    "orgType": "3",
    "orgStatus": "Y"
  }],
  "identityType": 1,
  "userAccount": "91350111MAD4RQ9K3C",
  "scope": ["read","write"],
  "systemType": "3",
  "tenantId": "ZF_JGBM_000016",
  "userTypeNow": "3",
  "exp": 1773084858,
  "jti": "9f7afa8e-e6d9-4408-9eb6-dc069540c4f3"
}

1.3 Token 安全性分析

维度 状态 说明
签名算法 RS256 非对称加密,无法伪造
有效期 ~7小时 exp 字段有效,过期后 API 正确拒绝
Token ID JTI 唯一 每次签发使用 UUID,可用于撤销
信息过载 🔴 高危 Payload 内嵌了过多敏感信息(见下方详述)

二、🔴 本地存储提权攻击路径

2.1 攻击路径一XSS → Token 窃取 → 完全冒充

1. 攻击者找到 XSS 漏洞(如 CKEditor 富文本注入)
2. 注入 JS 读取 localStorage['portal-access_token']
3. 将 Token 外传至攻击者服务器
4. 攻击者使用该 Token 直接访问所有 API直到过期 ~7小时
5. 期间可执行:查看项目列表、修改采购公告、下载标书、操作专家抽取等
  • 风险等级🔴 紧急 — Token 在 localStorage 中明文存储且可被 JS 直接读取
  • 实际验证:我们成功通过 document.cookielocalStorage 均提取到了有效 Token

2.2 攻击路径二SessionStorage PII 泄露 → 社工攻击

浏览器 sessionStorage 中存储的完整用户信息(已提取验证):

泄露字段 实际值 社工利用方式
手机号码 13514069349 钓鱼短信/电话诈骗
电子邮箱 3808789405@qq.com 钓鱼邮件
CA 唯一标识 3452585403150523 数字证书冒充
用户 ID 045B6EAE4A7549478279462DAD77862B IDOR 越权
机构 ID 8a1d0f918c2ff0bc018c5cda4bd50ec8 跨机构数据访问
租户 ID ZF_JGBM_000016 租户隔离突破

2.3 攻击路径三JWT Payload 信息泄露 → 定向攻击

JWT PayloadBase64URL 编码,非加密)中包含:

  • userIdorgIdorgCodetenantId 等内部标识
  • userTypeNow: "3"用户角色类型,3=代理机构)
  • scope: ["read","write"](表示该 Token 同时具有读写权限)

风险:攻击者截获任意一个 Token通过网络嗅探 HTTP 页面、XSS、浏览器扩展等,即可无需解密直接读取用户的完整身份信息和权限范围。

2.4 攻击路径四:角色类型枚举与垂直越权(理论推演)

Token 中暴露了角色体系:

  • userTypeNow: "3" → 代理机构
  • 推测 "1" = 采购人, "2" = 供应商, "4" = 管理员/监管

若后端在部分接口中使用前端传参的 userTypeNow 而非从 Token 内验证:

# 理论攻击示例
修改 sessionStorage 中 userTypeNow 为 "4"
→ 前端渲染出管理员菜单
→ 调用管理员专属 API
→ 如后端仅校验 Token 存在性而不校验角色,则完成垂直越权

三、Token 过期与撤销机制测试

测试项 结果
Token 过期后 API 是否拒绝 正确返回 {"msg":"没有有效的token","code":"5560"}
Token 有效期 ~7 小时(从签发到 exp
Token 撤销Revocation ⚠️ 未测试(需要在 Token 有效期内注销账号后重试)

风险7 小时的有效期较长,如 Token 被窃取,攻击者有充足时间执行恶意操作。 建议:缩短 Token 有效期至 30-60 分钟,配合 Refresh Token 机制续签。


四、子域名矩阵与同源攻击面

4.1 存活的同体系子域名

子域名 HTTP 状态 服务类型
rst.fujian.gov.cn (人社厅) 200 政务服务
slt.fujian.gov.cn (水利厅) 200 政务服务
zjt.fujian.gov.cn (住建厅) 200 政务服务
sthjt.fujian.gov.cn (生态环境厅) 200 政务服务
mzt.fujian.gov.cn (民政厅) 200 政务服务
tjj.fujian.gov.cn (统计局) 200 政务服务

4.2 横向穿透风险

如果这些子域名共享统一 CA/OAuth 认证体系,则一个站点的 Token 泄露可能导致跨部门访问。


五、TCP 端口扫描重新评估

5.1 SYN 代理现象说明

Important

三台服务器112.54.45.252、120.35.30.176、114.115.172.176)在 TCP 端口扫描中几乎所有端口均报告 OPEN1-100 全部 OPEN,这是由于网络链路上存在透明代理或负载均衡设备对所有 SYN 请求进行了代理应答。 实际暴露的真实 HTTP 服务仅为80 (301→HTTPS)、443 (HTTPS)、8080 (HTTP 404)。

5.2 真实暴露的服务端口

端口 协议 服务 真实响应
80 HTTP OpenResty 301 → HTTPS
443 HTTPS OpenResty 200 OK
8080 HTTP OpenResty 404 Not Found
8848 TCP Nacos? TCP OPEN / HTTP 超时

六、综合提权风险矩阵

编号 攻击向量 前置条件 严重程度 可行性
E-01 XSS → Token 窃取 → 冒充 存在 XSS 🔴 紧急
E-02 SessionStorage PII → 社工 存在 XSS 🔴 高危
E-03 JWT Payload 信息泄露 Token 截获 🟡 中危
E-04 修改 userType → 垂直越权 后端不校验 🔴 高危 待验证
E-05 7h Token 窗口期攻击 Token 窃取 🟡 中危
E-06 子域名横向穿透 共享认证 🟡 中危 待验证

七、紧急修复建议

立即执行

  1. Token 仅存 HttpOnly Cookie:禁止 JS 读取 Token
  2. 清除 sessionStorage 用户 PII:仅保留最小化用户标识
  3. 缩短 Token 有效期:缩至 30 分钟,引入 Refresh Token

🔧 一周内

  1. 后端所有接口从 Token 内验证角色,禁止接受客户端传参的 userType
  2. JWT Payload 最小化:移除手机号、邮箱等 PII,仅保留 userId 和 orgId
  3. 配置严格 CSP 策略防止 XSS