Heim Backend-Entwicklung PHP-Tutorial php实现Linux服务器木马排查及加固功能_php技巧

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

May 16, 2016 pm 08:27 PM
linux服务器 php

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

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

1.根据特征码查找:

php木马一般含有

复制代码 代码如下:



或者
复制代码 代码如下:

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

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

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

scandir.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"
"
    . " "
    . " "
    . "
"
   ."";
   exit;
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
   $code=file_get_contents($_GET['readfile']);
   echo"";
   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 "保存成功!点击返回";
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 "新增文件:".$file.""." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." 源码删除
";
    }else{
     if($log[$file] != $md5){
     echo "修改文件:".$file.""." 创建时间:".date("Y-m-d H:i:s",filectime($file))." 修改时间:".date("Y-m-d H:i:s",filemtime($file))." 源码
";
 
     unset($log[$file]);
     }else{
     unset($log[$file]);
     }
    }
    }
   }
   if(count($log)>0){
    foreach($log as $file => $md5){
    echo "删除文件:".$file."
";
    }
   }
    }
}
}
}
 
//计算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 "可疑文件:{$filename}"." 创建时间:".date("Y-m-d H:i:s",filectime($filename))." 修改时间:".date("Y-m-d H:i:s",filemtime($filename))." 查看代码 删除
";
   $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 "\r\n";
exit();
}
function Delete()//删除文件
{ global $filename,$pass;
if(emptyempty($_POST['passchack'])){
    echo"
"
   . " "
   . " "
   . "
"
    ."";
    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;
}
?>
[查看文件改动]|[保存当前文件指纹]|[扫描可疑文件]

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

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;
}

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

See all articles