YxtCMF后台的注入和getshell分析

2020-03-08 15:13:56 浏览数 (1)

文章源自【字节脉搏社区】-字节脉搏实验室

作者-sher10ck

目录结构

说明: 这摊源码是基于thinkphp3.2.3开发的,然后有几个重要的目录记录一下:

index.php

首先会判断是否开启了 magic_quotes_gpc 函数

若开启了的话,则会对GET、POST接受的参数进行 stripslashesRecursive(实质上就是stripslashes) 转义:

判断是否已经安装了,若没有安装进行安装:

最后引用了一个文件,还不知道是干嘛用的:

前台登录处的一个注入

这个注入点主要是由于thinkphp框架漏洞所导致的一个注入点,又学到了

这里进行抓包:

登陆成功

把payload直接放出来:

报错注入将数据库爆出来了

我们分析一下这个漏洞形成的原因。

首先我们请求的url:

然后我们就找application/user下面的controller:

当然有的时候我们可能无法根据名称来辨别是否是我们需要找的脚本,我的方法就是在这个application/user/controller目录下面用关键词来查找了

可以挨个看一下里面的内容,最终我找到了LoginController.class.php:

首先验证了验证码是否正确,然后初始化了一个Users模块,最后检测是用手机号登录还是用邮箱登录:

我们跟踪mobile函数,这里两个登录的方式都有注入:

里面其他的代码都不用看,注意上面的代码有个where函数,而:

这是thinkphp的一个框架漏洞,我们先来看一下where函数的功能和用法:

也就是说,where里面包含的内容就是我们要查找的where后面的语句,那么我们这里是不是只要直接写入语句进去就行啦~

但是你要观察到我们这里where里面的$where变量是数组的形式,而并非字符串形式。

这里我们看下exp表达式,看了你就懂啦:

也就是说,array的第一个值为exp,第二个值为我们要执行的sql语句,就可以绕过利用了,所以我们的exp就是:

分析好了exp之后,我们来看下I函数(/yxtedu/Core/Mode/Api/finctions.php)中的过滤,官方是这样解释的:

意思就是说,我们过滤的主要方法是array_walk_recursive(data,filter),data代表我们要过滤的内容,fileter代表我们要过滤的方法

I函数中的array_walk_recursive(),采用的是think_filter,跟踪这个函数:

这里要是匹配到了以上的函数,值就会为空了,所以说没有I函数的where是存在注入点的。

后台的一个注入

我们知道这套cms有上面的一个漏洞之后,通过关键词搜索可以跟踪到更多的注入点:

就直接跟进这个39行的代码,来到了application/admin/controller/adcontroller.class.php

这里通过I函数获取id值,但是没有选择过滤的方法,所以默认应该是没有过滤函数的,id直接拼凑到语句当中了

但是我这里还是不知道这个函数用在哪个功能里,最后我通过搜索ad_id找到了

我们访问这个页面

函数命名为edit,肯定就是编辑了

然后发现是个伪静态

这样我们在后面添加语句试试:

and 1=1 正确 and 1=2 就报错了

GETSHELL

这里是设置路由这里的问题,RouteController.class.php:

跟进这个sp_get_routes函数,我这里贴出关键的代码:

这里我们通过上面的代码可以看出,过滤的函数就是三个:

跟踪这三个函数,没什么作用,等于将我们的route直接写入到route.php中。 route.php:

后台添加url规则,填写:

然后访问:

我们打开route.php,代码已经写入进去了

审计就到这里啦

推荐阅读

Thinkphp中的where函数

ThinkPHP框架架构上存在SQL注入

ThinkPHP函数详解:I方法

PHP代码审计入门篇二 ——MVC结构审计

0 人点赞