- 靶场环境: 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
13 KiB
13 KiB
🛡️ 福建省政府采购网 安全评估报告
目标站点:
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 后端架构
graph TD
A["浏览器 Client"] -->|HTTPS| B["OpenResty<br/>(Nginx+Lua)"]
B -->|/gateway/*| C["API 网关层"]
C --> D["gp-auth-center<br/>身份认证"]
C --> E["gp-trade<br/>电子交易"]
C --> F["gp-expert<br/>专家抽取"]
C --> G["gp-agency<br/>代理机构"]
C --> H["gp-complaint<br/>投诉管理"]
C --> I["gp-integrity<br/>诚信管理"]
C --> J["gp-frame<br/>框架协议"]
C --> K["gp-esign<br/>电签配置"]
C --> L["gp-supervise<br/>监督预警"]
C --> M["gp-cms<br/>内容管理"]
C --> N["gp-file<br/>文件服务"]
C --> O["gp-workflow<br/>工作流"]
C --> P["gp-message<br/>消息服务"]
C --> Q["gp-basic-data<br/>基础数据"]
C --> R["gpx-basic-platform<br/>基础业务平台"]
C --> S["gpe-evaluation<br/>评标管理"]
C --> T["gp-portal-center<br/>门户管理"]
B -->|静态资源| U["华为云<br/>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)
- ✅ OAuth 重定向强制使用 HTTPS + 配置 HSTS
- ✅ JWT Token 仅存放于 HttpOnly Cookie,移除 localStorage 存储
- ✅ 清除 sessionStorage 中的用户 PII 数据
- ✅ 生产环境关闭 errLog 写入 localStorage
尽快修复(P1)
- 配置 CSP 安全策略
- 启用弱密码校验(
isShowWeakPassword: true) - 升级 jQuery 至 3.6+
- 接口返回统一 404 替代 403
- 收紧 CORS
Access-Control-Allow-Headers
规划修复(P2)
- 引入行为验证码替代图形验证码
- 实施登录失败锁定机制
- 移除前端 config.js 中的密钥信息
- 移除 HTML data-tag 版本号标识