spl_autoload_register文件上传

  1. 前提
  2. 一、分析题目
  3. 二、解题思路
  4. 三、payload
    1. 1、知识点
    2. 2、利用过程

前提

2022年强网杯的rcefile题目,题目打开网页是一个文件上传题目。但是题目给出了源码,肯定结合源码进行操作,但是在阅读源码时,忽略了一个最重要的代码spl_autoload_register函数。

一、分析题目

扫目录发现备份文件www.zip,备份文件存在四个文件:index.php、upload.php、config.ini.php、showfile.php

  • 上传文件存在黑名单:”php”, “php5”, “php3”, “html”, “swf”, “htm”,”phtml”
  • 上传的文件名经过md5的时间加密后进行重命名, 然后再移动上传文件的位置至根目录下
  • 程序会将文件名保存到到userfile数组里面,然后讲userfile数组经过序列化以后设置成cookie,
  • config.ini.php文件中存在spl_autoload_register()函数,而且这里会将收到的cookie又反序列化保存到userfile当中
  • showfile.php会for然后for循环遍历数组以此展示上传的文件名(类型是字符串)

二、解题思路

  1. 首先程序没有限制大小写,可以尝试使用大小写进行绕过,失败

  2. 由于题目对文件进行了重命名,那么就无法使用配置文件,也无法使用解析漏洞进行绕过

  3. 又由于题目是先重命名以后再移动文件的,那么就无法使用条件竞争来进行绕过了

  4. 尝试使用修改cookie老修改文件名,失败。因为showfile展示的文件名是字符串形式的,并不能执行

  5. 又尝试使用文件读取来做,发现题目是直接以路径的形式直接展示的

    ======》上面的结论是:无法使用常规的文件上传来解析php代码

  6. 最终的实现方式是利用spl_autoload_register函数:在不指定处理用的函数,就会自动包含“类名.php”或者是“类名.inc”的文件,并加载其中的“类名”类

三、payload

1、知识点

(1)spl_autoload_register()函数

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

  • spl_autoload():本函数提供了_autoload()的一个默认实现,如果不使用任何参数调用 spl_autoload_register() 函数,则以后在进行 __autoload() 调用时会自动使用此函数。
  • __autoload()函数:尝试加载未定义的类,但是PHP7.2.0起被废弃,PHP8以后被移除
spl_autoload(string $class_name, string $file_extensions = ?): void
  • file_extentsions:在默认情况下,本函数先将类名转换成小写,再在小写的类名后面加上.inc或者是php的拓展名作为文件名,然后在所以的包含路径(include paths)中检查是否存在文件

2、利用过程

(1)上传webshell,文件名是“文件名.inc”。此时程序会生成md5生成一个新的文件名xxx.inc。

(2)将重命名后的名字xxx进行发序列化以后,以此来作为修改cookie值


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮箱至 1627319559@qq.com

×

喜欢就点赞,疼爱就打赏