初始化: 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
这个提交包含在:
hao
2026-03-16 17:10:23 -07:00
当前提交 cda31e86c7
修改 33 个文件,包含 6072 行新增0 行删除

查看文件

@@ -0,0 +1,185 @@
# 提权攻击与本地存储利用分析报告
> **测试时间**2026-03-10
> **测试目标**`zfcg.czt.fujian.gov.cn` 登录态安全性
---
## 一、JWT Token 深度解析
### 1.1 Token 头部 (Header)
```json
{"alg":"RS256","typ":"JWT"}
```
- **签名算法**RS256RSA + 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 PayloadBase64URL 编码,非加密)中包含:
- `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 端口扫描中几乎所有端口均报告 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
### 🔧 一周内
4. 后端所有接口从 Token 内验证角色,禁止接受客户端传参的 `userType`
5. JWT Payload 最小化:移除手机号、邮箱等 PII,仅保留 userId 和 orgId
6. 配置严格 CSP 策略防止 XSS