专栏首页信安之路一处反序列化任意文件写入的漏洞分析

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

本文作者: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 成功被写入。

本文分享自微信公众号 - 信安之路(xazlsec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Bootstrap Table 后端分页

    之前一直用的前端分页,在数据不是太多的情况下,前端分页还是很方便的,也可以使用自带的搜索等功能,如果数据量比较多的情况就要使用后端分页。

    tianyawhl
  • 不知道如何实现服务的动态发现?快来看看 Dubbo 是如何做到的

    上篇文章如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他大致了解了注册中心作用以及 Dubbo Registry 模块源码,这篇文章将深入 Dub...

    andyxh
  • 09.Django基础七之Ajax

        AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascrip...

    changxin7
  • [视频教程] 配置mysql用户的权限并查询数据

    MySQL安装后,需要允许外部IP访问数据库。修改加密配置与增加新用户,配置用户权限 修改配置文件,增加默认加密方式的配置项。

    陶士涵
  • SAP UI5 Hash session 2016-07-18

    Created by Wang, Jerry, last modified on Jul 19, 2016

    Jerry Wang
  • [PHP] 安装PHP报错“Primary script unknown”的解决方法

    当安装完最新版的nginx和最新版的PHP以后,使用niginx默认配置文件中的PHP配置会有错误 访问指定目录下的php文件时,显示File not foun...

    陶士涵
  • day66-Django进阶-Django路由系统介绍

    c.在模板中,注意:name 可以在任意的模板中被使用,这个 HTML 文件是随便搞得一个!!

    天下第六
  • 腾讯云服务器搭建网站教程【PHP+MYSQL环境】

    到目前为止本人做网站已经有半年了,对服务器配置略有了解。目前基本掌握了在cent os和windows server 2008/2012系统下搭建PHP+MYS...

    用户5921043
  • 集成环境phpstudy后门利用复现

    phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安...

    7089bAt@PowerLi
  • 详细渗透测试的网站内容分析

    上一节讲到渗透测试中的代码审计讲解,对整个代码的函数分析以及危险语句的避让操作,近期很多客户找我们Sine安全想要了解如何获取到网站的具体信息,以及我们整个渗透...

    网站安全专家

扫码关注云+社区

领取腾讯云代金券