首页 » SEO优化 » phpziparchive解压技巧_文件解压激发的getshell

phpziparchive解压技巧_文件解压激发的getshell

访客 2024-12-04 0

扫一扫用手机浏览

文章目录 [+]

声明!

本文仅供学习和研究,由于传播、利用此文所供应的信息而造成的任何直接或者间接的后果及丢失,均由利用者本人卖力,海青实验室及文章作者不承担当何任务。

phpziparchive解压技巧_文件解压激发的getshell

安全狗海青实验室拥有此文章的修正和解释权,如欲转载或传播,必须担保此文的完全性,包括版权声明在内的全部内容,未经海青实验室赞许,不得任意修正或者增减此文章内容,不得以任何办法将其用于商业目的。

phpziparchive解压技巧_文件解压激发的getshell
(图片来自网络侵删)

攻击者可以快速的从文件上传功能点得到一个网站做事器的权限,以是一贯是红蓝对抗中的“兵家必争之地“。
而随着对抗不断升级,开拓职员的安全意识的不断提高,多多少少也学会了利用黑名单或者白名单等一些手段进行防御,但刁钻的攻击者,依然创造了轻忽之处。
本文以两个实例,大略先容文件解压功能导致的getshell问题。

PHPOK CMS后台任意文件上传

首先,准备一个包含了一个PHP文件的zip文件,然后在导入模块中将zip文件上传。

在考试测验的时候创造,导入模块失落败了,但是查看文件夹内容,可以创造文件已经成功被写入了。

流程剖析

接下来我们从代码层面来看看全体流程是若何的。

当我们点击导入模块时,浏览器会发送两条要求。
先看第一条POST要求。
根据PHPOK CMS路由分发的规则,可以定位到upload掌握器中的zip方法。

而在43行处,引入了libsupload.php文件并且调用zipfile()函数。

在第135行处,设定了文件后缀类型为zip,由于137行处的if条件不成立,流程进入140行,调用_save()方法。
连续跟进_save()方法。

_save()方法在276行处利用file_ext()方法对传入的name参数也便是文件名进行后缀判断,而如果判断通过,则会在之后将压缩文件保存下来。
跟进一下file_ext()方法。

在该方法中设置了一个白名单,文件名只能是jpg,gif,png,zip中的个中一种。
为什么包含zip呢?不管是程序实行到第186或者189行处,在前面就已经给这两个变量设置值为zip了,以是在白名单中自然包含了zip。
目前到此为止,全体上传流程没有什么问题,并且利用了白名单来限定后缀,以是只能上传zip压缩文件。

接着再来看第二处要求:

admin.php?c=module&f=import&zipfile=_cache%2Fa9414ae41044fc5a.zip&_=1570603538199

同样根据路由规则,可以定位到module掌握器下的import方法

程序会接管到zipfile参数,是刚刚压缩包保存在缓存文件夹里的文件名。
在第705行处判断了是不是存在这个压缩包,如果存在则在708行处进行解压。
个中引入了libs/phpzip.php中的unzip函数进行解压。
跟进unzip函数,程序实例化了ZipArchive类进行解压,而目标路径$to则是缓存文件夹。

到此不丢脸出问题,程序将压缩包中的文件解压出来之后,并未进一步的进行判断,以至于里面包含的 PHP文件可以绕过上传文件的限定,使得原来建立的安全防御土崩瓦解。

ZZZCMS 后台解压文件导致任意文件上传

依照上文漏洞发掘办法,同样的在zzzcms的后台中找到了同样的问题。
在项目中搜索关键字unzip。
就可以找到解压功能的所在点,从而进行仔细的剖析。

流程剖析

定位到解压功能的所在之处,详细代码如下。

由于关注点在于解压功能,因此其他的case情形不去过多穷究,只须要剖析unzip处是否有问题即可。
可以看到unzip的功能写在了up_data()函数之中,和上文所写到的一样,在解压完毕之后并未对解压出来的文件进行检测,因此不难考虑到压缩包里隐蔽一个PHP文件的方法。

在784-785行处,分别定义理解压文件的保存路径(/runtime/updata/)和压缩包文件的存放路径(/runtime/zip/)。
在第801行处,利用getfiles()函数来获取指定文件夹下的文件,也便是获取/runtime/zip/下的所有zip文件。
然后在第803行处判断是否存在zip文件,如果存在则将压缩包里的文件解压出来。

剖析至此,自然而然的可以想到如果能在/runtime/zip/中放置一个包含了PHP文件的压缩包,就可以在网站中植入webshell。
因此,须要找到一个上传点,这个上传点的要许可上传zip文件,并且可以将上传文件保存到任意目录下。
在全体项目里查找,找到了一个up_load()函数知足需求,详细代码如下所示:

在第651-652行,定义了文件上传的类型和保存的路径,然后在660行处调用upload函数来进行上传的详细操作。
跟进upload查看。

在upload函数之中,由于传入的$type值为zip,因此程序流程进入到709行处,于是zip就成为许可上传的文件类型。
在718行处会对文件后缀进行比拟,如果后缀名在黑名单之中,则许可上传。
在第725行处调用handle_upload()函数将上传文件保存下来,连续跟进该函数。

根据配置文件的设置值datefolder默认为0,当该值为0则不会再多一层以韶光戳命名的文件夹,把稳$folder是可控的,并且没有过滤跳转符号../就在750行处直接拼接布局了路径。
紧接着covermark值默认为1,如果该文件路径已经存在则删掉原有的路径,目的是为了覆盖写入。
$newname是新的文件名,由于$format的值为NULL,以是新文件名的格式因此韶光戳+随机数的办法命名的。
也正是由于如此,新的文件名变得不可预测,以是无法直接上传一个webshell。
而在解压功能中,新的文件名被保存成什么并不主要。

全体利用链已经十分清晰了,通过上传功能上传一个包含PHP文件的压缩包路径穿越保存到/runtime/zip/文件夹下,然后再触发解压功能,即可将webshell植入。

在save.php中,当$act为upload时,调用上传文件的功能,为updata时调用解压功能。
由于并没有找到相应的前端页面,而且提交表单并没有检讨refere值和设置csrf_token,因此可以自己编写一个上传页面,内容如下:

以GET办法设置好文件类型和保存路径,然后将zip文件上传即可。

当文件上传成功,可以看到文件成功被保存在了/runtime/zip/文件夹之下。
接着触发解析功能。

可以创造文件已经被成功解压,并且保存在了/runtime/updata/文件夹之中。
访问效果如下:

总结

从上述两则实例来看,压缩包里包含着webshell颇有些特洛伊木马的味道。
当程序对上传后缀限定的相称严格,例如上文提到的PHPOK CMS,已经利用白名单的机制只能上传四种后缀的文件,却依然由于对压缩文件的处理不当,导致全体防御机制的失落效。
在ZZZCMS中的实例,预测开拓者的本意是zip文件夹内的内容该当别可控的,但在目录穿越的加持下,超出了开拓者的预期从而防御机制土崩瓦解。

那么如何防御呢?建议开拓者在实现文件解压功能时考虑以下要点:

1)限定文件的扩展名(如采取白名单的办法);

2)限定文件的名称(以较为严谨的黑名单约束文件名);

3)限定文件的大小(以免遭受压缩包炸弹的DDoS攻击)。

因此,在开拓的各个环节,都要将安全意识贯彻个中。
千里之堤毁于蚁穴,也正是这种细微之处的小问题,才使得攻击者有机可乘。

原文链接:https://www.anquanke.com/post/id/192919

欢迎登录安全客 - 有思想的安全新媒体www.anquanke.com/ 加入互换群814450983 获取更多最新资讯

标签:

相关文章

我国土地利用分类代码的构建与应用

土地利用分类代码是我国土地管理的重要组成部分,是土地资源调查、规划、利用和保护的依据。土地利用分类代码的构建与应用显得尤为重要。本...

SEO优化 2025-02-18 阅读1 评论0

微信跳转微信支付便捷支付体验的秘密武器

移动支付已成为人们日常生活中不可或缺的一部分。作为我国领先的社交平台,微信支付凭借其便捷、安全的支付方式,深受广大用户的喜爱。而微...

SEO优化 2025-02-18 阅读1 评论0

探寻会计科目代码背后的奥秘分类与

会计科目代码是会计信息系统中不可或缺的组成部分,它将企业的经济活动进行分类和归纳,为会计核算、财务分析和决策提供重要依据。本文将从...

SEO优化 2025-02-18 阅读1 评论0