加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

文件上传-绕过文件类型

发布时间:2022-09-30 06:33:50 所属栏目:PHP教程 来源:转载
导读: 小伙伴们大家好!本期为大家带来的文件上传漏洞之绕过文件类型。
目录
原理
当我们上传文件的时候,不仅前端要检验我们文件的后缀名,后端也会检测我们的文件类型。通常后端会获取到我们上

小伙伴们大家好!本期为大家带来的文件上传漏洞之绕过文件类型。

目录

原理

当我们上传文件的时候,不仅前端要检验我们文件的后缀名,后端也会检测我们的文件类型。通常后端会获取到我们上传文件的type属性即我们用burpsuite抓包时经常看到的content-type,它的值与后端获取到的文件type属性是一样的。既然我们可以抓到包,我们就可以修改包,我们通过抓包将数据包中的content-type改成后端代码可以接受的即可,这样就顺利绕过了后端文件类型的检验。

Content-Type

一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。

例如我们上传php文件抓取数据包Content-Type的值为application/octet-stream,而上传png图片抓取数据包Content-Type的值为image/png。

PHP代码如何获取上传文件的类型

前端form表单提交文件数据的时候,后端PHP代码使用$_FILES['file']['type'](这里的中括号里的“file”是form表单提交文件的name值)来获取上传文件的类型。

例如有以下php代码:

<?php
header('Content-type:text/html;charset=utf-8');
echo "
"; echo ""; echo "
"; echo ""; echo "
"; if (isset($_FILES['file'])) { echo $_FILES['file']['type']; }

php文件域上传_文件上传php_PHP文件上传

php文件域上传_PHP文件上传_文件上传php

可以看出来显示了文件的类型。如果上传的是png图片的话则是image/png。

文件上传php_PHP文件上传_php文件域上传

PHP文件上传_文件上传php_php文件域上传

实战演示

我这里呢是自己写的php+html代码,使用phpstudy集成环境搭建的站点,如果小伙伴们也想搭建的话可以看我之前的一篇讲解MySQL基础+PHP操作MySQL的文章——这里有讲解搭建phpstudy的详细内容。

源码:

2.html




    
    文件后缀绕过




file02.php

<?php
header('Content-type:text/html;charset=utf-8');
if ($_FILES["file"]["error"] > 0) {
    echo "Return Code:".$_FILES["file"]["error"]."
"; } else { if ($_FILES['file']['type'] != "image/png"){ echo "

"; exit("请上传png格式的文件"); echo "
"; } echo "

"; echo "upload: ".$_FILES["file"]["name"]."
"; echo "type: ".$_FILES["file"]["type"]."
"; echo "size: ".($_FILES["file"]["size"] / 1024)."KB
"; echo "Temp file: ".$_FILES["file"]["tmp_name"]."
"; if (file_exists("upload/".$_FILES["file"]["name"])) { echo $_FILES["file"]["name"]." already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]); echo "Stored in: "."upload/".$_FILES["file"]["name"]; } echo "
"; }

1、测试网站的功能是否正常

首先我们还是测试站点是否真正的能够实现文件上传功能,我们先来上传一个png图片试一下。

文件上传php_php文件域上传_PHP文件上传

文件上传成功,我们访问以下看是否能够显示出图片。

php文件域上传_PHP文件上传_文件上传php

文件上传成功并被存储,站点功能正常。

2、尝试上传webshell

这里我们尝试上传一个名为2.php的一句话木马webshell。

php文件域上传_PHP文件上传_文件上传php

PHP文件上传_文件上传php_php文件域上传

php文件域上传_文件上传php_PHP文件上传

点击确定之后发现有前端验证,我们直接鼠标右键点击检查,找到前端验证的代码,并将其删除掉。

php文件域上传_文件上传php_PHP文件上传

接下来再尝试上传2.php

开始上传。

PHP文件上传_php文件域上传_文件上传php

上传之后发现返回了一句请上传png格式的文件。

代表后端可能验证了文件的类型。

我们抓包修改一下content-type再试一下。

PHP文件上传_文件上传php_php文件域上传

php文件域上传_文件上传php_PHP文件上传

修改完Content-Type之后点击forward。返回浏览器看页面的响应情况。

PHP文件上传_php文件域上传_文件上传php

这样我们就成功的将我们的webshell成功的上传到了站点。

3、使用连接工具连接webshell

成功上传webshell之后,接下来我们就要使用webshell连接工具来连接我们的webshell后门。我这里使用的是中国蚁剑,大家使用其他的连接工具菜刀哥斯拉都一样的。

文件上传php_PHP文件上传_php文件域上传

连接成功直接添加数据即可。

文件上传php_php文件域上传_PHP文件上传

这样我们就成功的拿下了这个站点。

总结

后端文件类型的检验主要就是后端代码获取文件的type属性,而数据包中的Content-Type值又是与之对应PHP文件上传,所以我们只需抓取数据包,将数据包中的Content-Type值修改为后端可接收的类型接口绕过。

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!