# 🛡️ 福建省政府采购网 安全评估报告
> **目标站点**:`https://zfcg.czt.fujian.gov.cn`
> **评估时间**:2026-03-09
> **评估范围**:前端架构 / 后端接口 / 服务器基础设施 / 弱口令
---
## 一、系统架构总览
### 1.1 前端架构
| 维度 | 详情 |
|------|------|
| **框架** | Vue.js + Alibaba icestark 微前端架构 |
| **构建工具** | Vite(登录模块 gp-auth-web)/ Vue CLI(主站 gpcms-center-web)|
| **版本标识** | 登录:`V6.0.33.1_2_251020_GP-AUTH-WEB` / 主站:`V6.5.15.1_1_20260119_gpcms-center-web` |
| **加密库** | SM2 国密算法 (`sm2.min.js` V3.0.0.574)、SM4 对称加密、RSA 加密 |
| **依赖库** | jQuery 1.12.4、qrcode.min.js、CKEditor(富文本)、axios |
| **CA 组件** | Kinggrid 金格电子签章、GEL 格尔CA、ZHCAUnifiedTools(数字证书工具)|
| **第三方服务** | Udesk 在线客服、gov.govwza.cn 适老化脚本、纠错系统(sitecode: 2300000055)|
#### 前端子系统清单
```
gp-auth-web → 统一身份认证/登录 (Vite SPA)
gpcms-center-web → 门户首页/公开信息 (Vue CLI SPA)
all-portal/portal → 工作台仪表盘 (icestark 微前端宿主)
```
### 1.2 后端架构
```mermaid
graph TD
A["浏览器 Client"] -->|HTTPS| B["OpenResty
(Nginx+Lua)"]
B -->|/gateway/*| C["API 网关层"]
C --> D["gp-auth-center
身份认证"]
C --> E["gp-trade
电子交易"]
C --> F["gp-expert
专家抽取"]
C --> G["gp-agency
代理机构"]
C --> H["gp-complaint
投诉管理"]
C --> I["gp-integrity
诚信管理"]
C --> J["gp-frame
框架协议"]
C --> K["gp-esign
电签配置"]
C --> L["gp-supervise
监督预警"]
C --> M["gp-cms
内容管理"]
C --> N["gp-file
文件服务"]
C --> O["gp-workflow
工作流"]
C --> P["gp-message
消息服务"]
C --> Q["gp-basic-data
基础数据"]
C --> R["gpx-basic-platform
基础业务平台"]
C --> S["gpe-evaluation
评标管理"]
C --> T["gp-portal-center
门户管理"]
B -->|静态资源| U["华为云
114.115.172.176"]
```
| 组件 | 技术 |
|------|------|
| **反向代理** | OpenResty (Nginx + Lua) |
| **认证协议** | OAuth 2.0 Authorization Code Flow |
| **令牌格式** | JWT (access_token) |
| **微服务数量** | 至少 **15+** 个独立微服务 |
| **部署** | 本地机房(电信/移动)+ 华为云混合部署 |
---
## 二、前端风险评估
### 🔴 高危风险
#### F-01:JWT Token 明文多处存储
> [!CAUTION]
> `access_token`(JWT)同时存储在 `Cookie` 和 `localStorage` 中,一旦发生 XSS 攻击,攻击者可直接窃取 Token 并冒充用户访问所有后端接口。
- **位置**:Cookie `access_token` + `localStorage['access_token']`
- **影响**:完全的会话劫持,可遍历所有业务子系统
- **建议**:Token 仅存放于 `HttpOnly + Secure + SameSite=Strict` 的 Cookie 中,禁止前端 JS 直接读取
#### F-02:sessionStorage 明文存储用户 PII 数据
> [!CAUTION]
> `sessionStorage` 中以明文 JSON 存储了完整的用户个人信息,包含**手机号、邮箱、身份证号后缀、机构编码**等敏感数据。
- **影响**:XSS 攻击可一次性提取全部用户身份信息
- **建议**:最小化存储原则,仅保存用户 ID 和必要的显示名称,不缓存身份证/手机号等 PII
#### F-03:错误日志泄露后端架构信息
- **位置**:`localStorage['errLog']`
- **内容**:包含后端**内部接口路径、组件堆栈信息、完整 URL 映射**
- **影响**:攻击者无需主动探测即可获得后端微服务拓扑
- **建议**:生产环境禁止向 localStorage 写入错误堆栈,使用远程错误上报服务
### 🟡 中危风险
#### F-04:配置文件公开暴露敏感密钥
- **文件**:`/gp-auth-web/config.js` 和 `/gpcms-center-web/static/config.js`
- **泄露内容**:
| 泄露项 | 值(摘要) |
|--------|-----------|
| SM4 加密公钥 | `bd03ed6802681a34166256aba610becf` |
| RSA 公钥 | ASCII 编码完整公钥 |
| 网关架构 | 完整的 gateway 路径和 logout/logo 接口 |
| 内网 IP | `114.115.172.176`(华为云) |
- **影响**:攻击者可利用公钥伪造加密请求、了解完整系统拓扑
- **建议**:敏感配置通过后端 API 动态下发,移除客户端硬编码
#### F-05:缺少 Content-Security-Policy (CSP) 策略
- **现状**:页面未配置任何 CSP Meta 标签或 HTTP 响应头
- **影响**:无法防御 XSS 注入、内联脚本执行、恶意外部资源加载
- **建议**:配置严格 CSP,至少包含 `script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:`
#### F-06:弱密码校验功能被禁用
- **配置**:`config.js` 中 `isShowWeakPassword: false`
- **影响**:用户可使用 `123456`、`password` 等弱密码注册和登录
- **建议**:`isShowWeakPassword` 改为 `true`,并在后端同步校验密码强度
#### F-07:jQuery 版本过旧
- **当前版本**:jQuery 1.12.4(2016 年发布)
- **已知 CVE**:CVE-2020-11022、CVE-2020-11023(XSS 漏洞)
- **建议**:升级至 jQuery 3.6+ 或移除 jQuery 依赖
#### F-08:版本号暴露
- **位置**:HTML `data-tag` 属性
- **值**:`V6.0.33.1_2_251020_GP-AUTH-WEB`、`V6.5.15.1_1_20260119_gpcms-center-web`
- **影响**:攻击者可精确匹配已知漏洞
- **建议**:生产环境移除版本标识
---
## 三、后端接口风险评估
### 🔴 高危风险
#### B-01:OAuth 授权重定向使用 HTTP 协议
> [!CAUTION]
> 网关返回的 OAuth 授权重定向 URL 使用的是 **HTTP 而非 HTTPS**:
> `Location: http://zfcg.czt.fujian.gov.cn/gp-auth-center/oauth/authorize?...`
> 这意味着授权码在传输过程中**以明文形式发送**,容易被中间人攻击(MITM)截获。
- **复现**:`curl -sI https://zfcg.czt.fujian.gov.cn/gateway/gp-auth-center/rest/v2/login/captcha`
- **302 Location** 指向 `http://` 开头的 URL
- **建议**:强制所有 OAuth 流程使用 HTTPS,配置 HSTS 响应头
#### B-02:接口路径高度可预测可枚举
- **命名规范**:所有微服务路径均遵循 `gp-{业务名称}` 格式
- **枚举结果**(15 个已确认服务):
| 路径 | HTTP 状态码 | 说明 |
|------|------------|------|
| `/gateway/api/oauth` | 500 | 认证网关(异常暴露) |
| `/gp-auth-center` | 302 | 身份认证中心 |
| `/gp-basic-data` | 403 | 基础数据服务 |
| `/gp-trade` | 403 | 电子交易 |
| `/gp-expert` | 403 | 专家抽取 |
| `/gp-agency` | 403 | 代理机构管理 |
| `/gp-complaint` | 403 | 投诉管理 |
| `/gp-integrity` | 403 | 诚信管理 |
| `/gp-frame` | 403 | 框架协议 |
| `/gp-esign` | 403 | 电签配置 |
| `/gp-supervise` | 403 | 监督预警 |
| `/gp-cms` | 403 | 内容管理 |
| `/gp-file` | 403 | 文件服务 |
| `/gp-workflow` | 403 | 工作流引擎 |
| `/gp-message` | 403 | 消息服务 |
- **建议**:在网关层返回统一的 404 而非 403(403 确认了服务存在),增加请求频率限制
#### B-03:网关未认证接口返回 500 并泄露堆栈
- **现象**:`/gateway/api/oauth/checkToken` 返回 `500 Internal Server Error`
- **响应头**含 `Content-Type: application/json`,可能包含内部错误信息
- **建议**:未认证请求统一返回 401,不暴露内部错误
### 🟡 中危风险
#### B-04:潜在越权风险(IDOR/水平越权)
- **机制**:后端接口依赖前端传递的 `tenantId`(租户 ID)和 `userId` 进行数据隔离
- **风险**:若后端未对当前 Token 所属租户进行严格校验,攻击者可篡改 tenantId 访问其他机构数据
- **建议**:所有接口从 Token 声明中提取租户信息,禁止接受客户端传参覆盖
#### B-05:OAuth 回调地址缺乏白名单校验
- **302 响应**中 `redirect_uri` 参数固定为 `https://zfcg.czt.fujian.gov.cn:443/gateway/api/oauth/authorization_code_callback`
- 需确认后端是否严格校验 redirect_uri,防止开放重定向攻击
- **建议**:后端强制校验 redirect_uri 白名单
#### B-06:Access-Control-Allow-Headers 配置过宽
- **响应头**:`Access-Control-Allow-Headers: *`
- **影响**:允许任意跨域请求携带任意自定义头,增加 CSRF 攻击面
- **建议**:精确限制允许的 Headers 列表
---
## 四、服务器基础设施
### 4.1 服务器 IP 信息
| 项目 | 值 |
|------|------|
| **主站 IP(移动线路)** | `112.54.45.252`(福建福州 中国移动)|
| **主站 IP(电信线路)** | `120.35.30.176`(福建福州 中国电信)|
| **云端服务 IP** | `114.115.172.176`(华为云 北京区域,用于签章和部分配置服务)|
| **DNS 解析** | 本地代理 `198.18.3.186`,NS 指向 `icloudv6.com` |
| **所属网段** | CHINANET Fujian province network (218.85.0.0 - 218.86.127.255) |
| **Web服务器** | OpenResty (Nginx + Lua) |
### 4.2 同域名/关联站点矩阵
| 站点地址 | 服务类型 | 说明 |
|----------|----------|------|
| `zfcg.czt.fujian.gov.cn` | 政府采购网主站 | Vue.js SPA + 微前端聚合 |
| `czt.fujian.gov.cn` | 财政厅官网 | 上级主管部门门户 |
| `czpj.czt.fujian.gov.cn` | 财政评价系统 | 财政评价业务 |
| `ggzyfw.fujian.gov.cn` | 公共资源交易服务 | 专家库关联,可能共享 CA 体系 |
| `zwfw.rst.fujian.gov.cn` | 人社厅政务服务 | 通过相同 CA 体系关联登录 |
| `app.slt.fujian.gov.cn` | 政务移动端 | 关联移动入口 |
| `gov.govwza.cn` | 适老化服务 CDN | 第三方无障碍访问脚本 |
### 4.3 开源组件与第三方服务清单
| 组件名称 | 版本 | 类型 | 风险等级 |
|----------|------|------|----------|
| jQuery | 1.12.4 | 开源 JS 库 | 🔴 高(已知 XSS CVE)|
| Vue.js | 2.x/3.x | 前端框架 | 🟢 低 |
| CKEditor | 未知 | 富文本编辑器 | 🟡 中(历史 XSS 漏洞较多)|
| qrcode.min.js | 未知 | 二维码生成 | 🟢 低 |
| sm2.min.js | V3.0.0.574 | 国密算法库 | 🟢 低(专用密码学库)|
| Udesk | SaaS | 在线客服 | 🟡 中(第三方脚本注入)|
| Kinggrid 金格 | 未知 | 电子签章 | 🟢 低(行业组件)|
| GEL 格尔CA | 未知 | 数字证书 | 🟢 低 |
---
## 五、弱口令风险评估
### 🟡 中高危
#### W-01:弱密码校验已被关闭
- **配置证据**:`isShowWeakPassword: false`
- **影响**:允许用户设置和使用弱密码登录,攻击者可通过字典攻击暴力破解账户
#### W-02:验证码强度不足
- **类型**:静态图形验证码(4-5 位字母数字混合)
- **风险**:易被 OCR 工具自动识别(本次评估中浏览器代理即自动识别通过)
- **建议**:采用滑动拼图验证码或行为验证(如极验 / 阿里云验证)
#### W-03:缺乏登录失败锁定机制(待确认)
- **观察**:登录页面未见明显的错误次数限制提示
- **风险**:攻击者可无限制尝试不同密码组合
- **建议**:实施 5 次失败锁定 30 分钟 + 短信告警机制
#### W-04:统一身份认证的连锁风险
- 采购网与多个政务系统共享统一 CA/OAuth 认证体系
- 一旦单点账户泄露,可能横向穿透到财政评价、公共资源交易等关联系统
- **建议**:关键业务操作强制 UKey / 短信双因子认证
---
## 六、风险总结矩阵
| 编号 | 风险点 | 严重程度 | 类型 |
|------|--------|----------|------|
| F-01 | JWT Token 明文多处存储 | 🔴 高危 | 前端 |
| F-02 | sessionStorage 明文存储 PII | 🔴 高危 | 前端 |
| F-03 | 错误日志泄露后端架构 | 🔴 高危 | 前端 |
| F-04 | 配置文件暴露加密密钥 | 🟡 中危 | 前端 |
| F-05 | 缺少 CSP 安全策略 | 🟡 中危 | 前端 |
| F-06 | 弱密码校验被禁用 | 🟡 中危 | 前端 |
| F-07 | jQuery 版本过旧有 CVE | 🟡 中危 | 前端 |
| F-08 | 版本号暴露 | 🟢 低危 | 前端 |
| B-01 | OAuth 重定向使用 HTTP | 🔴 高危 | 后端 |
| B-02 | 接口路径可枚举 | 🟡 中危 | 后端 |
| B-03 | 网关错误泄露内部信息 | 🟡 中危 | 后端 |
| B-04 | 潜在 IDOR 越权风险 | 🟡 中危 | 后端 |
| B-05 | OAuth 回调白名单待确认 | 🟡 中危 | 后端 |
| B-06 | CORS Headers 配置过宽 | 🟡 中危 | 后端 |
| W-01 | 弱密码校验关闭 | 🟡 中危 | 弱口令 |
| W-02 | 验证码强度不足 | 🟡 中危 | 弱口令 |
| W-03 | 缺乏登录失败锁定 | 🟡 中危 | 弱口令 |
| W-04 | 统一认证连锁风险 | 🟡 中危 | 弱口令 |
> **高危:4 项** / **中危:12 项** / **低危:2 项** / **总计:18 项风险点**
---
## 七、优先修复建议
### 立即修复(P0)
1. ✅ OAuth 重定向强制使用 HTTPS + 配置 HSTS
2. ✅ JWT Token 仅存放于 HttpOnly Cookie,移除 localStorage 存储
3. ✅ 清除 sessionStorage 中的用户 PII 数据
4. ✅ 生产环境关闭 errLog 写入 localStorage
### 尽快修复(P1)
5. 配置 CSP 安全策略
6. 启用弱密码校验(`isShowWeakPassword: true`)
7. 升级 jQuery 至 3.6+
8. 接口返回统一 404 替代 403
9. 收紧 CORS `Access-Control-Allow-Headers`
### 规划修复(P2)
10. 引入行为验证码替代图形验证码
11. 实施登录失败锁定机制
12. 移除前端 config.js 中的密钥信息
13. 移除 HTML data-tag 版本号标识