侵权声明
本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。
感谢您的理解与支持
靶场安装地址:/index.php/index.html(因为我找了好久才找到)
漏洞原因:
以下两句代码将输入进来的压缩包直接解压,当压缩包中存在一个木马或是其他危险文件时就可以getshell
$archive = new PclZip();
$archive->PclZip($file);
漏洞的位置
漏洞地址:/admin.php/system/plugins/import.html
漏洞代码路径:hisiphp/application/system/admin/Plugins.php
起始一个判断是否为post请求的语句
代码块一:
判断是否上传了文件
代码块二:
获取上传文件的绝对路径,如果是根目录的情况,以便在不同的目录结构下,正确地处理文件路径。
代码块三:
判断文件是否存在以达到判断文件是否有效
代码块四:
对文件相对路径并去掉后缀的文件判断其是否为目录,目的是如果该目录已经存在了就不会给目录赋权,否则就是文件因该赋权给他。
代码块五:
将传入的文件解压,事先通过上传点就知道该文件是压缩包。给代码块也是漏洞所在。
该代码块下面的if语句是判断压缩包解压是否成功,参数一制定解压路径,参数二路径,参数三指示在解压缩时,如果目标文件比压缩包中的文件更新,则替换目标文件。如果解压失败就会删除文件。
代码块六:
如果执行完该条语句会报错,因为不存在该目录,除非手动创建。
文件名、哈希值的生成,数据的返回
文件名的生成:
使用md5的哈希算法生成的哈希值
哈希算法跟进,可以看到是通过filename生成的哈希值,通过debug可以看到是finename的值是上传文件的临时文件名(如有不对请指出)
最后保存的文件名和位置为将生成的哈希值,前两位分割为一个目录名里面保存上传的文件,后面的所有作为文件名最后再拼接后缀。
$savename = substr($hash, 0, 2) . DIRECTORY_SEPARATOR . substr($hash, 2);
效果如下
返回包中的hash值
也是和生成文件名的hash方法一样,只不过使用方法的默认hash算法sha1并且filename为文件上传后的绝对路径。通过debug可知。
文件保存位置的返回
将返回包中的内容全部打包到data数组中返回的后续还有一些返回包的构造。
漏洞复现
1、找到插件上传位置
系统 -> 本地插件 -> 导入插件
2、打包一句话或其他利用文件
3、上传文件并点击开始导入
4、打开bp查看文件上传的位置,其他方式也行。
5、访问文件
总结
又是一个危险函数PclZip()还学会了文件名生成的机制
感谢这位大佬的帖子,学到了很多。
https://blog.csdn.net/qq_18193739/article/details/132765176
原文始发于微信公众号(菜鸟小新):Hisiphp2.0.11的文件上传
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论