这你敢信,复习PHP意外搞出一个免杀WebShell

2026-05-08 1 阅读 蚁景网安实验室
前言 正当我饶有性质的开始复习 PHP 开发这个课程准备一天速通期末考试的时候,没想到有心栽花花不开,无心插柳柳成因,意外灵感突发,搞出了一个还算可以的免杀的 webshell,下面讲讲思路 起 当打开 php 复习考点的时候,发现还要考魔术方法,于是打开了好久没有翻过的 php 手册 魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作。 我们看了大多数魔术方法,都有自己会在某个契机出发 比如一些常规的 __construct(mixed ...$values = ""): void PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。 会在实例化一个类的时候触发这个方法 __destruct(): void PHP 有析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。 会在对象销毁的时候执行这个方法 于是我们可以利用这个思路来实现一个命令条件执行的方法 比如看下面的例子 prop = $val ; } public function __debugInfo () { return [ 'propSquared' => $this -> prop ** 2 , ]; } } var_dump ( new C ( 42 )); ?> 我们按着改造一下 读懂了原理后我们尝试看看能不能执行命令 prop = $val ; } public function __debugInfo () { return [ 'propSquared' => $this -> prop ** 2 , ]; system ( "calc" ); } } var_dump ( new C ( 42 )); ?> 但是并没有计算器弹出来,原来忘了 php 一个最基础的语法,return 后代码就不会执行了 但是尝试了还是不行,最后问 GPT 写了个例子看看环境是不是有问题 username = $username ; $this -> password = $password ; } public function __debugInfo () { return [ 'username' => $this -> username , 'info' => '这是调试时返回的信息' , 'timestamp' => time () ]; } } $user = new User ( 'alice' , 'secret123' ); var_dump ( $user ); // 触发 __debugInfo() 输出应该是 object ( User ) #1 (3) { [ "username" ] => string ( 5 ) "alice" [ "info" ] => string ( 33 ) "这是调试时返回的信息" [ "timestamp" ] => int ( 172509