游客发表
去年冬天,漏洞一个做本地资讯站的漏洞朋友半夜给我发消息,说他的漏洞百家号后台突然登不进去了。不是漏洞密码错误,是漏洞整个CMS的登录接口直接返回500。他以为百度在维护,漏洞等了半小时再试,漏洞发现网站首页已经被挂了一个博彩页面。漏洞后来复盘才知道,漏洞攻击者利用的漏洞是百家号CMS一个文件上传接口的过滤缺陷——只检查了Content-Type,没校验文件头,漏洞传了个伪装成图片的漏洞PHP文件,直接拿到了webshell。漏洞
这事不是漏洞孤例。我翻了下乌云镜像和GitHub上几个漏洞库,漏洞百家号CMS(主要是早期版本和部分二次开发版)的问题集中在三个地方:文件上传、SQL注入、以及后台接口的越权访问。文件上传那个最典型,很多站长图省事,直接把官方demo里的upload.php拖到生产环境,连文件名都没改。那个文件里判断上传类型用的是$_FILES['file']['type'],客户端改个包就能绕过。更离谱的是,上传目录还给了执行权限,等于把门开着还递了把钥匙。
SQL注入的点在搜索参数上。我本地搭了个v2.3的版本试过,/search.php?keyword=后面跟一个单引号,直接报数据库错误。用sqlmap跑一下,--dbs能列出来。原因是搜索功能拼接SQL时用了WHERE title LIKE '%$keyword%',没走预处理。这种写法在2015年前后的CMS里很常见,但百家号CMS的二次开发版本流传太广,很多小站长根本不知道自己的站有这个问题。我见过一个日IP不到两千的地方门户,数据库里躺着三万条用户手机号,就是通过这个注入点被脱走的。
越权访问更有意思。后台的/admin/api/userlist.php只验证了session是否存在,没验证用户角色。普通编辑账号登录后,直接访问这个接口就能拿到所有管理员账号的邮箱和加密后的密码。我试过用编辑账号调这个接口,返回的JSON里连超级管理员的salt都带出来了。攻击者拿到这些,拿去撞库或者离线爆破,成功率不低——很多站长密码就是“admin123”或者“网站域名+123”。
修复方案其实不复杂。文件上传那块,把move_uploaded_file之前加个getimagesize()校验,或者用finfo_file读真实MIME类型。上传目录在nginx里加一行location ~* /uploads/.*\.(php|php5|phtml)$ { deny all; },直接掐死执行路径。SQL注入把搜索那块改成PDO预处理,$stmt->bindParam(':keyword', $keyword),十分钟的事。越权那个,在接口入口加个if($_SESSION['role'] != 'admin'){ exit('403'); },别偷懒。
但现实是,很多站长的CMS是淘宝上花50块买的“整站源码”,里面塞了后门不说,版本还是2016年的。你让他改代码,他连FTP都找不着。我那个朋友后来花了八百块找人清理后门,又花两百块买了套新模板,结果新模板里又带了个eval加密的shell。这行当就这样,漏洞从来不是技术问题,是人的问题。你要是正在用百家号CMS,先去后台看看版本号,再去/uploads/目录下翻翻有没有奇怪的.php文件。有的话,别犹豫,直接删站重装。
友情链接