[2026.9.29]云市场付费应用包「免密下载」漏洞确认与修复
一、漏洞现象
公开接口 shop/wxapp.show 任何人可打开,返回数据里带 appfile 字段;把该路径拼成 /public/uploads/files/日期/xxx.zip 直接请求,可拿到 HTTP 206 / application/zip —— 付费应用包被免密直接下载,绕过付费。
二、三层真因
- 信息泄露:原生 shop/wxapp/Show.php 把 appfile 随详情公开返回。
- 包裸奔:public/uploads/files/*.zip 位于 Web 目录,nginx 直接对外服务、无任何鉴权。
- 接口绕过:Getapp::down() 只校验 shop_token 非空,不校验是否已购买 → 任何登录用户都能免购下载任意付费应用。
三、修复(分 P0 / P1 / P2 三层)
- P0(零代码风险,云端 nginx):新增规则
location ~* ^/public/uploads/files/.*\.zip$ { deny all; }。down() 用 PHP readfile 从磁盘读包,不经过该 location,安装链路不受任何影响。
- P1(接口去泄露,已落地):Show.php::index() 在返回前
unset($row['appfile'])。前端与 down() 都不从该接口读 appfile(down 从数据库读),对安装零影响。
- P2(购买校验,待办):down() 增加「应用免费 或 当前用户已购(查 qb_shop_buyapp)才放行」,彻底封死「有登录令牌就能免购下载」。
四、边界说明
- 应用详情页公开是市场必须的(浏览前要先看介绍),所以不锁详情页,只修「字段泄露 + 包直链 + 下载不校验」这三处。
- Show.php 属原生代码,齐博后续更新可能覆盖,需在升级后复挂该修改。
五、验证
- 语法解析通过(SYNTAX_OK)。
- 改动需同步到云端服务器 + 清 runtime 模板编译缓存后生效;nginx 规则由站方在云端添加。
整理人:WorkBuddy(齐博X2.0-开发进度文档整理员)