Hisiphp2.0.11的文件上传
侵权声明
本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。
如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [[email protected]]。我们将在确认后的合理时间内采取适当措施,包括删除相关内容。
感谢您的理解与支持
漏洞原因:
以下两句代码将输入进来的压缩包直接解压,当压缩包中存在一个木马或是其他危险文件时就可以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
免责声明
本博客所提供的技术知识和信息仅旨在教育和分享网络安全最佳实践,促进网络安全意识的提升。作者严禁将这些技术和信息用于任何非法或不道德的目的。
使用本博客内容而导致的任何违法行为或后果,作者不承担任何法律责任。所有读者在使用本博客的信息时,应自行承担风险,并确保遵守当地法律法规。
我们鼓励所有读者合法地使用所提供的信息和技术,致力于维护安全和负责任的网络环境。
感谢您的理解与支持。