审计两个版本 v2021.0521152900 和v2021.0528154955,7月2号爆出的v2021.0521152900存在任意文件删除和任意文件上传,审计出来以后又审计了一下下一版本,图片都是当时审计时做的笔记…
审计两个版本 v2021.0521152900 和v2021.0528154955,7月2号爆出的v2021.0521152900存在任意文件删除和任意文件上传,审计出来以后又审计了一下下一版本,图片都是当时审计时做的笔记的图片
暑假七月份想训练一下代码审计,于是去cnvd上看近几天有哪些cms有编号,然后找到了这个小cms
任意文件删除漏洞产生原因
由于已经知道是什么漏洞了,所以直接去搜索一下相应的函数即可,于是搜索了一下unl ink()函数,翻着看了一下定位到了这个文件
代码如下
function delfile($fileUrl)
{
$fileUrl = path_absolute($fileUrl);
$fileUrl = stristr(PHP_OS, "WIN") ? utf82gbk($fileUrl) : $fileUrl;
@clearstatcache();
return is_file($fileUrl) ? unl ink($fileUrl) : false;
}
看到
$fileUrl = path_absolute($fileUrl
跟进path_absolute函数
function path_absolute($path)
{
$path = PATH_WEB . str_replace([
"../", "./", PATH_WEB,
], "", $path);
$path = str_replace("\/", "\\", $path);
return is_dir($path) ? path_standard($path) : $path;
}
可以看到过滤规则,但是开发人员忽略了cms是搭建在windwos系统上那么就可以利用..\来进行跨目录
知道这一点后找哪里应用了delfile()
在后台中有个备份功能,当备份了以后可以执行删除操作
删除操作在datab ase.class.php中
case 'del': $file = PATH_WEB . 'backup/data/{$_L['form']['name']}';
if (is_file($file)) {
delfile($file);
ajaxout(1, '删除成功');
} else {
ajaxout(0, '文件不存在');
}
break;
可以看到这里应用了delfile()
于是bp抓包,修改一下数据包
当时在备份文件目录下创建了一个txt文件
在数据包中将data名修改为1.txt发送即可,但是当时没有将bp数据包截图,只有下一版本的任意文件删除漏洞有截图
任意文件上传
漏洞产生的原因在于没有将后添加进白名单的文件名进行检测过滤
然后直接到这里添加附件
直接上传即可getshell
漏洞产生原因:
上传控制文件位于:upload.class.php
upload先截取文件的后缀名,截取以后再对后缀名和白名单文件名列表进行比较
$mime = substr($file['name'], strrpos($file['name'], ".") + 1);
if (stripos($_L['config']['admin']['mimelist'], $mime) !== false)
当添加进去文件白名单后,upload.class.php过滤规则中就会有你写的白名单文件名
下一版本任意文件删除
可以看到由于上一版本的过滤原因,这一版本添加了过滤规则,在过滤规则中添加了 ..\和.\
但是加了之后真的安全了吗?表面上看起来雀食如此,但根据过滤规则我在在线php工具上写出了代码,然后进行调试
成功了,可以看到最后我的payload最后输出成为了..\,这就代表着在windows系统下依然存在任意文件删除漏洞
打开bp再次抓包,这一次当时选择了根目录下的README.md文件
然后像之前一样修改数据包,根据目录放上payload
发送之后就可以看见
直接删除掉了.
措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
- 本文作者: A1kaid
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/429
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!