文件上传攻击演练

文件上传攻击指攻击者利用网站的一个上传接口来上传恶意木马文件,在此记录下我的学习过程

首先编写文件上传代码

<body>
    <form action="upload.php" method="post" enctype="multipart/form-data" name="upload" onsubmit="return lastname()">
        <input type="hidden" name="MAX_FILE_SIZE" value="204800"/>
        请选择要上传的文件:<input type="file" name="file"/>
        <input type="submit" name="submit" value="上传"/>
    </form>
    </body>

这是上传界面代码,接着是所要上传到的文件即服务器端文件

<?php
 if(($_FILES['file']['type'] == 'image/gif') || ($_FILES['file']['type'] == 'image/jpeg') || ($_FILES['file']['type'] == 'image/png')
|| ($_FILES['file']['type'] == 'image/bmp'))
 {
     if(is_uploaded_file($_FILES["file"]["tmp_name"])){
         $upfile=$_FILES["file"];
         $name=$upfile["name"];
         $type=$upfile["type"];
         $size=$upfile["size"];
         $tmp_name=$upfile["tmp_name"];

         echo "上传文件名:" . $_FILES["file"]["name"] . "<br />";
         echo "上传文件类型:" . $_FILES["file"]["type"] . "<br />";
         echo "上传文件大小" . ($_FILES["file"]["size"] / 1024) . "Kb<br />";

         $destination="/var/www/html/文件上传攻击/image/".$name;
         move_uploaded_file($tmp_name,$destination);

         echo "文件上传成功";
         echo "<br>文件预览:</br>";
         echo"<img src=" .$destination.">";
     }
     else{
         echo "文件上传失败";
     }
 }
 else{
     echo "文件类型不对";
 }
?>

文件上传流程

首先先理一理文件上传流程。

js防护

防护思路是通过前台js脚本来限制上传文件的后缀名,可以在文件上传的时候检测文件类型,实现代码

<script type="text/javascript">
            function lastname() {
                var file = document.getElementsByName('file')[0].value;
                if (file == null || file == "") {
                    alert("你还没有选择任何文件,不能上传!");
                    return false;
                }
                //定义允许上传的文件类型
                var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
                //提取上传文件的类型
                var ext_name = file.substring(file.lastIndexOf("."));
                //alert(ext_name);
                //alert(ext_name + "|");
                //判断上传文件类型是否允许上传
                if (allow_ext.indexOf(ext_name + "|") == -1) {
                    var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
                    alert(errMsg);
                    return false;
                }
            }
        </script>

即可在前端直接检测上传文件

绕过方式:由于其是前端检测,所以可以通过禁用浏览器运行js脚本来达到上传目的 ,如火狐浏览器在地址栏输入aout:config,再搜索javascript.enabled更改其设置

MIME防护

在http协议中,会利用content-type标识本次上传的内容,一个方法是用burpsuite抓包修改文件后缀,设置手动代理,代理地址为127.0.0.1,即可将http包抓包修改再上传

文件中的content-type即为服务器端的MIME防护效果,由客户端浏览器自动生成,可将其修改为Image/jpeg,再点击forward

服务器端文件检测防护

在服务器端检测文件后缀名,其关键代码为

if(($_FILES['file']['type'] == 'image/gif') || ($_FILES['file']['type'] == 'image/jpeg') || ($_FILES['file']['type'] == 'image/png')
|| ($_FILES['file']['type'] == 'image/bmp'))

有黑名单,白名单两种形式,针对此类的绕过方法便是多重测试,找寻遗漏文件名,可以是大小写测试 特殊文件名测试等。

服务器端文件内容检测

文件内容检测通常由三种方法。一是检测上传文件头,二是调用函数对文件进行加载测试,三是图像内容检测。

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值