初始化: 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
这个提交包含在:
@@ -0,0 +1,185 @@
|
||||
# 提权攻击与本地存储利用分析报告
|
||||
|
||||
> **测试时间**:2026-03-10
|
||||
> **测试目标**:`zfcg.czt.fujian.gov.cn` 登录态安全性
|
||||
|
||||
---
|
||||
|
||||
## 一、JWT Token 深度解析
|
||||
|
||||
### 1.1 Token 头部 (Header)
|
||||
```json
|
||||
{"alg":"RS256","typ":"JWT"}
|
||||
```
|
||||
- **签名算法**:RS256(RSA + SHA256),属于**非对称加密**签名,安全性优于 HS256。
|
||||
- **评估**:✅ 算法选择合理,无法通过暴力猜解密钥伪造 Token。
|
||||
|
||||
### 1.2 Token 载荷 (Payload) 完整解码
|
||||
|
||||
```json
|
||||
{
|
||||
"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 | 子域名横向穿透 | 共享认证 | 🟡 中危 | 待验证 |
|
||||
|
||||
---
|
||||
|
||||
## 七、紧急修复建议
|
||||
|
||||
### ⚡ 立即执行
|
||||
1. **Token 仅存 HttpOnly Cookie**:禁止 JS 读取 Token
|
||||
2. **清除 sessionStorage 用户 PII**:仅保留最小化用户标识
|
||||
3. **缩短 Token 有效期**:缩至 30 分钟,引入 Refresh Token
|
||||
|
||||
### 🔧 一周内
|
||||
4. 后端所有接口从 Token 内验证角色,禁止接受客户端传参的 `userType`
|
||||
5. JWT Payload 最小化:移除手机号、邮箱等 PII,仅保留 userId 和 orgId
|
||||
6. 配置严格 CSP 策略防止 XSS
|
||||
在新工单中引用
屏蔽一个用户