ThinkAdmin CVE-2020-25540 漏洞复现及Poc编写分析记录
关于ThinkAdmin CVE-2020-25540漏洞复现的说明
一、漏洞名称
ThinkAdmin 目录遍历/文件读取漏洞
二、漏洞编号
CVE-2020-25540
三、影响版本
Thinkadmin ≤ 2020.08.03.01
四、漏洞简介
ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统。
ThinkAdmin 6版本存在路径遍历漏洞。攻击者可利用该漏洞通过GET请求编码参数任意读取远程服务器上的文件。
五、复现过程
将ThinkAdmin的漏洞版本Git到本地,这是网友fork出来的,链接地址https://github.com/179776823/ThinkAdmin
git到本地后进入ThinkAdmin文件夹,使用composer install开始安装,如果没有composer就装一个,debian系一般是sudo apt-get install composer
这里遇到个小坑,如果你用的是CentOS或者debian或者Ubuntu Server,那可能会遇到/vendor/services.php报错的问题,大概率是权限的问题,省事直接给755然后再次composer install即可安装完成
安装完成后找到ThinkAdmin目录下的admin_v6.sql文件,把这个文件导入数据库,当然这里建议使用MySQL,命令是mysql -uroot -p admin_v6(数据库名)< admin_v6.sql;
导入完成后编辑config/database.php,把用户名和密码更改为自己的,注意权限问题,直接用root也可以。
配置完成即可启动,在ThinkAdmin目录下php think run即可看到启动日志,默认端口8000

随后访问8000端口看到如图页面则表示启动成功,接下来是漏洞利用

直接访问/public/admin.html?s=admin/api.Update/node这个url则会返回获取文件列表的json数据,而且不需要权限,不需要登录

然后我们使用hackbarpost一段数据过去,rules=["/"],rules字段值即为你要遍历的目录,但是这个漏洞个人感觉十分的鸡肋,它的遍历范围是有限的并且返回的内容也很乱

比如读取根目录,它返回的是网站根目录也就是ThinkAdmin下的所有内容,发送../../../虽然提示获取成功但是没有值返回
文件读取漏洞更实用一些,这个漏洞和目录遍历的原理是一样的,只是触发的入口函数不一样,触发的uri是public/admin.html?s=admin/api.Update/get/encode/xxxx,xxxx是读取目录名经过编码过后的字符串
不过ThinkAdmin对可读取的目录做了限制,但是可以绕过这个限制,首先可读的目录为
config
public/static
app/admin
app/wechat
可读文件为:
public/router.php
public/index.php
还有就是database.php不能读,也不能绕过
其他可以从比如public/static目录进行绕过,例如它限制只能读public/static下的内容,但是我们可以指定puclic/static/../../来获取其他目录内容从而绕过限制,这也算是非常简单的了,唯一有点难度的是它的加密方式,可以通过其调用的函数逐步分析
ThinkAdmin用一个加密函数将目录名加密发送到后端再解密从而返回,这个可以通过阅读源码得知,根据其加密逻辑,可以用其他语言实现或者直接复制这段函数代码传一个参数进去获得返回值。
提供Poc,Python写的
https://github.com/ChaoYangDongYongGuaiGe/CVE-2020-25540
浙公网安备 33010602011771号