文件上传漏洞总结

文件上传漏洞

记录时间 2022/02/09

IIS 5.x/6.0 解析漏洞

zoom-shadow

Nginx 解析漏洞

在低版本的Nginx中存在一个由 PHP-CGI 导致的文件解析漏洞。

在PHP的配置文件中有一个关键选项cgi.fix_pathinfo在本机中位于php.ini配置文件中,默认开启。

当URL中有不存在的文件时,PHP就会默认向前解析。

漏洞利用流程:

  1. 访问 www.xx.com/phpinfo.jpg/1.php

    (1.php不存在)。

  2. 会按照php的格式解析phpinfo.jpg

Apache 1.x/2.x 解析漏洞

Apache从右至左开始判断后缀,跳过非识别后缀,直到找到可以识别的后缀为止📍,然后利用识别到的后缀进行解析。

漏洞利用流程:

  1. 上传shell.php.test;
  2. 访问shell.php.test,服务器就会按照php格式解析shell.php.test文件(test后缀无法识别,因此第一个可识别后缀为php)

前端验证绕过

条件:网站或CMS仅在前端使用JavaScript来校验。

漏洞利用流程:

  1. 通过Burp Suite抓包,修改内容后放行。
  2. 通过Chrome禁止/删除js代码。

利用BWAPP靶场进行复现:

zoom-shadow

针对页面进行元素检查,并删除对应js代码以达到前端验证绕过的效果:

zoom-shadow

.htaccess绕过

什么是.htaccess?
.htaccess文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法同apache主配置文件。

它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

作为用户,所能使用的命令受到限制。

管理员可以通过Apache的AllowOverride指令来设置。

.htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的

.htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能。

如何利用.htaccess?
场景:启用了.htaccess文件的网站,使用此文件类型来绕过限制较为全面的黑名单过滤。

思考🤔:

  1. 为什么不能绕过限制较全面的白名单过滤?

    白名单限制了哪些文件可以上传,因此没办法进行文件类型的绕过。

  2. 如何实操来绕过黑名单过滤?

    1. 上传一个.htaccess文件,文件内容设置为【AddType application/x-httpd-php .test】。
    2. 上传一句话木马,文件名设置为shell.test
    3. 访问shell.test即可执行一句话木马。

大小写绕过

这是一种比较简单的绕过方式,针对黑名单策略。

上传php的一句话木马,上传一个pHp即可。

思考🤔:

  1. php等同于pHp吗?

    不等同。

  2. 为什么可以解析呢?

    跟web server的配置有关,Windows平台文件后缀名大小写不敏感,因此可以采用该方式进行绕过;Linux平台文件后缀名大小写敏感,因此不可以采用该方式绕过。

    zoom-shadow

    zoom-shadow

    图中为Kali操作系统。

关于Linux+Apache服务器URL区分大小写问题

Linux服务器的大小写敏感有时候很不方便,在地址栏里一定要输入准确的URL才能访问,对搜索引擎和用户不是很友好,那么如何解决LINUX服务器URL的大小写问题,今天同步碰到一个问题,在浏览器地址栏中输入URL地址时,必须要区分大小写才能正常访问页面,网站服务器是Linux+Apache,造成此现象主要原因是缺少speling模块,因此只要在相应的系统里加载就可以了。(来源网络)

进阶姿势


Windows文件流特性绕过

文件流只适用于Windows环境下,比如站点禁止上传扩展名为.php的文件,那我们通过文件流的方式,将文件的扩展名修改为.php::$DATA,就可以成功绕过过滤,而对于windows系统来说这就是一个普通的文件,依旧会被作为php文件解析

什么是Windows文件流?
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,Windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序。

测试:

  1. echo 111 > test.txt:111.txt;
  2. echo test > test.txt;
  3. echo 222 > test.txt::$data;

注:一定在cmd中执行,powershell中执行会有问题

  1. 桌面生成了一个test.txt文件,但文件为空

    zoom-shadow

  2. 桌面无变化,test.txt文件不再是0字节

    zoom-shadow

    并且内容成功写入

    zoom-shadow

  3. test.txt文件内容已经被修改

    zoom-shadow

由此说明,平时我们新建文件并修改是通过默认文件流$data写入的,同时我们也可以自己指定文件流进行写入操作。可以利用操作数据流来进行文件后缀检测的bypass。

zoom-shadow

截断绕过

%00截断是和php版本有关联型的,是5.2.x版本的一个漏洞,php5.3.24代码中已经修复,修复的代码位于ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER函数的开始处

一种利用编码的绕过方式,更多被应用于绕过白名单策略的防御。

zoom-shadow

关键代码解析:

$file_ext = substr($_FILES['upload_file']['name'], strrpos($_FILES['upload_file']['name'],'.')+1); //将.后的文件后缀名取出来
if (in_array( $file_ext, $ext_arr )) {
    $temp_file = $_FILES['upload_file']['tmp_name']; //创立临时文件
    $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis")."."$file_ext; //post方式传入文件保存路径,文件名是基于时间的随机文件名
}

后面采用保存文件的时候,是路径拼接的形式,而路径又是从前端获取,所以我们可以采用在路径上截断。(两个可控输入点)

strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)

漏洞利用流程:

  1. 设置save_path=../upload/a.php%00
  2. 上传一句话JPG图片马

文件头检测绕过

zoom-shadow

png文件头:89 50 4E 0D

jpg文件头:FF D8 FF DB

gif文件头:47 49 46 38

因为存在一个对文件头的检测,因此我们可以采用将payload附着在目标文件末尾的方式来绕过对于文件头的检测。

条件竞争

参考:https://cloud.tencent.com/developer/article/1650655

总结

zoom-shadow

源码审计

源码审计方向看文件上传漏洞

zoom-shadow

Fuzz

参考:https://www.ddosi.org/b498/

利用Burp Suite中的Intruder模块,进行fuzz:

  1. 选择fuzz的位置;
  2. 准备payload;
  3. 准备fuzz用的字典。

防御措施

  1. 文件类型检测:白名单 优于 黑名单
  2. 使用安全的函数进行编程
  3. 熟悉业务环境的OS、Web Server 配置
  4. 遵守安全开发规范,使用安全的配置选项

记录时间 2022/2/27

posted @ 2022-02-27 10:39  sherlson  阅读(94)  评论(0编辑  收藏  举报