任意文件上传漏洞
进入后台后发现可以设置允许上传的类型,于是我们添加php
那我们任意找一个上传点进行上传,发现上传失败
使用burp抓包看一下上传时调用了哪个文件,发现调用了system/extend/ueditor/php/controller.php
controller.php
包含了enter.php
继续跟进
enter.php
调用了into::load()
继续跟进
跟进self::load_class
通过注释明白这个函数是加载class类文件,并且看了一圈并没有其他的功能,所以require_once $file;
一定就是加载的上传功能的脚本
通过debug发现$file
文件位于system/extend/ueditor/php/ueditor.class.php
进入ueditor.class.php
调用了__construct()
魔术方法,into::load_json("config.json")
加载了config.json
赋值给config
Debug跟进into::load_json
,发现加载了同级目录下的config.json
读取完json中的内容后回到into.class
使用call_user_func
方法调用了ueditor.class
中的init
方法
init
方法根据传入的参数switch
选择要使用的方法,这里的config[xxx]
就是加载的json文件中的内容
根据前面抓包传递的参数action=uploadimage
,因此调用了是$this->uploadimage()
方法
跟进uploadimage()
发现这一段就是上传成功的代码,尤其以upload::files
为核心,我们跟进他
跟进后发现只要满足in_array($ext,$extension) && (!$type || ($type && !$in))
就会成功
抓包后发现第一个条件满足,但是第二个条件不满足
因此我们把!$type || ($type && !$in)
单独拿出来,也就是只要$type
或者$in
任意一个为空就可以为true
,我们往上看有一个令$type = null
,所以要想办法让if(in_array($k, $tarr))
为真才可以
$ext
是我们上传文件的后缀,$v
是code
中的参数,code
中有php
类型,$k
是code
$tarr
是$type
传来的参数
全局搜索,发现$k
是一个json文件,因此无法修改,因此我们只能让$tarr
为code
,也就是传入的$type
参数中有code
按住ctrl点击files,发现有个地方传入了code
发现文件名叫uploadfile
去json文件搜搜,也就是上传附件会调用这个函数
最终发现在内容管理中可以上传附件,成功上传php文件
任意文件删除漏洞
在文件上传的地方发现还可以对文件进行删除,我们可以尝试一下是否有任意文件删除漏洞
抓个包发现调用了delete
方法
进入函数,通过抓包发现$path
路径其实就是我们要删除的路径,然后通过preg_match
正则表达式判断是否是upload
开头,如果通过则调用dir::delete
删除文件
进入dir::delete
发现并没有对路径进行过滤,self::replace
只是对路径进行了优化
构造如下数据包即可任意文件删除
目录遍历漏洞
找到了一个listfile
的函数,函数本身没有什么功能点,于是去lists
看看
有一个read方法,进去看看
功能是打开这个文件夹,用readdir
方法读取内容并返回
那我们如何控制要读取的路径呢,注意arrExist
方法
global $G
这个全局变量就是存储传入的任何参数,可以自己debug看看,这里就是将get传参的folder
传入$folder
构造payload
/system/extend/ueditor/php/controller.php?action=listfile&folder=../../../
查看一下谁调用了lists
方法,只要调用了lists
方法的函数都可以任意目录读取
例如这个listimage
也可以
任意文件下载
在安全设置 =》 数据备份 =》 备份列表 =》 下载
存在任意文件下载
通过路由分析定位到位于system/admin/safe/backup.class.php
的download
方法
通过debug发现似乎对id
参数没有做任何的过滤
测试下载1.txt
权限校验处存在逻辑缺陷导致未登录即可调用后台功能
在ueditor
中包含了admin
如果$func
没有设置,那么就把他设置为init
之后load_Class
调用了admin.class
的init
方法
初始化时获取session
,如果没获取到那么就跳转,但是没有加die
或者exit
导致代码还在继续执行
因此我们只要保存一次后台的数据包,就算没有登录,发送数据包也照样能执行操作,这里抓一个能添加上传类型的数据包,把cookie删除模拟未登录状态
照样添加成功,可以配合上传webshell