- 靶场环境: 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
7.0 KiB
7.0 KiB
提权攻击与本地存储利用分析报告
测试时间:2026-03-10 测试目标:
zfcg.czt.fujian.gov.cn登录态安全性
一、JWT Token 深度解析
1.1 Token 头部 (Header)
{"alg":"RS256","typ":"JWT"}
- 签名算法:RS256(RSA + 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.cookie和localStorage均提取到了有效 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 Payload(Base64URL 编码,非加密)中包含:
userId、orgId、orgCode、tenantId等内部标识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 端口扫描中几乎所有端口均报告 OPEN(1-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 | 子域名横向穿透 | 共享认证 | 🟡 中危 | 待验证 |
七、紧急修复建议
⚡ 立即执行
- Token 仅存 HttpOnly Cookie:禁止 JS 读取 Token
- 清除 sessionStorage 用户 PII:仅保留最小化用户标识
- 缩短 Token 有效期:缩至 30 分钟,引入 Refresh Token
🔧 一周内
- 后端所有接口从 Token 内验证角色,禁止接受客户端传参的
userType - JWT Payload 最小化:移除手机号、邮箱等 PII,仅保留 userId 和 orgId
- 配置严格 CSP 策略防止 XSS