前提
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循环遍历数组以此展示上传的文件名(类型是字符串)
二、解题思路
首先程序没有限制大小写,可以尝试使用大小写进行绕过,失败
由于题目对文件进行了重命名,那么就无法使用配置文件,也无法使用解析漏洞进行绕过
又由于题目是先重命名以后再移动文件的,那么就无法使用条件竞争来进行绕过了
尝试使用修改cookie老修改文件名,失败。因为showfile展示的文件名是字符串形式的,并不能执行
又尝试使用文件读取来做,发现题目是直接以路径的形式直接展示的
======》上面的结论是:无法使用常规的文件上传来解析php代码
最终的实现方式是利用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