zoukankan      html  css  js  c++  java
  • 原理篇—上传漏洞

    上传漏洞

    1.文件上传漏洞概述

      文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

      文件上传本身是一个正常的业务需求,对于很多网站来说,需要用户将文件上传到服务器。文件上传本身是没有问题的,出现问题的地方在于服务器怎么处理、解释文件。所以,攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。这里我们先了解一下什么是解析漏洞。

    2. 解析漏洞

      常见的Web容器有IIS、Nginx、Apache、Tomcat等。

      2.1 IIS解析漏洞

      (1)目录解析 (6.0)

        形式:www.xxx.coom/123.asp/abc.jpg

        原理:服务器默认会把.asp .asa 目录下的文件都解析成asp文件 

      (2)文件解析

        形式:www.xxx.coom/123.asp;.jpg

        原理:服务器默认不解析分号后面的内容,因此123.asp;.jpg被解析成asp文件(用于只允许jpg文件上传时) 

      2.2 Apache解析漏洞

        Apache(1.x 和2.x)解析文件是从右到左开始判断的,如果不能识别,就继续向左判断。

        所以,当文件名为1.php.aaa.bbb.ccc时,服务器解析为php文件

      2.3 PHP CGI 解析漏洞

        形式:www.xxx.coom/123.jpg/abc.php

        利用:123.jpg被当作php文件解析,abc.php是不存在的,这意味着攻击者可以上传合法的“图片”,然后在URL后面加上“/xxx.php”,就可以获得网站的WebShell。

      原理:这种解析漏洞其实是PHP CGI的漏洞。在PHP的配置文件夹中有一个关键的选项:cgi.fi:x_pathinfo。这个选项在某些版本是默认开启的。在开启时访问URL,www.xxx.coom/123.jpg/abc.php,abc.php是不存在的文件,所以PHP将向前递归解析,于是造成解析漏洞。

    3. 上传漏洞检测方法及绕过

      3.1 客户端js验证

      客户端使用js检测,在文件未上传时,就对文件进行验证;

      在浏览器禁用js,可以直接绕过

      3.2 服务器端MIME类型检测

      服务器端检测一般会检测文件的MIME类型,检测文件扩展名是否合法,甚至有还会检测文件中是否嵌入恶意代码

      这种方法是通过Content-Type判断文件类型。这里对一个php文件的上传过程进行抓包:

      

      这里可以看到Content-Type的值,我们先了解一下Content-Type常见的媒体格式的类型:

    • text/html : HTML格式
    • text/plain :纯文本格式
    • text/xml : XML格式
    • image/gif :gif图片格式
    • image/jpeg :jpg图片格式
    • image/png:png图片格式

      修改content-Type值为允许上传的文件类型格式,显示上传成功:

      

      3.3 服务器目录路径检测

      在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些Web开发人员为了让代码更健壮,通常会做一个操作,如果指定目录存在,就将文件写入目录中,不存在先建立目录,然后写入。

        然而这正是引发漏洞的关键点,,因为在HTML代码中有一个隐藏标签<input type="hidden" name="Extension" value="up"/>,这是文件上传是默认的文件夹,而我们对参数是可控的,如:将value值改为test.asp,并提交上传一句话木马文件。

      程序在接收到文件后,对目录判断,如果服务器不存在pentest.asp目录,将会建立此目录,然后再将图片一句话密码文件写入test.asp目录,如果Web容器为IIS 6.0,那么网页木马会被解析。

      3.4 服务器文件扩展名检测

         3.4.1 白名单验证

          白名单定义了允许上传的文件扩展名。

      白名单的过滤方式可以防御未知风险,但不能完全依赖白名单。前面有讲到,在IIS 6.0中可以利用1.asp;1.jpg绕过白名单。

         3.4.2 黑名单验证

      黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单扩展名匹配,则认为文件不合法。

      绕过方法:

      (1)黑名单漏掉的扩展名,如:cer;

      (2)可能存在大小写绕过漏洞,如:aSp和pHp之类

      (3)Windows下,文件名以“.”或空格结尾,系统会自动去除,利用此特性也可以绕过黑名单验证。

      

    4. 修复上传漏洞

      上传漏洞最终形成原因主要有以下两点:

      1. 目录过滤不严,攻击者可能建立畸形目录;

      2. 文件未重命名,攻击者可能利用Web容器解析漏洞。

       预防手段:

      1. 接收文件及其文件临时路径;

      2. 获取扩展名与白名单做对比,如果没有命令,程序退出;

      3. 对文件进行重命名。

  • 相关阅读:
    spring注解方式AOP
    struts2 值栈的理解
    JAVA自定义注解
    JS学习随笔。
    使用Jsoup解析html网页
    Struts迭代器(iterator)遍历List常用的4种例子
    Maven 结合 Spring profile对不同的部署环境打包部署
    打印插件LODOP使用介绍
    Linux下查看CPU信息、机器型号等硬件信息
    验证码的生成和验证
  • 原文地址:https://www.cnblogs.com/guoqingsentou/p/13695446.html
Copyright © 2011-2022 走看看