新吴区智慧营养健康餐厅安全整改方案

人审入口 · 2026-08-18更新 · 代码基线 store/master_patch

6项报告问题
5P0 紧急项
2+1代码/控制仓库 + 生产环境
发布门禁:CODE-01、CODE-02和CODE-04核心业务代码已完成,但客户旧版本尚未部署补丁;生产WebShell/凭据/备份清理、管理员改密与会话清理及复测仍未闭环,不得宣称整体漏洞已关闭。

整改范围

对象职责动作
store登录、上传、下载、大屏 API、PC/大屏前端、测试、SQL主要代码修改
zhctprompt方案、部署规则、版本登记、复测证据控制与证据更新
新吴区政务云(非Docker)Nginx、PHP-FPM、应用目录、文件、凭据、日志事件处置与部署整改

两条整改线:必须同时完成

A线|业务代码整改

执行位置:zhct/storemaster_patch

  • 密码:PC弱密码强制改密、12位规则、initial_pwd门禁和旧Token失效。
  • 上传:图片专用白名单、服务端MIME/解码校验、随机命名。
  • 下载:登录校验、realpath目录边界、临时ZIP清理。
  • 大屏:业务确认免登录,当前低危项记录风险接受,不进入代码开发。
  • 补齐SQL、PC/大屏前端、PHPUnit、HTTP回归和OpenAPI契约。

代码通过只代表补丁具备发布条件,不代表生产环境已关闭风险。

B线|部署侧整改

执行位置:新吴区政务云实际 Nginx、PHP-FPM、应用目录、数据库、Redis和备份环境。

  • 保全日志后隔离危险入口,扫描并清除后门和持久化。
  • 上传目录禁止PHP/PHTML/PHAR等脚本解析。
  • 轮换管理员、数据库、Redis和全部第三方泄露凭据。
  • 删除Web目录备份,迁移备份路径并封禁敏感扩展名。
  • 部署补丁、执行SQL、回读配置、业务复测并登记回滚点。

部署配置不能替代PHP接口的鉴权和输入校验。

业务代码整改清单

工作包修改位置明确动作验证
CODE-01 密码(开发完成)Login/User logic、登录/首页/账号前端、安全与HTTP回归PC弱密码不发Token、12位规则、initial_pwd门禁、缓存缺失Token失效;其他端不强制改密25/104、HTTP、Docker构建、Playwright均通过
CODE-02 上传(开发完成)Common.php、File.php、电子菜牌上传页、Nginx模板仅收紧 /p/common/upload,只允许JPG/JPEG/PNG;扩展名/MIME/图片解码/大小校验;上传目录脚本禁执行25项安全测试/104断言、HTTP回归、PC构建、脚本404/静态文件200对照通过
CODE-03 配置泄露结果项无独立业务代码CODE-02已阻断上传读取脚本;只清理历史脚本、轮换已泄露凭据、验证旧值失效;CODE-04另行修复独立读取路径原脚本URL 404、危险文件扫描、旧值失败、新值业务冒烟
CODE-04 下载(开发完成)Download.php、两个电子档案页面、安全/HTTP回归恢复登录、realpath边界、拒绝穿越/绝对路径/符号链接,临时ZIP移出Web目录安全目录41/134、HTTP下载路径场景、PC构建和匿名实际请求通过;提交faf17cfe0、d68455e3a
CODE-05 大屏(风险接受)无业务代码修改业务确认免登录;当前仅返回餐厅、设备、菜品余量和状态,报告为低危,本轮不开发风险接受说明、字段清单;限流/审计为可选加固
CODE-06 回归/契约tests/Security、Apifox HTTP、OpenAPICODE-01/02/04已进入自动化和证据包;大屏风险接受;增量OpenAPI已生成安全目录41/134、HTTP五组、证据包passed;Apifox真实导入待目录确认

部署侧整改清单

工作包明确动作验收证据
DEPLOY-01 隔离取证限制危险入口,保全Nginx/应用/系统/数据库日志和实例快照事件时间线、日志与快照清单
DEPLOY-02 清除后门先记录已知脚本stat/SHA256,移出Web目录隔离后删除;扫描上传/临时/Web目录、定时任务、启动项、SSH key和PHP自动加载;使用可信发布包重新部署原脚本URL 404、危险文件扫描为零、持久化检查、发布包校验值
DEPLOY-03 上传禁执行高优先级Nginx规则禁止上传目录脚本解析nginx -T、nginx -t、无害脚本访问403/404
DEPLOY-04 凭据轮换管理员、数据库、Redis、公众号、人脸、AI等全部轮换并清旧会话脱敏台账、旧值失效、新值连接和最小权限
DEPLOY-05 备份治理删除公开备份,迁移非Web路径,封禁敏感扩展名和隐藏文件原URL 403/404、新备份路径和权限回读
DEPLOY-06 大屏风险接受不改部署;记录免登录业务需求、低危等级和当前公开字段风险接受说明和重新打开条件
DEPLOY-07 发布观察部署补丁和SQL,执行主流程/安全复测并观察日志制品SHA、时间、服务状态、复测报告和回滚点

问题与决策

问题当前结论整改方向等级
管理员弱口令CODE-01已开发完成,待生产发布与复测PC弱密码强制改密、initial_pwd门禁、旧Token失效P0
任意文件上传/RCECODE-02开发完成,待客户环境部署JPG/JPEG/PNG白名单 + MIME/内容校验 + 上传目录禁执行P0
配置和凭据泄露CODE-02利用结果,不重复开发删除/隔离已上传脚本、排查持久化、轮换已泄露凭据;CODE-04独立修复P0
任意文件读取CODE-04开发完成,待客户环境部署登录校验 + realpath目录边界 + 非Web临时ZIPP0
大屏匿名访问业务确认免登录,低危风险接受不改登录;保持最小字段,可选限流/审计P1 接受
数据库备份泄露代码升级不能自动关闭清理文件、迁移备份、Nginx 封禁P0

逐漏洞解决方案

P0SEC-XW-01 管理员弱口令

问题:已知正确弱口令首次尝试即可登录,失败锁定无法阻止泄露口令被直接使用。

代码整改

  • PC后台正确弱密码不签发Token,只进入改密流程;改成强密码后重新登录。
  • PC新建、主动改密、过期改密统一为12~32位并包含大小写、数字和特殊字符。
  • 管理员还原继续使用initial_pwd,但配置不合规则拒绝还原。
  • 缓存不存在时旧Token直接失效;小程序、移动端和其他API不增加强制改密。

生产处置与验收

CODE-01已开发完成:提交719015a39、7c93d3c72、290a5ee1c;25项测试、104个断言、HTTP回归、Docker构建和Playwright验收通过。生产仍需修改报告管理员密码、确认不可预测的强initial_pwd、清理后台会话并复测旧密码/旧Token失效。

P0SEC-XW-02 任意文件上传导致 RCE

原问题:/p/common/upload 使用空校验规则,文件进入 Web 可访问目录,Nginx 又允许 PHP 解析。CODE-02现已在 master_patch完成开发,客户旧环境仍待部署。

取得后台登录态 → 上传脚本 → 文件进入 public/static/upload → Nginx 交给 PHP-FPM → 执行代码

代码整改

  • 为数字菜牌建立专用图片上传方法,只允许现有业务使用的 JPG/JPEG、PNG。
  • 同时校验扩展名、服务端 MIME、图片解码结果和大小,拒绝 SVG、PHP、PHAR、PHTML、HTML和双扩展名。
  • 服务端随机命名;失败时删除临时文件;不影响 Excel 等其他附件上传链路。

Web 层与验收

Nginx 对 /static/upload/ 永久禁止脚本解析。代码提交 03983cb81、证据提交 40871e429已推送;合法图片必须正常展示,伪造 MIME、脚本内容、双扩展名均应拒绝,人工放入脚本后访问返回403/404。

P0SEC-XW-03 配置与凭据泄露

关系判断:CODE-03不是另一条独立代码漏洞,而是攻击者利用CODE-02上传并执行配置读取脚本后的结果。CODE-02部署后不再重复开发CODE-03业务代码;但报告已展示配置内容,说明脚本执行过,历史泄露影响仍需处置。

CODE-02 上传并执行脚本 → 脚本读取现有配置 → CODE-03 配置/凭据泄露 CODE-02修复:阻断再次上传执行 CODE-03剩余:删除历史脚本 + 轮换已泄露凭据 + 验证旧值失效 CODE-04:另一条独立文件读取路径,仍需单独修复

事件处置

  1. 保全日志、文件元数据和实例快照,再隔离受影响入口。
  2. 扫描上传目录、临时目录、定时任务、启动项、SSH key 和 PHP 自动加载配置。
  3. 先记录已知脚本的stat和SHA256,将精确文件移出Web目录隔离,再按取证要求永久删除;原URL必须返回404。
  4. 使用可信提交和可信发布包重新部署应用目录,不以只删除一个WebShell作为全部清理完成标准。
  5. 轮换后台、数据库、Redis、公众号、人脸、AI及其他第三方凭据。
  6. 检查共享实例和其他租户,持续观察异常访问至少一个完整业务周期。

关闭证据

提供原脚本隔离/删除记录、URL 404、危险扩展扫描、可信发布包校验、脱敏轮换台账、旧凭据失效和最小权限验证。查看CODE-03最小方案与安全删除步骤

P0SEC-XW-04 任意文件读取

问题:下载接口不要求登录,并直接使用客户端提交的 file_array 路径,缺少真实路径边界。

前序覆盖判断:CODE-01、CODE-02及CODE-03处置均不能关闭该漏洞;上传白名单和Nginx禁执行不会阻止PHP应用读取服务器已有文件。

代码整改

  • 恢复 checkLogin,统一解析单文件和批量文件。
  • 拒绝空字节、绝对路径、协议路径、目录穿越和符号链接逃逸。
  • 通过 realpath() 确认目标是 public/static/upload/ 内的普通文件。
  • 批量下载任一文件非法则整体拒绝;临时 ZIP 使用系统临时目录并及时删除。

验收

现有电子档案单文件和批量下载保持正常;未登录、编码穿越、混合分隔符、绝对路径和符号链接用例全部失败,响应不泄露真实路径。查看CODE-04独立方案

P1SEC-XW-05 surplusBoard 公开大屏风险接受

业务结论:大屏本身要求免登录,匿名访问属于产品设计。当前仅返回餐厅名称、设备编号、菜品名称、剩余重量/比例和状态,不含人员、订单、金额或凭据。

本轮处理

扫描报告为低危;若客户整改范围只要求高危和中危,本项不修改业务代码,不增加登录、固定Token或设备身份。以业务用途、字段清单和风险接受说明响应扫描项。

可选加固与重新打开

可按实际屏幕数量设置兼容30秒轮询的限流并记录异常高频访问。未来新增敏感字段、要求餐厅隔离、发生滥用,或合同要求低危必须技术关闭时重新评审。

P0SEC-XW-06 数据库备份公开下载

问题:备份文件位于 Web 可访问目录时,无需登录即可通过 URL 下载;升级 PHP 代码不会自动删除这些文件。

部署整改

  • 清理 Web 根目录中的 SQL、备份包、配置副本和临时压缩包。
  • 备份迁移到非 Web 独立挂载目录或私有对象存储,并采用最小文件权限。
  • Nginx默认拒绝 SQL、BAK、BACKUP、DUMP、ENV、INI、LOG和隐藏文件。
  • ZIP/TAR/GZ按目录控制,只开放明确的受控业务下载目录。

验收

原备份 URL、常见备份文件名和隐藏文件均返回 403/404;正常静态资源和合法附件不受影响;新备份任务只写入非 Web 目录。

实施顺序

  1. 限制上传和下载,隔离受影响实例并保全日志。
  2. 将已完成的CODE-01/CODE-02补丁和Nginx上传目录禁执行规则部署到客户非Docker环境,并完成PHP-FPM业务冒烟。
  3. 完成CODE-04下载鉴权与路径边界开发并部署。
  4. 记录已知WebShell元数据和SHA后移出Web目录隔离/删除,同时清理公开备份和其他持久化点。
  5. 轮换全部泄露凭据并使旧 Session/Token 失效。
  6. 发布CODE-01,修改生产管理员密码、确认强initial_pwd并清理PC后台旧会话。
  7. 执行安全回归、业务回归、发布记录和复测关闭。

代码侧全量回归

当前结论:安全目录41项/134断言全绿,HTTP五组场景通过,PC/移动/大屏三端构建通过;完整PHPUnit相对整改前基线新增失败为0。

完整套件仍有31个基线已有错误/失败,不能写成历史仓库全部绿灯;客户非Docker部署、恶意文件/备份清理、凭据轮换和测评复测仍待执行。

查看完整代码侧回归报告

客户非Docker部署

部署必须按“止血取证—隔离后门—可信发布—Nginx/PHP-FPM生效—凭据轮换—备份迁移—业务与安全复测”执行;新凭据只能在清理/可信重部署后放入服务器。

查看生产整改部署手册

查看代码上线前逐步检查与加固

查看授权扫描场景的上线顺序

评审必须确认

  • 大屏访问网段与第三方依赖
  • 发布版本号、SQL 文件名和停机窗口
  • 客户项目绝对路径、PHP-FPM服务名和运行用户/组
  • 是否允许使用可信发布包重新部署应用目录
  • 补丁分支与客户维护分支的最终发布关系

关闭证据

  • 代码提交、自动化回归与 Apifox 结果
  • Nginx 生效配置和敏感文件扫描
  • 凭据轮换、旧值失效和后门排查记录
  • 版本、制品、部署时间和回滚点

评审状态

已确认:客户为非Docker部署;CODE-03按CODE-02利用结果去重,不新增独立业务代码。其余产品/项目、后端、前端、运维、安全/测试:待评审

完整方案以同目录 security-remediation-plan.md 为真源。本页不包含报告中的账号、密码、Token、数据库连接或恶意脚本。