初始化: 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,321 @@
|
||||
# Web 安全攻防全景指南 × 福建省政府采购网 漏洞对照分析报告
|
||||
|
||||
> **评估时间**:2026-03-10
|
||||
> **评估目标**:`zfcg.czt.fujian.gov.cn`(福建省政府采购网)
|
||||
> **参照标准**:Web 安全攻防全景指南(10 大领域)
|
||||
|
||||
---
|
||||
|
||||
## 总览:漏洞与指南章节映射
|
||||
|
||||
| 指南章节 | 涉及漏洞数 | 最高等级 | 关键发现 |
|
||||
|----------|-----------|----------|----------|
|
||||
| 1. Web 端安全注入 | 2 | 🟢 低 | SQL 注入被 WAF 静默拦截;XSS 风险理论存在 |
|
||||
| 2. 客户端本地数据安全 | 4 | 🔴 紧急 | JWT/PII 明文存储于 localStorage/sessionStorage |
|
||||
| 3. 跨域安全与同源策略 | 2 | 🟡 中 | CORS Headers 通配符;缺少 CSRF Token |
|
||||
| 4. HTTPS 与传输层安全 | 2 | 🔴 高危 | OAuth 重定向使用 HTTP;缺少 HSTS |
|
||||
| 5. 身份认证与会话安全 | 4 | 🔴 高危 | 无暴力破解防护;弱密码校验关闭;Token 7h 有效期 |
|
||||
| 6. 服务器端安全漏洞 | 1 | 🟡 中 | 路径遍历测试被拦截 |
|
||||
| 7. 服务器配置与基础设施 | 5 | 🔴 紧急 | Nacos 8848 对外暴露;Actuator 可公网触达 |
|
||||
| 8. 开源软件与依赖安全 | 2 | 🟡 中 | jQuery 1.12.4 已知 CVE;CKEditor 历史漏洞 |
|
||||
| 9. 安全规范与全流程管理 | 2 | 🟡 中 | 版本号暴露;配置文件泄露加密密钥 |
|
||||
| 10. 提权攻击验证 | 3 | 🟡 中 | userTypeNow 修改被检测;PII 可被社工利用 |
|
||||
|
||||
---
|
||||
|
||||
## 1. Web 端安全注入
|
||||
|
||||
### 1.1 SQL 注入 → 🟢 低危(有防护)
|
||||
|
||||
| 测试项 | Payload | 结果 |
|
||||
|--------|---------|------|
|
||||
| 经典注入 | `admin'--` | 空响应(WAF 拦截) |
|
||||
| 联合注入 | `UNION SELECT 1,2,3--` | 空响应(WAF 拦截) |
|
||||
| 布尔盲注 | `admin" OR 1=1--` | 空响应(WAF 拦截) |
|
||||
| 认证态注入 | `userId=...%27 OR 1=1--` | 空响应(WAF 拦截) |
|
||||
|
||||
**指南对照**:系统对 SQL 注入有**有效的 WAF 防护**(静默 DROP 策略),符合参数化查询防御规范。但建议确认后端是否同时使用了参数化查询(ORM),而非仅依赖 WAF。
|
||||
|
||||
### 1.2 XSS → 🟡 中危(理论风险高)
|
||||
|
||||
| 风险点 | 状态 | 影响 |
|
||||
|--------|------|------|
|
||||
| CKEditor 富文本编辑器 | 版本未知,历史 XSS 多 | 存储型 XSS 可能 |
|
||||
| 缺少 CSP 策略 | ❌ 未配置 | 无法防御内联脚本注入 |
|
||||
| jQuery 1.12.4 CVE | CVE-2020-11022/11023 | DOM XSS |
|
||||
| Token 在 localStorage | 可被 JS 直接读取 | XSS → Token 窃取 |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ 未实施 CSP(违反 1.2 输出编码/CSP 规范)
|
||||
- ❌ Token 未使用 HttpOnly Cookie(违反 1.2 HttpOnly Cookie 规范)
|
||||
- ❌ 使用陈旧 jQuery(违反 8.1 版本更新规范)
|
||||
|
||||
---
|
||||
|
||||
## 2. Web 客户端本地数据安全
|
||||
|
||||
### 2.1 Cookies 安全 → 🔴 高危
|
||||
|
||||
| Cookie | HttpOnly | Secure | SameSite | 评估 |
|
||||
|--------|----------|--------|----------|------|
|
||||
| `access_token` | ❌ 否 | 未确认 | 未设置 | 🔴 **紧急** |
|
||||
| `tenantId` | ❌ 否 | 未确认 | 未设置 | 🟡 中危 |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ 违反 2.1「HttpOnly 属性」规范 — Token Cookie 可被 JS 读取
|
||||
- ❌ 违反 2.1「SameSite 属性」规范 — 未设置跨站防护
|
||||
- ❌ 违反 2.1「Cookie 签名与加密」规范 — Token 明文存储
|
||||
|
||||
### 2.2 Local Storage 与 Session Storage → 🔴 紧急
|
||||
|
||||
| 存储位置 | 键名 | 泄露内容 | 风险 |
|
||||
|----------|------|----------|------|
|
||||
| localStorage | `portal-access_token` | 完整 JWT Token | 🔴 XSS → 冒充 |
|
||||
| localStorage | `errLog` | 后端堆栈/接口路径 | 🟡 架构泄露 |
|
||||
| sessionStorage | `ice-USER_DATA_INFO` | 手机号/邮箱/CA标识/userId | 🔴 PII 泄露 |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ **严重违反** 2.2「禁止存储敏感信息」规范 — JWT Token 明文存储于 localStorage
|
||||
- ❌ **严重违反** 2.2 规范 — PII(手机号 `13514069349`、邮箱 `3808789405@qq.com`)存储于 sessionStorage
|
||||
|
||||
---
|
||||
|
||||
## 3. 跨域安全与同源策略
|
||||
|
||||
### 3.1 CORS → 🟡 中危
|
||||
|
||||
| 测试 | 结果 |
|
||||
|------|------|
|
||||
| `Origin: https://evil.com` → Allow-Origin 回显 | ❌ 未回显(✅安全) |
|
||||
| `Access-Control-Allow-Headers` | `*`(🟡 过宽) |
|
||||
|
||||
**指南对照**:
|
||||
- ✅ 未盲目反射 Origin(符合 3.1 规范)
|
||||
- ❌ Headers 使用通配符(违反 3.1「限制允许的头部」规范)
|
||||
|
||||
### 3.2 CSRF → 🟡 中危
|
||||
|
||||
- 未发现 Anti-CSRF Token 机制
|
||||
- SameSite Cookie 未设置
|
||||
- 依赖 OAuth Bearer Token 作为隐式防护
|
||||
|
||||
**指南对照**:
|
||||
- ❌ 缺少 Anti-CSRF Token(违反 3.2 规范)
|
||||
- ❌ SameSite 未设置(违反 3.2 规范)
|
||||
|
||||
---
|
||||
|
||||
## 4. HTTPS 与传输层安全
|
||||
|
||||
### 4.1 未加密传输 → 🔴 高危
|
||||
|
||||
| 发现 | 详情 |
|
||||
|------|------|
|
||||
| OAuth 重定向使用 HTTP | `Location: http://zfcg.czt.fujian.gov.cn/gp-auth-center/oauth/authorize?...` |
|
||||
| 缺少 HSTS 头 | 未配置 `Strict-Transport-Security` |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ **严重违反** 4.1 MITM 防护规范 — OAuth 授权码通过 HTTP 明文传输
|
||||
- ❌ 违反 4.3「强制 HTTPS (HSTS)」规范
|
||||
|
||||
### 4.2 重放攻击 → 🟡 中危
|
||||
|
||||
- JWT 包含 `jti`(Token ID),理论上可用于防重放
|
||||
- 但未确认后端是否维护 jti 黑名单
|
||||
- Token 有效期 7 小时,窗口期较长
|
||||
|
||||
---
|
||||
|
||||
## 5. 身份认证与会话安全
|
||||
|
||||
### 5.1 密码安全 → 🟡 中危
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| 弱密码校验 | ❌ **已关闭**(`isShowWeakPassword: false`) |
|
||||
| 验证码强度 | 4 位静态图形码,OCR 可自动识别 |
|
||||
| 暴力破解防护 | ❌ **不存在** — 5 次快速尝试无阻断 |
|
||||
| 账户锁定机制 | ❌ 未发现 |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ 违反 5.1「防暴力破解」规范 — 无速率限制、无账户锁定、验证码强度极弱
|
||||
- ❌ 违反 5.1「密码策略」规范 — 弱密码校验被管理员关闭
|
||||
|
||||
### 5.2 会话管理 → 🟡 中危
|
||||
|
||||
| 维度 | 状态 |
|
||||
|------|------|
|
||||
| Token 算法 | ✅ RS256(安全) |
|
||||
| Token 有效期 | ⚠️ ~7 小时(过长) |
|
||||
| Token 过期校验 | ✅ 正常拒绝(code 5560) |
|
||||
| Session 固定防护 | 未测试 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 服务器端安全漏洞
|
||||
|
||||
### 6.1 SSRF → 未测试
|
||||
|
||||
### 6.2 XXE → 未测试(系统主要使用 JSON,非 XML)
|
||||
|
||||
### 6.3 文件上传 → 未测试
|
||||
|
||||
### 6.4 路径遍历 → 🟢 低危
|
||||
|
||||
| 测试 | Payload | 结果 |
|
||||
|------|---------|------|
|
||||
| 文件下载路径遍历 | `path=../../etc/passwd` | 空响应(被拦截) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 服务器配置与基础设施安全
|
||||
|
||||
### 7.1 Nacos 服务注册中心暴露 → 🔴 紧急
|
||||
|
||||
| IP | 端口 | TCP 状态 |
|
||||
|----|------|----------|
|
||||
| 112.54.45.252 | 8848 | **OPEN** |
|
||||
| 120.35.30.176 | 8848 | **OPEN** |
|
||||
| 114.115.172.176 | 8848 | **OPEN** |
|
||||
|
||||
**指南对照**:严重违反 7.x 服务器配置安全规范 — 微服务注册中心核心组件直接对公网暴露。
|
||||
|
||||
### 7.2 Spring Boot Actuator → 🟡 中危
|
||||
|
||||
- `/gateway/actuator/health|beans|mappings` 返回 401(Nginx Basic Auth)
|
||||
- `/gateway/actuator/env` 返回 403(额外封锁)
|
||||
|
||||
### 7.3 安全响应头 → 🟡 中危
|
||||
|
||||
| 响应头 | 状态 |
|
||||
|--------|------|
|
||||
| `X-Content-Type-Options: nosniff` | ✅ 已配置 |
|
||||
| `X-XSS-Protection: 1; mode=block` | ✅ 已配置 |
|
||||
| `X-Frame-Options` | ✅ `SAMEORIGIN` |
|
||||
| `Content-Security-Policy` | ❌ **缺失** |
|
||||
| `Strict-Transport-Security` | ❌ **缺失** |
|
||||
| `Referrer-Policy` | ✅ `no-referrer` |
|
||||
|
||||
### 7.4 非标端口暴露 → 🟡 中危
|
||||
|
||||
| IP | 端口 | 响应 |
|
||||
|----|------|------|
|
||||
| 112.54/120.35 | 8080 | 404 OpenResty |
|
||||
| 120.35.30.176 | 9090 | 502 Bad Gateway |
|
||||
| 114.115.172.176 | 8090 | 400 Bad Request |
|
||||
|
||||
---
|
||||
|
||||
## 8. 开源软件与依赖安全
|
||||
|
||||
| 组件 | 版本 | 已知 CVE | 风险 |
|
||||
|------|------|----------|------|
|
||||
| jQuery | 1.12.4 | CVE-2020-11022, CVE-2020-11023 | 🟡 中(XSS) |
|
||||
| CKEditor | 未知 | 多个历史 XSS CVE | 🟡 中 |
|
||||
| nginx | 1.20.2(华为云) | 非最新版 | 🟢 低 |
|
||||
| sm2.min.js | V3.0.0.574 | 未知 | 🟢 低 |
|
||||
|
||||
**指南对照**:
|
||||
- ❌ 违反 8.1「版本更新」规范 — jQuery 1.12.4 发布于 2016 年
|
||||
|
||||
---
|
||||
|
||||
## 9. 安全规范与全流程管理
|
||||
|
||||
| 发现 | 对应规范 |
|
||||
|------|----------|
|
||||
| HTML `data-tag` 暴露版本号 | 违反「信息最小化原则」 |
|
||||
| `config.js` 暴露 RSA 公钥/SM4 密钥 | 违反「敏感配置管理」规范 |
|
||||
| 错误日志写入 localStorage | 违反「生产环境日志管理」规范 |
|
||||
| `isShowWeakPassword: false` 生产环境暴露 | 违反「安全默认配置」原则 |
|
||||
|
||||
---
|
||||
|
||||
## 10. 提权攻击验证(实测记录)
|
||||
|
||||
### 10.1 userTypeNow 修改提权测试
|
||||
|
||||
| 步骤 | 操作 | 结果 |
|
||||
|------|------|------|
|
||||
| 1 | 读取 `sessionStorage['ice-USER_DATA_INFO']` | `userTypeNow: "3"` (代理机构) |
|
||||
| 2 | 修改 `userTypeNow` 为 `"1"` (疑似管理员) | ✅ 成功写入 sessionStorage |
|
||||
| 3 | 刷新页面 `location.reload()` | ⚠️ 弹出"登录超时",会话失效 |
|
||||
| 4 | 恢复 `userTypeNow` 为 `"3"` | 会话已失效,需重新登录 |
|
||||
|
||||
**结论**:
|
||||
- ✅ 后端/前端有角色一致性校验机制 — 修改 userTypeNow 后刷新会导致 Token 与 Session 数据不一致检测
|
||||
- ⚠️ **但未测试不刷新页面的情况** — 如果仅通过前端路由(SPA 内部跳转)而非页面刷新切换到管理员模块,可能绕过此校验
|
||||
- ⚠️ **角色枚举信息泄露** — Token Payload 暴露了角色体系(`userTypeNow: "3"`),攻击者可推断出完整的角色类型列表
|
||||
|
||||
### 10.2 PII 提取 → 社工攻击链
|
||||
|
||||
```
|
||||
sessionStorage['ice-USER_DATA_INFO']
|
||||
→ 手机号: 13514069349
|
||||
→ 邮箱: 3808789405@qq.com
|
||||
→ CA标识: 3452585403150523
|
||||
|
||||
攻击链:
|
||||
XSS漏洞 → 窃取 sessionStorage → 提取 PII
|
||||
→ 伪装成政采网客服致电/发邮件
|
||||
→ 诱导用户提供密码或 CA 证书
|
||||
→ 完全控制账户
|
||||
```
|
||||
|
||||
### 10.3 JWT Token 冒充攻击
|
||||
|
||||
```
|
||||
localStorage['portal-access_token']
|
||||
→ 完整 JWT Token(RS256 签名,7h 有效期)
|
||||
|
||||
攻击链:
|
||||
XSS漏洞 → 窃取 localStorage Token
|
||||
→ 在攻击者浏览器中设置 Cookie: access_token=<stolen_token>
|
||||
→ 直接访问 https://zfcg.czt.fujian.gov.cn/all-portal/portal/
|
||||
→ 完全冒充受害者身份进行所有操作(~7小时窗口)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 综合风险热力图
|
||||
|
||||
```
|
||||
影响severity →
|
||||
Low Medium High Critical
|
||||
┌─────────┬──────────┬─────────┬──────────┐
|
||||
Confirmed │ SQLi拦截 │ jQuery │ 无暴破 │ Token │
|
||||
已验证 │ 路径遍历 │ CORS * │ HTTP │ PII明文 │
|
||||
│ │ Actuator │ OAuth │ Nacos │
|
||||
├─────────┼──────────┼─────────┼──────────┤
|
||||
Likely │ │ CKEditor │ CSRF │ XSS→Token│
|
||||
可能 │ │ 版本暴露 │ IDOR │ 社工攻击 │
|
||||
├─────────┼──────────┼─────────┼──────────┤
|
||||
Potential │ │ Session │ 垂直越权│ │
|
||||
潜在 │ │ Fixation │ SSRF │ │
|
||||
└─────────┴──────────┴─────────┴──────────┘
|
||||
可能性 likelihood →
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 优先修复路线图
|
||||
|
||||
### P0 — 今日内
|
||||
1. 封禁 Nacos 8848/9848 端口公网访问
|
||||
2. JWT Token 迁移至 HttpOnly + Secure + SameSite Cookie
|
||||
3. 清除 sessionStorage 中的用户 PII 数据
|
||||
4. OAuth 重定向强制 HTTPS + 配置 HSTS
|
||||
|
||||
### P1 — 一周内
|
||||
5. 实施登录限速(5 次/分钟)+ 账户锁定(5 次失败锁 30 分钟)
|
||||
6. 配置 CSP 安全策略
|
||||
7. 启用弱密码校验 `isShowWeakPassword: true`
|
||||
8. 升级 jQuery 至 3.7+
|
||||
9. Actuator 从公网完全摘除
|
||||
|
||||
### P2 — 一月内
|
||||
10. Token 有效期缩短至 30 分钟 + Refresh Token
|
||||
11. CORS `Access-Control-Allow-Headers` 精确白名单
|
||||
12. 引入滑动拼图验证码替代图形码
|
||||
13. JWT Payload 最小化(移除 PII)
|
||||
14. 配置文件敏感信息改为后端动态下发
|
||||
在新工单中引用
屏蔽一个用户