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

一、漏洞原理

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 E0 或 FF D8 FF E1 数码照片最常见格式
PNG (png) 89 50 4E 47 0D 0A 1A 0A PNG 标志
GIF (gif) 47 49 46 38 39 61 或 47 49 46 38 37 61 "GIF89a" 或 "GIF87a"
BMP (bmp) 42 4D "BM"
TIFF (tif) 49 49 2A 00 或 4D 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 00 或 52 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 33 或 FF 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被执行,攻击成功。
    同样的,如果有反序列化漏洞,也可以考虑日志注入。