常见的文件上传

常见的文件上传(待完善)

1.htaccess文件绕过

   ①     .htaccess是什么?  .htaccess文件也被成为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

   ②     .htaccess功能:

            文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,很可惜,这么一个强大的功能默认是不开启的

   ③     例如:

            AddType application/x-httpd-php .jpg    这个指令代表着.jpg文件会当做php来解析

            我们发现无法将文件名命名为.htaccess ,那么该怎么办?

            可以使用cmd的重命名

            ren 17.txt .htaccess

         

2.大小写绕过

        我们可以通过大小写去绕过。WEB容器除非非常老的版本,不然都不区分大小写。

3.文件后缀(空)绕过

        在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么php和php ,当然是不一样的。

4.文件后缀(点)绕过

        windows有一个特性,会自动去掉后缀名最后的。

5.  ::$DATA(Windows文件流绕过) 

      ①    这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。

      ②     我们肯定不懂这个意思是什么,我们先在CMD运行一个(藏文件的小福利)

                echo abcd>>a.txt:b.txt  将abcd写入a.txt:b.txt  很明显生成一个a.txt

               然后再试试a.txt::$DATA

               ::$DATA就是默认不修改文件流的情况

               所以生成一个正常的a.txt    

               利用windows特性,可在后缀名中加” ::$DATA”绕过

6.构造文件后缀绕过

 1 $is_upload = false;
 2 $msg = null;
 3 if (isset($_POST['submit'])) {
 4     if (file_exists($UPLOAD_ADDR)) {
 5         $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
 6         $file_name = trim($_FILES['upload_file']['name']);
 7         $file_name = deldot($file_name);//删除文件名末尾的点
 8         $file_ext = strrchr($file_name, '.');
 9         $file_ext = strtolower($file_ext); //转换为小写
10         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
11         $file_ext = trim($file_ext); //首尾去空
12         
13         if (!in_array($file_ext, $deny_ext)) {
14             if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
15                 $img_path = $UPLOAD_ADDR . '/' . $file_name;
16                 $is_upload = true;
17             }
18         } else {
19             $msg = '此文件不允许上传';
20         }
21     } else {
22         $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
23     }
24 }

        $file_ext = strrchr($file_name, '.'); 是检测末尾最后是否是.  (很明显是为了防御双写.)

        我们可以写一个空,最后反正有首尾去空,干完这一切后他才开始进行判断是否是非法文件

        我们可以尝试构建一个. . (前面去掉.然后检验.不存在,再去空格,留下php.,然后php.不属于$deny_ext数组中存在的,当然就直接提交了,然后因为windows自动去点,于是乎php后缀就出来了。

7.双写绕过

        仔细看源码发现  ,这里的意思就是讲检测到的危险字符替换为空,php被替换为空是空,那么pphphp被替换为空就会变为php,不就达到了绕过。


                    前    七   个    为    黑    名    单,后    面    是    白    名    单

8.(%00截断):

    ①    知识点

           了解%00实际上我们要先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了

    ②    原理

            在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,在没有解析漏洞的情况下我们该怎么办?

            JPG格式并不会被解析,那么我们需要绕过上传过滤。

            假如我写了1.php%00.jpg  传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php

            %00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符。

    ③    利用实例

 1 $is_upload = false;
 2 $msg = null;
 3 if(isset($_POST['submit'])){
 4     $ext_arr = array('jpg','png','gif');
 5     $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
 6     if(in_array($file_ext,$ext_arr)){
 7         $temp_file = $_FILES['upload_file']['tmp_name']; //upload_file是上传的文件名,tmp_name是服务器储存的临时目录(系统默认在php.ini中可以设置)
 8         $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; //在GET传参过程中使用00截断
 9  
10  
11         if(move_uploaded_file($temp_file,$img_path)){
12             $is_upload = true;
13         }
14         else{
15             $msg = '上传失败!';
16         }
17     }
18     else{
19         $msg = "只允许上传.jpg|.png|.gif类型文件!";
20     }
21 }

            前面讲了%00截断,然后我们现在看题目,他会自动重命名,这是个头疼的问题,我们该如何解决。

9.条件竞争

    ①    知识点

            竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

            开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

            线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

            在我理解就是两只哈士奇(线程)同时去抢一个丢出去的飞盘(资源),不知道到底哪只能抢到,此处便形成了竞争。

            那我们上传是和谁去竞争?

            一般而言我们是上传了文件,上传了但是最后却因为过滤或者因为其他原因被删除了,那么我们可以使用条件竞争,我们实际上是和unlink,是和删除文件的函数进行竞争。

    ②    实例

            假如我不断的上传发包,然后我同时也不断的访问那个我们上传上去的文件的地址,我们就开始和服务器的函数比手速了,函数执行都是要时间的,如果我这边上传上去,且没有删除,那个时间可能很短,然后    被我访问到了,岂不是就可以执行PHP了~我就比服务器手速快了~

            你可以上传一个php然后访问后,由这个php去写一个马

            <?php $a = '<?php @eval($_REQUEST[\'a\'])?>';file_put_contents('1.php',$a)?>

            上传文件

       

        访问文件

       

10.IIS6.0漏洞

    ①    IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll

            IIS5.1和IIS7.5无此漏洞。

    ②    IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

            test.asp;.jpg   他将当做asp进行解析

            test.asp/123.jpg 他将当做asp进行解析

    ③   请求 /aaa.asp;xxxx.jpg

            N1:从头部查找查找 "."号,获得 .asp;xxxx.jpg

            N2:查找";"号,如果有则内存截断

            N3:查找"/",如果有则内存截断

            最终,将保留下来 .asp 字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配对比,并反馈给了asp.dll处理

    ④    put

            options 探针服务器信息,返回报文头部会出现allow字段

            put 上传文件

            move更改文件名

11.apache文件解析问题

    在1.x、2.x中,apache对于文件名的解析是从后往前解析的,直到遇到apache认识的文件类型为止,如1.php.rar.rar.rar因为apache不认识rar文件类型所以会一直遍历后缀到.php,然后认为这是一个php的类型文件。(apache认识的文件类型定义在mime.types文件中)。

12.CGI路径解析问题

        Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设SCRIPT_FILENAME。

    当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:

    PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.

    也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析

    此漏洞是php用cgi解析造成的,在其他web容器中也有可能存在。

文件上传常见问题汇总

  • 图片马制作
           copy a.jpg/b + 1.txt 123.jpg    (将a.jpg和1.txt 合并为123.jpg   (注:这个是效果))
  • 文件上传对渗透测试的意义
           文件上传属于获取Getshell的一种方法,属于最常规获取webshell的方法,所以寻找上传点比进入后台还重要,如果前台上传点你直接上传上去一个一句话木马,整个站你就拿下来了。
  • 文件上传需要做信息收集吗?
           当然需要信息收集,信息收集中对web容器和用的动态语言和动态语言版本对文件上传非常有用,一个ASP的站,你传一个PHP的马,如果说没有特殊设置,那么这个马是不可能执行(但是有些情况下,他设置了解析,也是可以解析的)然后web容器也会存在一些解析漏洞,如iis6.0畸形解析、CGI解析漏洞
  • 文件上传是不是只会检测后缀?
           并不是,有些文件上传还会去检测文件内容
  • 黑名单和白名单哪个安全?
           相对而言,白名单更安全一点
  • 如果只能上传图片,这个上传点是不是没用?
           并不是,好歹你还是有文件上传上去的,如果网站存在本地包含或者解析漏洞,你传上去的图片马就可以大放光彩了。
  • 只是windows有::$DATA吗?
           是的
  • windows忽略大小写,linux?
           Linux并不会忽略大小写,比如访问一个网站,将URL里面文件夹得名字改一个小写字母为大写,如果正常访问那一般是windows,如果访问出现问题一般是linux(快速检测不一定准)
  • 双写绕过常见吗?
           双写绕过并不是特别常见,但是也是遇到过,你上传得文件得文件名就可以看出来能否双写绕过
  •  没有源码怎么测试文件上传漏洞?
            大多数情况下,都不会有目标站点的源码。所以黑盒怎么测试妮?先传一个正常图片,然后看看这个地方上传是否有用,然后再传一个jpg后缀的图片马,看看对内容会不会检测,然后再尝试改包,看看是不是前端验证,然后尝试下看看是黑名单还是白名单机制,然后最后尝试条件竞争。
  • .htaccess文件绕过这个常见吗?
            虽然这个默认不是开启的,但是开启了伪静态的网站都会开启,所以遇到伪静态可以直接尝试,不过没用遇到也是可以尝试的,也许管理员开启了妮~多尝试
  •  后缀大小写绕过可能存在吗?
            当然可能啦,老的ASP站比较容易遇到
  •  文件后缀(空和点)绕过适用于什么环境?
            仅仅用于windows
  • 00截断和%00截断有区别吗?
            没有任何区别,%00 仅仅是00的URL编码而已
  •  00截断有限制条件吗?
            高版本php不存在,5.4.45以上似乎就没有了
  •  有没有把图片打成base64保存到数据库的操作?
            有这个操作,但是我试过,我做开发的时候干过这个操作,但是这样会让数据库超级大,而且感觉影响了数据库的性能
  • 条件竞争实战可行性?
            实战是可以行的,之前遇到过一个非法网站,然后他就存在条件竞争(不过一般5分钟没跑出来就放弃把)
  •  IIs6.0畸形解析漏洞(一)怎么利用?
            Asa cer 这个很明显是绕过黑名单机制的
            这里是绕过白名单机制的,利用;进行绕过
            当你拥有建立文件夹且可以命名的时候利用
  • IIS6.0感觉很老呀现在还多吗?
           ASP的站大部分都是这个版本,也有些IIS6.0修复了解析漏洞,也不用太执着
  • CGI解析漏洞仅仅用于Nginx吗?
           不是这样子额的,CGI解析漏洞在IIS7.5、IIS7.0中也存在,我实战遇到过的大部分都是IIS7.X比较多
  • 文件上传漏洞就只有靶场的这23个吗?
           当然不是啦,只不过这23个是比较常见的啦
  • 文件上传是不是必须要图片马?
           也并不是必须,但是我建议使用图片马,因为图片马可以绕过好多防护机制
  •  我图片马做了,但是上传上去连接不了怎么办?
            你先看看你的图片马是不是太大了,图片马大了会影响执行,所以我建议使用小图片做图片马,我自己真的用的图片马,都是QQ表情,一个图片才10kb.第二个要检测的就是看看图片马是否正常运行,建议在本地先试试
  • 动态脚本语言不同,他们的一句话木马可以通用吗?
           当然不可以啦,难道你觉得英语和中文还有日语可以通用吗?每个动态脚本语言都有自己的一句话木马,函数可能连名字都是差不多的,但是语句肯定不一样(百度查一查就有了)
posted @ 2021-04-16 15:33  ca0mu  阅读(279)  评论(0编辑  收藏  举报