漏洞挖掘技巧篇1-文件上传

漏洞挖掘技巧系列的主要内容为搜集,总结和归纳自己所遇,所见的一些关于 src 中的一些奇淫技巧.
同时也给大家推荐一个关于 SRC 技巧的项目,地址: https://github.com/Wh0ale/SRC-experience,
希望大家天天挖到高危!

0x00正文

0x01 压缩包上传解压路径猜测技巧

很多 cms 的后台中都允许模板或者主题类的压缩包上传,并且大多数情况下这个功能点都能成为我们 Getshell 的入口点.不过有时候上传成功后并不会显示解压后的文件地址,这时候就需要我们去猜测路径.

上传压缩包的时候,有些文件解压后可能出现双重目录名的情况.比如我们上传的压缩文件为 1.zip, 里面有个 2.txt.这种情况可以去猜测路径为 1/1/2.txt.
(忘记截图了,抱歉)

0x02一些绕过

0x02-1

我们在头像处上传发现没有办法上传除了jpg以外的图片,我们可以尝试在–后面多加入一个-如下图。(由于是比较敏感的项目,不公开了具体细节之放一张细节图并且打上厚码)并成功解析

20220424150455

来源:深夜笔记本

0x03 Windows后缀绕过(基本)

0x03-1 空格绕过

服务器为Windows平台,在对用户上传的文件名进行处理时,没有使用trim()函数去除字符串收尾处的空白字符。

利用方式:用户上传图片马时,用Burp拦截,在文件尾部加入空格。例如:xxx.jpg空格。带有空格的后缀可以绕过黑名单的检测,而文件存在在Windows服务器上,会自动去除后缀中的空格。

0x03-2 点绕过

Windows平台,服务端没有使用deldot()删除文件名末尾的点。

利用方式:上传名为 assert.php.的文件。在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。

0x03-3 ::$DATA 绕过

原理: 在 Window系统 中,如果文件名 + "::$DATA" 会把 ::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持 ::$DATA 之前的文件名,他的目的就是不检查后缀名.

利用方式: 如果后台对上传的文件做了后缀名黑名单限制,假如后缀黑名单为: .php .php3, 则我们可以通过上传 1.php::$DATA 绕过黑名单,成功上传,而系统中保存的文件名却是 1.php.

0x03-4 / \ 符号利用

在文件名中使用 /\ 会忽略 \/ 前的名字.比如上传的文件名为 1.png/1.php,实际上使用 $_FILE['NAME']['name'] 获取到的文件名为 1.php. \也同理.

0x04 解析漏洞

0x04-1 IIS 解析漏洞

version 6.0

  1. ; 截断

在IIS 6.0版本中,;号的功能类似于%00截断,例如我们上传一个恶意脚本yijuhua.asp;.jpg,文件后缀为jpg,
可以绕过服务器检测,当我们访问这个文件时,分号后面的内容会被截断,就相当于我们访问的是yijuhua.asp

  1. 文件夹 命名为 xxx.asp

如果一个目录以 xxx.asp 的格式命名,那么该目录下的所有类型的文件都会被当作 asp 文件来解析执行.

很明显普通用户不会创建类似于 xxx.asp 目录,这时候我们就可以自己想办法创建.在上面 Windows 特性中还有一点没有提到, 上传文件名使用 xxx.php::$INDEX_ALLOCATION 其实会创建一个以 xxx.php 为文件名的文件夹,如果我们将其改为 xxx.jsp::$INDEX_ALLOCATION 就可以创建一个以 .jsp 为后缀目录名,接下来想办法将图片传入到这个文件夹下就好了.

20220526202149

version 7.5

原理: 当 IIS 7.5Fast-CGI 运行模式下时,如果服务器开启了 cgi.fix_pathinfo 功能,且去掉了php-cgi.exe 程序的 Invoke handler only if request is mapped to 勾选。那么当访问的文件路径不存在时,会对路径进行修剪。

例如: test.jpg 是我们上传的图片马,直接访问 /test.jpg 无法被php解析。

但是利用路径修剪功能,我们可以访问 /webshell.jpg/.php ,服务器发现为 .php 后缀,便交给php解析。

php发现无法访问该路径后,便会对路径进行修剪,最终解析的是test.jpg文件。

0x04-2 Apache 解析漏洞

原理: Apache认为,一个文件可以有多个后缀,如:werner.txt.png.mp3。这一文件,放在 Windows 里,毫无疑问,就是个mp3文件,
Windows只认最后一个 . 及其后面的字符 mp3 ,觉得该文件后缀为 .mp3,这也是大多数操作系统、应用软件的处理方式、是正常人习惯。
而在Apache中,则可能有所不同,如果有必要,Apache会从后(右)往前(左),一一辨别后缀。何时有必要?当Apache不认识某个后缀时,便有必要。如某文件名为:werner.mp3.html.qwe.arexApache 在处理时,先读取最后一个后缀,为.arex ,一看,这啥玩意啊,不认识,继续读取下一个后缀 .qwe ,一看,呀,这又是啥,还是不认识,继续读下一个后缀 .html,一看,哦,这是个超文本标记语言文件,俗称网页文件,这回认识了,也就不继续读下一个后缀了。若是所有后缀都看完了没有一个认识怎么办?此时就会把该文件当做默认类型进行处理了,一般来说,默认类型是 text/plain。据说在Apache 的配置文件中搜索DefaultType就能看到默认类型的明确定义了,但我却不知为何,没有找到。

哪些后缀 Apache 认识,哪些不认识?有一个名为 mime.types 的文件,其中记录着 Apache 认识的后缀。在 Ubuntu 下,该文件位于 /etc/mime.types,在 Windows下,该文件位于 C:/apache/conf/mime.types(类似这样的,注意Apache的安装路径)

利用: 因此,我们可以上传类似于 1.php.xxx 的文件绕过 Apache 的解析.

.htaccess

.htaccessApache的又一特色。一般来说,配置文件的作用范围都是全局的,但 Apache 提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess(分布式配置文件)。

要想使.htaccess文件生效,需要两个条件,一是在Apache的配置文件中写上:

AllowOverride All

二是Apache要加载mod_Rewrite模块。加载该模块,需要在Apache的配置文件中写上:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

.htaccess文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。
但我们这里只关心 .htaccess文件的一个作用——MIME类型修改。如在 .htaccess 文件中写入:

AddType application/x-httpd-php xxx

就成功地使该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。另一种写法是:

<FilesMatch "shell.jpg">
  SetHandler application/x-httpd-php
</FilesMatch>

0x04-3 Nginx 解析漏洞

该漏洞与nginxphp版本无关,属于用户配置不当造成的解析漏洞

原理: 由于nginx.conf的如下配置导致nginx把以.php结尾的文件交给fastcgi处理,为此可以构造http://ip/uploadfiles/test.png/.php (url结尾不一定是.php,任何服务器端不存在的php文件均可,比如a.php),其中test.png是我们上传的包含PHP代码的照片文件。

配置
server {
     listen       80;
     server_name  test.local;

     access_log  /work/www/logs/test.access.log  main;
     error_log  /work/www/logs/test.error.log;

     location / {
         root   /work/www/test;
         index  index.html index.htm index.php;
     }

     location ~ \.php$ {
         root           /work/www/test;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
         include        fastcgi_params;
         fastcgi_pass   unix:/tmp/php-fpm.sock;
     }
}

但是,在php-fpm.conf配置文件中的security.limit_extensions配置项限制了fastcgi要解析的文件类型(如果该选项未开启,默认只解析.php

cgi.fix_pathinfo

该选项位于配置文件php.ini中,默认值为1,表示开启。当php遇到文件路径/test.png/x.php时,若/test.png/x.php不存在,则会去掉最后的/x.php,然后判断/test.png是否存在,若存在,则把/test.png当做文件/test.png/x.php解析,如若test.png还不存在如果在其前面还有后缀,继续前面的步骤,以此类推。若是关闭该选项,访问/test.jpg/x.php 只会返回找不到文件。

security.limit_extensions

在我的配置文件中,它位于/etc/php-fpm.d/www.conf
这个选项开始是被注释了的也就是默认只允许执行php文件,可以在后面添加其它后缀,比如

security.limit_extensions .jpg .php

像这样添加 .jpg之后,.jpg文件也能以php格式来执行
修改了后需要 service php-fpm restart重启php

参考

https://www.freebuf.com/articles/web/265245.html