php实现Linux服务器木马排查及加固功能

网站频繁被挂马?做一些改进,基本上能把这个问题解决,因为discuz x等程序存在漏洞,被上传了websehll,每次被删除过段时间又出来了,最终查到所有的木马。

从以下几个方面查找并加强(如果能不开启会员功能,不给任何上传入口,保护好后台密码,加固好PHP,一般就没什么问题了)。

1.根据特征码查找:

php木马一般含有

代码如下:

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

或者

代码如下:

<?php assert($_POST[cmd]);?>

find /wwwroot/* -type f -name "*.php" |xargs grep "eval(" > /wwwroot/scan.txt

结果就查出很多明显的webshell,并且发现都藏在attachment等目录下

2.利用网上的一个php代码,搜索最近被修改的文件

scandir.php
内容如下:

代码如下:

<?php
set_time_limit(0);//防止超时
/**
*
* php目录扫描监控增强版
*
* @author lssbing (lssbing#gmail.com)
* @date 2010-1-18
* @license BSD
* @version 1.0
*
下面几个变量使用前需要手动设置
*
**/
/*===================== 程序配置 =====================*/
$pass="12345";//设置密码
$jkdir="."; //设置监控扫描的目录,当前目录为'.',上一级目录为'..',也可以设置绝对路径,后面不要加斜杠,默认为当前目录
$logfilename="./m.log";//设置存储log的路径,可以放置在任意位置
$exclude=array('data','images');//排除目录
$danger='eval|cmd|passthru|gzuncompress';//设置要查找的危险的函数 以确定是否木马文件
$suffix='php|inc';//设置要扫描文件的后缀
/*===================== 配置结束 =====================*/
 
$filename=$_GET['filename'];
$check=$_GET['check'];
$jumpoff=false;
$url = $_SERVER['PHP_SELF'];
$thisfile = end(explode('/',$url));
$jump="{$thisfile}|".implode('|',$exclude);
$jkdir_num=$file_num=$danger_num=0;
define('M_PATH',$jkdir);
define('M_LOG',$logfilename);
if ($check=='check')
{
$safearr = explode("|",$jump);
$start_time=microtime(true);
safe_check($jkdir);
$end_time=microtime(true);
$total=$end_time-$start_time;
$file_num=$file_num-$jkdir_num;
$message= " 文件数:".$file_num;
$message.= " 文件夹数:".$jkdir_num;
$message.= " 可疑文件数:".$danger_num;
$message.= " 执行时间:".$total;
echo $message;
}else{
if ($_GET['m']=="del") Delete();//处理文件删除
//读取文件内容
if(isset($_GET['readfile'])){
//输出查看密码,密码校验正确以后输出文件内容
if(emptyempty($_POST['passchack'])){
   echo"<form id=\"form1\" name=\"form1\" method=\"post\">"
    . " <label>pass"
    . " <input type=\"text\" name=\"passchack\" />"
    . " </label>"
    . " <input type=\"submit\" name=\"Submit\" value=\"提交\" />"
    . "</form>"
   ."";
   exit;
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
   $code=file_get_contents($_GET['readfile']);
   echo"<textarea name=\"code\" cols=\"150\" rows=\"30\" id=\"code\" style='width:100%;height:450px;background:#cccccc;'>{$code}</textarea>";
   exit;
}else{
   exit;
}
 
}else{
record_md5(M_PATH);
if(file_exists(M_LOG)){
        $log = unserialize(file_get_contents(M_LOG));
}else{
        $log = array();
}
 
if($_GET['savethis']==1){
//保存当前文件md5到日志文件
@unlink(M_LOG);
file_put_contents(M_LOG,serialize($file_list));
echo "<a href='scandir.php'>保存成功!点击返回</a>";
exit;
}
if(emptyempty($log)){
echo "当前还没有创建日志文件!点击[保存当前]创建日志文件!";
}else{
if($file_list==$log){
   echo "本文件夹没有做过任何改动!";
}else{
   if(count($file_list) > 0 ){
    foreach($file_list as $file => $md5){
    if(!isset($log[$file])){
     echo "新增文件:<a href={$file} target='_blank'>".$file."</a>"." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." <a href=?readfile={$file} target='_blank'>源码</a><a href='?m=del&filename={$file}' target='_blank'>删除</u></a><br />";
    }else{
     if($log[$file] != $md5){
     echo "修改文件:<a href={$file} target='_blank'>".$file."</a>"." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." <a href=?readfile={$file} target='_blank'>源码</a><br />";
 
     unset($log[$file]);
     }else{
     unset($log[$file]);
     }
    }
    }
   }
   if(count($log)>0){
    foreach($log as $file => $md5){
    echo "删除文件:<a href={$file} target='_blank'>".$file."</a><br />";
    }
   }
    }
}
}
}
 
//计算md5
function record_md5($jkdir){
        global $file_list,$exclude;
        if(is_dir($jkdir)){
                $file=scandir($jkdir);
                foreach($file as $f){
                        if($f!='.' && $f!='..' && !in_array($f, $exclude)){
                                $path = $jkdir.'/'.$f;
                                if(is_dir($path)){
                                        record_md5($path);
                                }else{
                                        $file_list[$path]=md5_file($path);
                                }
                        }
                }
        }
}
 
function Safe_Check($jkdir)//遍历文件
{
global $danger ,$suffix ,$jkdir_num ,$file_num ,$danger_num;
 
$hand=@dir($jkdir) or die('文件夹不存在') ;
while ($file=$hand->read())
{
    $filename=$jkdir.'/'.$file;
    if (!$jumpoff) {
   if(Jump($filename))continue;
    }
    if(@is_dir($filename) && $file != '.' && $file!= '..'&& $file!='./..')
    {   $jkdir_num++;
    Safe_Check($filename);
    }
    if (preg_match_all ("/\.($suffix)/i",$filename,$out))
    {
 
   $str='';
   $fp = @fopen($filename,'r')or die('没有权限');
   while(!feof($fp))
   {
   $str .= fgets($fp,1024);
   }
   fclose($fp);
   if( preg_match_all ("/($danger)[ \r\n\t]{0,}([\[\(])/i",$str,$out))
   {
   echo "<font color='green' style='font-size:14px'>可疑文件:{$filename}</font>"." 创建时间:".date("Y-m-d H:i:s",filectime($filename))." 修改时间:".date("Y-m-d H:i:s",filemtime($filename))." <a href='?readfile={$filename}' target='_blank'><u>查看代码</u></a> <a href='?m=del&filename=$filename' target='_blank'>删除</u></a><br>";
   $danger_num++;
   }
    }
    $file_num++;
}
}
function Edit()//查看可疑文件
{
global $filename;
$filename = str_replace("..","",$filename);
$file = $filename;
$content = "";
if(is_file($file))
{
    $fp = fopen($file,"r")or die('没有权限');
    $content = fread($fp,filesize($file));
    fclose($fp);
    $content = htmlspecialchars($content);
 
}
echo "<textarea name='str' style='width:100%;height:450px;background:#cccccc;'>$content</textarea>\r\n";
exit();
}
function Delete()//删除文件
{ global $filename,$pass;
if(emptyempty($_POST['passchack'])){
    echo"<form id=\"form1\" name=\"form1\" method=\"post\">"
   . " <label>pass"
   . " <input type=\"text\" name=\"passchack\" />"
   . " </label>"
   . " <input type=\"submit\" name=\"Submit\" value=\"提交\" />"
   . "</form>"
    ."";
    exit;
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
   (is_file($filename))?($mes=unlink($filename)?'删除成功':'删除失败 查看权限'):'';
   echo $mes;
   exit();
}else{
   echo '密码错误!';
   exit;
}
}
function Jump($file)//跳过文件
{
global $jump,$safearr;
if($jump != '')
{
    foreach($safearr as $v)
    {
   if($v=='') continue;
   if( eregi($v,$file) ) return true ;
    }
}
return false;
}
?>
<a href="scandir.php">[查看文件改动]</a>|<a href="scandir.php?savethis=1">[保存当前文件指纹]</a>|<a href="scandir.php?check=check">[扫描可疑文件]</a>

执行后能看到最近被修改的文件,具有参加价值

3.修改php.ini,限制以下函数

代码如下:

disable_functions =  phpinfo,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocke,popen,proc_close,curl_exec,curl_multi_exec,parse_ini_file,show_source,dl,escapeshellarg,escapeshellcmd

4.修改nginx.conf ,限制一些目录执行php文件

代码如下:

server
{
    listen       80;
    server_name  www.***.com;
    index   index.htm index.html index.php;
    root  /wwwroot/;
    
 
      
    rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
    rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
    rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
    rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
    rewrite ^([^\.]*)/([a-z]+)-(.+)\.html$ $1/$2.php?rewrite=$3 last;
    rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
        
 
        location ~ ^/images/.*\.(php|php5)$
                {
              deny all;
                }
 
        location ~ ^/static/.*\.(php|php5)$
                {
               deny all;
                }
 
        location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
            {
                deny all;
            }
 
    location ~ .*\.(php|php5)?$
    {      
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }
    
        
 
error_page  400 /404.html;
error_page  403 /404.html;
error_page  404 /404.html;
error_page  405 /404.html;
error_page  408 /404.html;
error_page  410 /404.html;
error_page  411 /404.html;
error_page  412 /404.html;
error_page  413 /404.html;
error_page  414 /404.html;
error_page  415 /404.html;
error_page  500 /404.html;
error_page  501 /404.html;
error_page  502 /404.html;
error_page  503 /404.html;
error_page  506 /404.html;
 
 
log_format  acclog    "$remote_addr $request_time $http_x_readtime [$time_local] \"$request_method http://$host$request_uri\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\"";
        access_log  /logs/access.log  acclog;
}

此处需要注意的是

代码如下:

location ~ ^/images/.*\.(php|php5)$
{
  deny all;
}

这些目录的限制必须写在

代码如下:

location ~ .*\.(php|php5)?$
{      
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  include fcgi.conf;
}

的前面,否则限制不生效。

(0)

相关推荐

  • 利用PHP脚本在Linux下用md5函数加密字符串的方法

    #touch a.php //创建a.php文件 #vi a.php //用vi 编辑a.php文件 将<?php echo md5(123456); ?>输入进去后保存 #php a.php //运行a.php文件 显示:e10adc3949ba59abbe56e057f20f883e A.在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序.一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行.可以用下面的命令来获取md5sum命令帮助

  • Linux系统下php获得系统分区信息的方法

    本文实例讲述了Linux系统下php获得系统分区信息的方法.分享给大家供大家参考.具体实现方法如下: $pars = array_filter(explode("\n",`df -h`)); foreach ($pars as $par) { if ($par{0} == '/') { $_tmp = array_values(array_filter(explode(' ',$par))); reset($_tmp); echo "分区挂载点:{$_tmp['5']},&q

  • linux下实现定时执行php脚本

    在linux中输入命令 复制代码 代码如下: crontab -e 然后使用vim的命令编辑打开的文件,输入 复制代码 代码如下: 0 * * * * /usr/bin/php -f /home/userxxx/update.php 保存,退出,好了,现在系统会在每个0点自动执行update.php脚本,脚本中可以编写数据库执行,自动发邮件等功能. 注:直接写成 0 * * * * php -f /home/userxxx/update.php将不会起作用. 另外cronjob的格式为: MIN

  • PHP调用Linux命令权限不足问题解决方法

    业务背景:  yourcmd为我的linux程序,它对权限要求非常严格,当用php去执行yourcmd程序 系统:CentOS 6.3 apache是php的执行用户 用exec函数去执行linux系统上的程序/usr/local/yourcmd/sbin/yourcmd php代码如下: 复制代码 代码如下: <?php $conf_file = "/var/www/html/webroot/test.tmp"; $command = "sudo /usr/local

  • Linux下PHP加速器APC的安装与配置笔记

    当前我用的是APC-3.1.9 stable ,可以自己到 http://pecl.php.net/package/APC 下载最新版. 1.安装 复制代码 代码如下: wget http://pecl.php.net/get/APC-3.1.9.tgz tar xzvf APC-3.1.9.tgz cd APC-3.1.9 /usr/local/php/bin/phpize ./configure --enable-apc --enable-apc-mmap --with-php-config

  • php判断linux下程序问题实例

    本文实例讲述了php判断linux下程序问题.分享给大家供大家参考.具体如下: 有时候在服务器上面写一些脚本的时候,经常要放到crontab里面定时运行.时间长了就有一个问题,那就是程序重复运行消耗太多的资源,怎么处理呢?下面璞玉写了两种方法. //第一种:用linux里面的正则匹配 function ifrun($clsname,$bf = 0) { //下面进行检测,如有一个进程正在运行,则不运行 $str=shell_exec("/bin/ps ax > /home/root/&qu

  • 在Linux系统的服务器上隐藏PHP版本号的方法

    通常,大多数默认设置安装的web服务器存在信息泄露,这其中之一就是PHP.PHP 是如今流行的服务端html嵌入式语言(之一?).在如今这个充满挑战的时代,有许多攻击者会尝试发现你服务端的漏洞.因此,我会简单描述如何在Linux服务器中隐藏PHP信息. 默认上expose_php默认是开的.关闭"expose_php"参数可以使php隐藏它的版本信息. [root@centos66 ~]# vi /etc/php.ini 在你的php.ini, 定位到含有expose_php的那行把O

  • Linux下安装PHP MSSQL扩展教程

    PHP天然就对MySQL有良好的支持,但是想要用PHP对SQL Server进行操作,则需要花点时间了.今天刚好团队里的一个项目需要用PHP对SQL Server进行操作,遂帮忙配置好环境. 首先说明下,服务器的系统版本为SUSE Linux Enterprise Server 10 SP3. 1. 安装FreeTDS 地址:FreeTDS 复制代码 代码如下: wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stab

  • php实现Linux服务器木马排查及加固功能

    网站频繁被挂马?做一些改进,基本上能把这个问题解决,因为discuz x等程序存在漏洞,被上传了websehll,每次被删除过段时间又出来了,最终查到所有的木马. 从以下几个方面查找并加强(如果能不开启会员功能,不给任何上传入口,保护好后台密码,加固好PHP,一般就没什么问题了). 1.根据特征码查找: php木马一般含有 复制代码 代码如下: <?php eval($_POST[cmd]);?> 或者 复制代码 代码如下: <?php assert($_POST[cmd]);?>

  • 记一次入侵Linux服务器和删除木马程序的经历

    一.背景 晚上看到有台服务器流量跑的很高,明显和平常不一样,流量达到了800Mbps,第一感觉应该是中木马了,被人当做肉鸡了,在大量发包. 我们的服务器为了最好性能,防火墙(iptables)什么的都没有开启,但是服务器前面有物理防火墙,而且机器都是做的端口映射,也不是常见的端口,按理来说应该是满安全的,可能最近和木马有缘吧,老是让我遇到,也趁这次机会把发现过程记录一下. 二.发现并追踪处理 1.查看流量图发现问题 查看的时候网页非常卡,有的时候甚至没有响应. 2.top动态查看进程 我马上远程

  • linux服务器下PHPCMS v9 安全配置详解

    一.目录权限设置很重要:可以有效防范黑客上传木马文件. 如果通过 chmod 644 * -R 的话,php文件就没有权限访问了. 如果通过chmod 755 * -R 的话,php文件的权限就高了. 所以就需要分开设置目录权限和文件权限: linux 服务器权限:经常要用到的命令: find /path -type f -exec chmod 644 {} \; //设置文件权限为644 find /path -type d -exec chmod 755 {} \; //设置目录权限为755

  • Linux服务器Java进程消失问题解决

    这篇文章主要介绍了Linux服务器Java进程消失问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题描述 在实际生产环境下,如果我们遇见Java进程突然消失,该如何去排查问题? 思路 可能有几种原因: ①.Java应用程序的问题:发生OOM导致进程Crash 最常见的是发生堆内存异常"java.lang.OutOfMemoryError: Java heap space",排查步骤如下: Step1: 查看JVM参数 -XX

  • scp 将数据从一台linux服务器复制到另一台linux服务器

    scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且 scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来.另 外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了.虽然 rsync比scp会快一点,但当小文件众多的情况 下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用.

  • 使用ntpdate工具校正linux服务器时间(实现方法)

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210.72.145.44 以下是一些可用的NTP服务器地址: Name IP Location 210.72.145.44 210.72.145.44 中国(国家授时中心) 133.100.11.8 133.100.11.8 日本(福冈大学) time-a.nist.gov 129.6.15.28 NI

  • 确保Linux服务器安全 防范四种级别攻击

    随着Linux企业应用的不断扩展. 有大量的网络服务器都在使用Linux操作系统.Linux服务器的安全性能受到越来越多的关注. 这里根据Linux服务器受到攻击的深度以级别形式列出,并提出不同的解决方案. 随着Linux企业应用的扩展,有大量的网络服务器使用Linux操作系统.Linux服务器的安全性能受到越来越多的关注,这里根据Linux服务器受到攻击的深度以级别形式列出,并提出不同的解决方案. 对Linux服务器攻击的定义是:攻击是一种旨在妨碍.损害.削弱.破坏Linux服务器安全的未授权

  • Linux 服务器分区及挂载

    Linux 服务器分区及挂载 第一步:创建目录 //创建目录 mkdir /uardata1 mkdir /uardata2 mkdir /uardata3 mkdir /uardata4 mkdir /uardata5 mkdir /uardata6 mkdir /uardata7 mkdir /uardata8 mkdir /uardata9 mkdir /uardata10 第二步: 创建分区 echo 'y'|mkfs.ext4 /dev/sdb & echo 'y'|mkfs.ext4

  • 在linux服务器上安装Jenkins

    Jenkins是用java编写的开源持续集成工具,目前被国内外各公司广泛使用.本章教大家如何在linux服务器上安装Jenkins. 一.获得一台linux服务器 要在linux下安装git,首先你得先有一台linux服务器,作为小白,手头的机器肯定都是windows的,搞个虚拟机安装对我这种小白简直是折磨人:这里使用最简单的方式获得一台linux服务器,就是从阿里云上租一台.镜像选择CentOS7.3 64位. 二.安装jdk Jenkins的运行需要依赖jdk,所以在安装Jenkins之前我

  • 探讨如何减少Linux服务器TIME_WAIT过多的问题

    TIME_WAIT状态的意义: 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?主动关闭的一方在发送最后一个 ack 后就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间,这个是TCP/IP必不可少的,也就是"解决"不了的.也就是TCP/IP设计者本来是这

随机推荐