phpwind87漏洞

 人参与 | 时间:2026-10-17 07:07:20

2014年10月,WooYun漏洞平台上一个编号为#90771的条目被提交,标题写着“phpwind 8.7 前台任意文件上传”。当时没多少人意识到,这个漏洞会在接下来两三年里被脚本小子们玩出花来。phpwind作为国内老牌论坛系统,8.7版本装机量巨大,很多地方门户、校园论坛、甚至部分政府网站的内网社区都在跑这套代码。漏洞公开那几天,我正好在帮一个朋友看他的地方站,后台日志里突然冒出一堆奇怪的POST请求,路径全指向/wind/upload/index.php。

问题出在头像上传功能。phpwind 8.7允许用户上传自定义头像,但校验逻辑写得相当潦草。它只检查了文件扩展名是否在白名单里,却没有对文件内容做任何验证。更致命的是,上传后的文件被直接扔进/attachment/avatar/目录,且该目录默认没有禁用PHP解析。攻击者只要把shell.php改成shell.php.jpg,再在请求里伪造Content-Type: image/jpeg,就能绕过前端检测。服务端拿到文件后,会按原文件名保存——那个.jpg后缀根本没被强制追加,于是shell.php.jpg在服务器上依然以.php结尾。访问一下,直接执行。

我后来在本地搭了个测试环境复现。用Burp Suite抓包,把上传请求里的filename="test.php"改成filename="test.php.jpg",其余不动。返回包直接给了路径/attachment/avatar/1/2/test.php.jpg。浏览器里访问这个地址,PHP代码原样输出——说明没解析。但别急,phpwind的URL重写规则里有一条:如果文件不存在,会尝试去掉最后一个扩展名。也就是说,请求test.php.jpg时,Apache先找这个文件,找到了,但.jpg不在PHP解析范围内,所以不执行。可如果你请求test.php呢?服务器发现文件不存在,触发重写,内部跳转到test.php.jpg,这时候Apache按.php解析。一套组合拳下来,Getshell成功。

当时圈子里流传的EXP很简单,一个Python脚本,构造multipart/form-data请求,上传完直接连马。我见过最夸张的案例是某高校论坛,被人传了十几个不同名字的webshell,管理员愣是没发现。因为/attachment/目录平时没人看,日志里全是正常图片请求,混进去几个.php.jpg根本不起眼。直到有一天,服务器被用来发垃圾邮件,CPU跑满,运维才去查。

官方补丁出得不算慢,8.7 SP3版本里加了getimagesize()检测,还强制把上传文件重命名为随机字符串。但很多站长压根不更新——phpwind那时候已经走下坡路了,官方论坛都长草,谁还盯着版本号。更麻烦的是,不少站点用了第三方模板或插件,覆盖了核心上传逻辑,补丁打了等于没打。我2016年还碰到过一个站,用的是8.7原版,但/wind/upload/目录被改成了/plus/,漏洞照样存在,只是路径变了。

说句实在话,phpwind 8.7这个漏洞本身技术含量不高,就是典型的黑名单绕过加解析漏洞组合。但它暴露了一个老问题:很多国产CMS在功能迭代时,安全测试完全靠后。上传点随便写个in_array()就敢上线,路径拼接也不做过滤。后来Discuz也出过类似的事,但phpwind 8.7因为用户基数大、维护停滞,成了重灾区。如果你手里还有跑着这个版本的站,别犹豫,要么升级,要么直接把/attachment/目录的PHP解析关掉。别指望WAF,那玩意儿对.php.jpg这种请求经常放行。

顶: 32963踩: 9539