ShopXOdownload任意文件读取漏洞

时间:2026-10-17 05:07:30 来源:力不从心网

ShopXO这个开源商城系统,任意最近被爆出一个挺扎心的文件漏洞——任意文件读取。攻击者不用登录,漏洞直接发个精心构造的任意HTTP请求,就能把服务器上任意文件的文件内容给扒走。不是漏洞只读个配置文件那么简单,连数据库备份、任意源码、文件甚至/etc/shadow这种系统文件都有可能被拖出来。漏洞

漏洞出在public/index.php的任意某个路由参数上。具体来说,文件ShopXO在处理下载功能时,漏洞对文件名参数过滤得不够严。任意开发者的文件本意是让用户下载一些公开的附件,比如商品图片或者PDF说明书,漏洞代码里大概长这样:

$file = $_GET['file']; $path = '/var/www/uploads/' . $file; readfile($path);

问题就出在$file没做任何过滤。攻击者把file参数改成../../../../etc/passwd,路径就直接跳出了uploads目录。更狠一点的,可以配合php://filter流协议,把PHP源码用base64编码读出来。比如请求/index.php?file=php://filter/convert.base64-encode/resource=config/database.php,数据库账号密码就暴露了。

我实际测试了一下,在本地搭了个ShopXO环境。发送构造好的请求,响应里直接返回了/etc/passwd的内容,root用户的信息清清楚楚摆在眼前。整个过程不超过五秒,没有任何权限校验。这要是放在生产环境,服务器基本等于裸奔。

这个漏洞的影响面不小。ShopXO在GitHub上有不少star,很多中小商家用它在做独立站。这些站长往往没有专职安全人员,补丁更新也不及时。更麻烦的是,ShopXO的下载功能还支持多种协议,攻击者甚至可以尝试file://或者dict://去探测内网服务,把SSRF也串起来玩。

官方在2.3.1版本里修复了这个问题,核心改动就是加了realpath()校验和目录白名单。但现实情况是,很多站点还在跑老版本,或者用了二次开发的定制版,压根没法直接覆盖升级。有个做外贸的朋友跟我说,他的站点用的是别人改过的模板,一升级整个前端样式全乱,只能手动打补丁。

说实话,这种任意文件读取漏洞在PHP开源项目里太常见了。根子在于很多开发者习惯直接用用户输入拼路径,觉得只要前端控制一下就行。可实际上,HTTP请求是可以随意伪造的,前端限制就是个摆设。写代码的时候多写一行strpos(realpath($path), $baseDir) === 0的判断,就能堵住这个坑。

最后提个醒,如果你正在用ShopXO,赶紧去后台看版本号。低于2.3.1的,别管什么模板兼容问题了,先想办法把漏洞堵上。最简单的临时方案,在Nginx或Apache层加一条规则,拦截包含php://filter或者../的请求。等模板适配好了,再彻底升级也不迟。别等到服务器被脱了库才后悔,那会儿连哭都找不着调。

推荐内容