挖洞经验 | 记一次曲折的Getshell过程

最近在挖某框架的漏洞,其中挖到一枚Getshell,挖的过程有点曲折感觉可以写篇文章总结一下,方便与各位大牛交流交流。

因为此框架有大量用户,并且此漏洞并未修复,故此隐去所有有关此框架的信息,连文章中出现的代码都是我自己另写的,重在思路,希望大家理解。

首先通过审计定位到可能导致漏洞的代码(路径:/edit/creat.php):

其中 $GP 是合并 $GET 和 $_POST 的变量。

可以看到写入的文件路径和写入的部分内容都是可控的,看到这里不禁露出了一丝笑容,没想到一枚 getshell 如此轻松。

好吧,先测试一下,把$file的值设置为:

<?php echo 1111; ?>.php

post 到 /index.php? control=edit&action=creat

(此框架是单入口)

预计生成的文件内容是:

好了,那访问一下生成的文件,URL:

右键查看一下源码,发现输出的内容是:

居然被过滤了? 回溯之前的代码,在 index.php 文件中发现代码:

关键在开始的两行代码上,htmlEncode ? 搜索这个函数,找到这个函数的代码如下:

结合起来,就是对 post 和 get 获取到的所有内容进行htmlspecialchars,所以才会出现上面所看到的尖括号被过滤的情况。

看到这里,脸上的笑容都消失了,哎呀,果然没那么容易。尖括号过滤了,那就没办法写入PHP 代码的解析标签了,想不到什么突破的办法,难道就这样放弃么?开始犯愁…

一直想着:过滤了尖括号怎么办?过滤了尖括号怎么办?过滤了尖括号怎么办……

那我能不能不用尖括号呢?不用尖括号能不能解析?要怎么才能解析?想到这里,突然就想到模板!这个框架的模板和大多数 MVC 的模板一样,使用大括号作为标记:

这样就可以使用模板的标记 {} 来绕过尖括号 <> 的过滤,但是根据这个框架的路由协定,模板不能随便被包含,所以只能覆盖原有的模板。

按照这个思路,找一个有加载模板的功能,覆盖加载的模板,覆盖之后访问了就可以解析了。按照这个思路,找到一个加载了模板的功能,URL是:

/index.php? control=basic&action=index

代码路径在/basic/index.php,代码最后就有调用 view(‘index’);

加载的模板路径在:

/themes/basic/index.html

按照这些信息,应该构造 $file 的值为:

../../themes/basic/index.html

但是这样又有一个问题了,虽然构造这样的值可以覆盖原有的模板文件,但是写入的文件内容就是:

这样的话就没有写入需要的 Webshell 了,怎么办呢?!

根据 URL 的特性,./1.php 和 ./test/../1.php 访问的内容是一样的,都是 1.php 这个文件,但是 test 这个目录名我是可以随便写的,再根据模板伪代码的格式构造一个控制 $file 的测试 POC:

(根据 view() 函数的代码,有一个{php }伪代码标签,处理的时候会替换为 <?php >。其实就算是没有这标签也可以用其他非组合的标签代替)

生成的文件内容为:

访问 URL:

/index.php? control=basic&action=index

右键查看源码,输出的内容为:

证明代码执行了,那构造一个包含一句话的 POC,按照上一个 POC 的思路,应该把 file 的值构造为:

但是访问后发现输出的内容为:

想起 $file 的值是通过框架封装的 $GP 的值都经过了 htmlencode,怎么办呢?! 根据 PHP 的特性,$_POST[‘w’] 获取值的时候可以把引号去掉,所以可以把 poc 改为:

访问 URL:/index.php? control=basic&action=index ,给参数 w传值 echo 1111;

右键查看源码,内容为:

证明 post 的代码确实被执行了,到服务器上执行:

至此,getshell 完成,虽然过程有点艰辛,但还是拿下了。

最后总结一下:

1. 刚开始遇到过滤尖括号等的 HTML 字符的时候,利用了 MVC 模板中的伪代码代替绕过了 2. 遇到覆盖文件时候填写完整路径不能写入payload 的问题,使用了构造一个不存在的目录(目录的名称就是 payload)的方法进行 payload 的写入 3. 最后写入 payload 的时候发现也过滤了引号导致不能写入 $POST[‘w’] ,根据 PHP 的特性,去掉引号依然可以获取 w 下标的内容,所以替换为 $POST[w] 4. 写入最终构造好的 payload,Getshell 完成!

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-08-25

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(三):前端首页搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

90610
来自专栏疯狂的小程序

微信小程序开发探索之路

项目起始时间:2017-11-25 前端人数: 3 页面数: 6 一期上线时间:2018-01-16 在我们开发的过程中,小程序的生态也不断变化。例如 最开始不...

27170
来自专栏魏艾斯博客www.vpsss.net

WordPress 后台编辑主题无“更新文件”按钮的解决办法

14420
来自专栏从零开始学自动化测试

selenium+python自动化78-autoit参数化与批量上传

前言 前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片。 这样每次调用的时候,在命令行里面加...

38530
来自专栏建站达人秀

如何搭建 OpenLiteSpeed 面板

OpenLiteSpeed 是 LiteSpeed Technologies 开发的开源HTTP服务器。OpenLiteSpeed 具有高性能和轻量级的特点,并...

54310
来自专栏网络

那些年,我们用过的fiddler

在测试中,不管是做手工测试,还是接口测试,我们都需要查看后端返回的数据。有的时候,我们也需要调试,或者mock一下后端的返回,来验证前端是否达到预期。 为了捕获...

195100
来自专栏web前端

smartClient 1--框架介绍

    快速构建 大型企业应用开发(无需过多关注UI),适合基于云技术的应用,主要关注业务的发展和营销,加快开发进程

12000
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

Windows平台搭建React Native开发环境

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

30440
来自专栏Crossin的编程教室

Python 与 Excel 不得不说的事

数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道。 ...

37460
来自专栏向治洪

在Mac上搭建React Native开发环境

概述 前面我们介绍过在window环境下开发React Native项目,今天说说怎么在mac上搭建一个RN的开发环境。 配置mac开发环境 基本环境安装 1....

23280

扫码关注云+社区

领取腾讯云代金券