# 🛡️ 福建省政府采购网 安全评估报告 > **目标站点**:`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 版本号标识