前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一处反序列化任意文件写入的漏洞分析

一处反序列化任意文件写入的漏洞分析

作者头像
信安之路
发布2019-10-24 19:16:39
1K0
发布2019-10-24 19:16:39
举报
文章被收录于专栏:信安之路信安之路

本文作者:Z1NG(信安之路 2019 年度优秀作者)

近日在审计某 CMS 时,发现一处反序列化任意写入文件的操作。其中的场景蛮有意思的,将其简化抽取出来做个 CTF 的题目丢给学弟(比较简单),在此做个记录。

反序列化漏洞点的寻找

按照套路,全局搜索 __destruct(),在看过若干文件之后,可以发现 cache.php 中有 save 的操作,猜测是某种保存文件或者数据的操作,继续跟进。

跟进 save 函数。如下代码显然是进行一个文件保存的操作,而开发者意识到了可以写 PHP 文件存在一定风险,于是加了 <?php exit(); ?> 来终止写入的 PHP 文件执行。

至此,我们找到了一个可以写入任意文件的地方。尽管文件名可控,文件内容会被序列化只能算部分可控,就算写入 PHP 文件也无法执行,似乎无法深入的利用。

漏洞分析

心里总觉得有一股奇妙的感觉,可以拿下这处漏洞点。为了更好的分析这个点,我将代码抽取出来。删除掉无关的变量和函数,代码大概如下所示。

代码简化后,很清晰的可以看出,其实最大的问题是如何绕过 <?php exit(); ?> 死亡退出问题。打过 CTF 的同学应该多少都遇到过这道问题,没想到今天让我在实战中碰到了。

这个问题其实很好解决,寻找一种方法将 <?php exit(); ?> 变得不可执行,比如变成乱码。而 base64 在解码的时候,是将密文以 8 个为一组进行解密,简单理解也就是每 8 个字符进行一次解密,并且每 8 个字符解密相互独立,前面的解密并不会影响到之后的解密过程。又由于 base64 的编码是只有字母和数字的,<?()空格;> 这些都不会参与解密自动忽略。所以 <?php exit(); ?> 中只有 phpexit 7 个字符。于是乎,可以人为的添补上一个字符使他能够解密,例如 phpexita,显然如此解密出来是个乱码。

分析到此,先按照套路尝试一遍。POC 如下:

首先,先拼接出一个使用伪协议通过 base64 解码写入的文件名,拼接之后是这样的一个串

php://filter/write=convert.base64-decode/resource=shell.php。

然后,<?php @eval($_POST['zhhhy']); ?> 将 shell 进行 base64 编码,得到一个串

PD9waHAgQGV2YWwoJF9QT1NUWyd6aGhoeSddKTsgPz4=

最后,为了将 <?php exit(); ?> 解码后成为乱码,我们手工加上一个 a,于是我们 base64 的串为

aPD9waHAgQGV2YWwoJF9QT1NUWyd6aGhoeSddKTsgPz4=。

将序列化的值传入,看看效果。

确实生成了一个 shell.php 文件,也确实将 <?php exit(); ?> 变为乱码了,可是连注入的 shell 的内容也变为乱码了,这并不是我们预期的结果。再回头看看代码,似乎遗忘了一个地方。$content = serialize($content); 会将我们输入的串进行序列化!!!

将拼接之后的内容打印出来看看,该如何解决这个问题。

由于序列化使得我们构造的串变了,不难看出多了 s:45,使得 base64 解码发生错误。那这个问题就和上述一样啦,只要继续填充足够的 a 就可以解决这个问题。因为特殊符号不算,所以我们需要填充 6 个 a 。

修改 POC,并将 POC 发送

查看一下 shell.php 的内容,可以看到 shell 成功被写入。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反序列化漏洞点的寻找
  • 漏洞分析
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档