漏洞详解--文件上传 如何花样绕过?!

一、漏洞原理

1.1 核心

文件上传漏洞,顾名思义,将攻击者将恶意文件上传到服务器,服务器将恶意文件解析,攻击就达成了。

1.2 漏洞详解

文件上传漏洞非常好理解,有三个关键点,一是上传文件,二是找到文件上传的路径,三是使恶意文件得到解析。

假设一个系统没有防御(后面会讲绕过),文件上传漏洞步骤就如下:

  1. 上传恶意文件,如php一句话木马:
php 复制代码
<?php @eval('cmd');?>
  1. 服务器返回上传到的路径:
    路径可能可以在Response中看到,也可能很简单的回显给你,比如头像,文章之类的,你就知道路径了(当然,也有可能很难找)
    例如路径为:http://xxx.com/41937489134/cmdshell.php
  2. 使恶意文件得到解析:
    有时候直接点击链接,文件就得到执行了(有时候无法执行,就需要配合文件包含漏洞等),如:
    点击http://xxx.com/41937489134/cmdshell.php ,之后用蚁剑等工具连接就getshell了。

上述的情况非常理想,几乎不可能,那么如何绕过和构造利用链就是重中之重了。

二、检测与利用

检测方法很简单,找到可以上传文件的接口,尝试各种绕过技巧或构造利用链,如果可以,那就是存在。

利用也很简单,构造木马文件(一句话木马,大马,图片马等),上传解析,就可以getshell了。

主要还是绕过和构造利用链!!!

三、修复与绕过

这里将修复与绕过统一起来说,便于读者理解和选择绕过技巧。偏向于攻击者视角。

3.1 JS前端检查

JS前端检查这种防御手段形同虚设,两种绕过方式:

  1. F12开发者工具禁用JS。
  2. BurpSuite抓包,改包。例如想传muma.php,先改一下后缀名,改为muma.jpeg,然后BP抓包再改回muma.php即可。

3.2 Content-Type校验

根据请求报文Content-Type字段进行校验,绕过方式:

抓包,将Content-Type改为image/jpeg,image/png,application/pdf等服务端允许接收的即可。

3.3 文件头类型检测

文件头(有时也叫 魔数 Magic Number)指的是文件开头的几个字节(通常 2~8 字节,有的更长),这些字节是文件格式的标识,用来告诉操作系统或应用程序该文件属于什么类型。可用于识别文件类型,往往比扩展名更可靠。常见的文件头有:

文件类型 十六进制文件头 (Magic Number) 说明
JPEG (jpg) FF D8 FF E0FF D8 FF E1 数码照片最常见格式
PNG (png) 89 50 4E 47 0D 0A 1A 0A PNG 标志
GIF (gif) 47 49 46 38 39 6147 49 46 38 37 61 "GIF89a" 或 "GIF87a"
BMP (bmp) 42 4D "BM"
TIFF (tif) 49 49 2A 004D 4D 00 2A 分别对应小端/大端
PDF (pdf) 25 50 44 46 "%PDF"
ZIP (zip/docx/pptx/xlsx/jar) 50 4B 03 04 ZIP 压缩包及基于 ZIP 的 Office 文件
RAR (rar) 52 61 72 21 1A 07 0052 61 72 21 1A 07 01 00 RAR4 / RAR5
7z (7zip) 37 7A BC AF 27 1C 7-Zip
EXE (Windows) 4D 5A "MZ" 标志
ELF (Linux可执行) 7F 45 4C 46 "ELF" 标志
MP3 (音频) 49 44 33FF FB "ID3" 标签 或 MP3 帧头
MP4 (视频) 00 00 00 18 66 74 79 70 69 73 6F 6D "ftypisom"
WAV (音频) 52 49 46 46 + ... + 57 41 56 45 "RIFF....WAVE"
XML/HTML 没有固定魔数,一般开头是 <
文件头检测也不一定安全,工具者可以通过二进制编辑工具,如010Editor,在文件开头插入伪造的文件头进行绕过。

3.4 文件拓展名检测

文件拓展名检测大体可分为白名单检测和黑名单检测。白名单检测往往更加的安全。

3.4.1 黑名单检测:

如服务器端禁止"php,jsp"文件。

绕过方法大致如下:

  1. 大小写双写混淆:如PhP, jsP这类的,还有pphphp,jjspsp
  2. 00截断:php版本低于5.3.4可以尝试%00截断。如muma.php%00.jpeg。这样%00之后的字段会被截断丢弃,就相当于muma.php,从而进行绕过。
  3. Windows特性:有些绕过利用了Windows的特性,如Windows会忽略最后的'.'' ',还有Windows附加数据流。如muma.php. .,muma.php::$DATA进行绕过
  4. 同义文件拓展名:如将php换成php3,php2之类的,默认配置下可能不太好用。
  5. .htaccess绕过:.htaccess文件为Apache配置文件,仅作用于当前目录。通过在里面写"AddType application/x-httpd-php .php .txt .jpg"等将常见后缀名作为php解析,之后上传.txt等文件就可以实现注入了。但是前提是Apache允许其生效,AllowOverride All才可以,默认配置不可以。
  6. .user.ini绕过:.user.ini是用户自定义配置文件,用于覆盖或追加全局配置文件(如.php.ini)中的PHP配置选项。

3.4.2 白名单检测:

绕过方法大致如下:

  1. 00截断:php版本低于5.3.4可以尝试%00截断。如muma.php%00.jpeg。这样%00之后的字段会被截断丢弃,就相当于muma.php,从而进行绕过。
  2. 图片马:图片马的使用一般需要结合文件包含漏洞来实现(详细见下)。图片马的制作就是将一句话木马写入合法图片之中,然后上传图片,但是因为图片默认不会被执行,所以需要配合文件包含漏洞来实现。如果上传的图片会被重写,可以上传GIF图片,因为GIF图片常常会有大段内容不被重写。之后对比原GIF图片和重写后的GIF,找到没有被重写的部分,加入恶意代码。重新上传即可。

3.5 绕过链

3.5.1 与文件包含漏洞:

  1. 先正常上传一个图片马,因为是图片,所以大部分时候都可以上传成功。
  2. 得到图片上传到的地址:http://xxx.com/pics/muma.jpeg
  3. 使用文件包含漏洞(可执行)包含图片马执行:如:http://xxx.com/aaa?include=http://xxx.com/pics/muma.jpeg
  4. 使用蚁剑连接即可。
    当然,如果有文件包含漏洞,常常可以尝试日志注入,日志注入成功就用不着文件上传漏洞了。文件包含漏洞详解:https://www.cnblogs.com/L-xy/p/19093806

3.5.2 与反序列化漏洞:

  1. 先将序列化payload进行上传。
  2. 同样的,利用反序列化漏洞对上传的序列化payload进行反序列化。
  3. payload被执行,攻击成功。
    同样的,如果有反序列化漏洞,也可以考虑日志注入。