您的位置 首页 php

PHP 代码审计之文件删除

点击右上角【关注】发哥微课堂头条号,get更多相关技能~


0x00:前言

CMS 后台很多栏目有上传文件功能,上传漏洞先暂时搁浅,在代码处理的时候,有删除旧文件这个操作,所以先审计下看有没有删除文件的漏洞。

0x01:代码追踪

首先打开后台基本每个栏目都有上传资料上传图片的功能,这里就已产品栏为例,其目录在 product/admin 下,打开 modifyinfo.php,找到上传图片的代码,如下:

//删除旧图
if(!empty($_POST['delphoto'])){
 foreach($_POST['delphoto'] as $val){
 $strOldFile = $arrGPic['FileSavePath'].'s/'.$_POST['savephoto'][$val];
 if (is_file($strOldFile)) { // 缩略图删除
 unlink($strOldFile);
 }
 $strOldFile = $arrGPic['FileSavePath'].'b/'.$_POST['savephoto'][$val];
 if (is_file($strOldFile)) { // 原文件删除
 unlink($strOldFile);
 }
 unset($_POST['photo'][$val]);
 }
}
 

这里修改产品信息的时候,对于接收 savephoto 值时并没有做相关的处理操作,而是直接拼接到了文件保存路径中,然后直接调用 unlink 进行了删除。也就意味着可以修改下文件名加上../ 来越目录。

这里验证的时候碰到些问题,第一个是代码会首先判断 delphoto 变量是否存在,这是基础,没有这个值是走不了删除这一步的,之前验证的时候,拦截的数据包中并没有这个值,后来发现是编辑产品信息时,并没有删除图片这个操作,只有删除了原图,发送请求时才会有这个 delphoto 参数,功能是这样的:

第二个时,拦截数据包后有 delphoto 参数后,直接修改 savephoto 的名字为../../../../test.txt 没有生效,为了测试我在根目录下新建了一个 test.txt,后来发现是越多了,如果渗透过很多文件下载漏洞,../../../../etc/passwd 用多了的话,就会自然想着../ 能多不能少,这里只需要越三层,多了会直接到电脑 盘符 ,所以会发现 test.txt 还在。

0x02:渗透验证

修改产品时,删除原来的旧图,然后选择新图片,保存时拦截请求包并修改相应数据,如下图:

0x03:修复建议

修复时建议对删除路径中的可控变量进行特殊字符过滤,不允许包含. 和 / 等。

文章来源:智云一二三科技

文章标题:PHP 代码审计之文件删除

文章地址:https://www.zhihuclub.com/150028.shtml

关于作者: 智云科技

热门文章

网站地图