去年秋天帮一个做本地生活信息的统漏朋友看站,他用的统漏就是yycms。站被挂马了,统漏首页底部多出一排赌博链接。统漏我上去翻代码,统漏十分钟就找到了入口——include/common.inc.php里有一段对$_REQUEST['webname']的统漏直接拼接,没过滤,统漏没转义,统漏直接进了SQL查询。统漏这就是统漏yycms最典型的注入点,老版本里到处都是统漏这种写法。
yycms这套系统在国内中小站长圈子里流传很广,统漏主打“轻量”“易二次开发”。统漏代码结构简单,统漏模板机制也直白,统漏改起来确实快。但问题恰恰出在“简单”上。开发者显然没有安全编码的习惯,整个系统的输入处理基本靠手写,没有统一过滤层。你打开任意一个模块文件,比如admin/目录下的管理页面,能看到大量$_GET、$_POST直接拼进SQL语句的写法。参数化查询?不存在的。
注入只是入口,文件上传才是重灾区
注入能拿到管理员密码哈希,但真正让攻击者舒服的是文件上传模块。admin/upload.php里判断文件类型用的是$_FILES['file']['type'],也就是客户端传来的MIME类型。这玩意儿随便改。把.php文件改成image/jpeg提交上去,系统就放行了。更离谱的是,上传后的文件路径直接拼在uploads/目录下,文件名也没做重命名或随机化处理。攻击者传一个shell.php,访问/uploads/shell.php就能执行任意代码。
我那个朋友的站就是被这么拿下的。日志里能看到攻击者先注入拿到管理员session,然后进后台传了个1.php,内容就一行eval($_POST['cmd'])。之后的事情就顺理成章了,挂马、提权、扫内网。
模板引擎的坑
yycms的模板解析用的是自己写的一套正则替换。这套东西本意是让站长能直接在模板里写PHP变量,但正则写得不够严谨,导致模板文件里如果包含特定构造的字符串,会被解析成PHP代码执行。这个漏洞利用门槛稍高,需要攻击者能控制模板内容,但结合后台弱口令或者注入拿到的权限,就变成了一条完整的利用链。
还有个细节:yycms默认安装后会生成一个install/目录,安装完成后并不会自动删除。虽然安装程序里有检测install.lock文件的逻辑,但这个文件在某些版本里压根没生成。攻击者可以直接重装系统,把数据库指向自己的服务器,或者干脆重置管理员密码。这个设计缺陷在2019年之前的版本里普遍存在。
为什么修不干净
yycms的更新频率很低。官方论坛最后活跃是2021年,之后基本停更。社区里有人发过补丁,但都是零散的,没有统一的安全版本。更麻烦的是,很多站长用的还是三四年前的版本,因为升级会覆盖自己改过的模板和功能。这就形成了一个恶性循环:漏洞公开→站长不升级→被批量扫描利用。
我后来给朋友的建议是直接换系统。不是yycms不能用,是维护成本太高。你每改一处功能,都可能引入新的注入点。除非你自己有安全开发能力,否则这套系统在公网上跑,基本等于裸奔。
如果你现在还在用yycms,至少做三件事:删掉install/目录,把uploads/的执行权限禁掉,后台密码换成十六位以上的随机串。能挡住大部分脚本小子的批量扫描。但真要安全,还是早点迁移吧。