文件上传漏洞解析及简单绕过技巧

文件上传漏洞简介


什么是文件上传漏洞?

简单来说就是,攻击者向服务器上上传了服务器可以解析的动态脚本文件,这里上传的文件可以是木马,病毒,恶意脚本或者Webshell等

这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果

为什么会产生文件上传漏洞?

这是因为,开发人员由于大意或者安全意识不足,在上传点,未对上传的文件进行严格的校验,才导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件

引入概念


  什么是webshell?

看网上很多人说webshell是网站后门

个人理解:我们上传的webshell文件可以称之为一种后门文件,而什么是shell?shell应该是一种权限,那么webshell很明显就是我们得到了网站权限,这里的权限已经不是单单的从浏览器访问权限,而是部分的服务器权限

什么是getshell?

顾名思义,得到权限,平时说的网站呗getshell,就是被非授权人员得到了权限

什么是反弹shell?

反弹shell,这个我是这样认为的,比如我们要入侵该网站内网中的一台电脑,但是只有内网地址我们我发获取权限,这个时候就可以通过精心构造的语法,让那台电脑反过来连我们,于是乎就获得了一个反弹shell

一句话木马

Asp一句话:<%eval request(“xxx”)%>

Php 一句话:

Aspx一句话:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>

JSP一句话:<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%> 

什么是web容器?

web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)

什么是文件解析?

当服务器接收到一个HTTP请求的时候,web容器首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名

服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果web容器找不到可以处理此类文件的应用程序,那么web容器将直接把这个文件返还给客户端

文件解析漏洞

攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们首先来了解一下解析漏洞,这样才能更深入地了解上传漏洞,并加以防范
常见的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要讲IIS、Apache、Nginx容器

IIS 6.0在解析文件时存在以下两个解析漏洞

IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll

IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

    test.asp;.jpg   他将当做asp进行解析

    test.asp/123.jpg 他将当做asp进行解析

文件上传漏洞解析及简单绕过技巧_第1张图片

Apache解析漏洞

Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,如xxx.php.owf.rar ,”.owf”和”.rar”这两种后缀是apache解析不了的,apache就会把xxx.php.owf.rar解析成php。

怎么去判断是不是合法的后缀就是这个漏洞利用关键,测试时把常见的后缀都写上,去测试是不是合法,任意不识别的后缀,逐级向上识别。

有些程序开发人员在上传文件时,判断文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到WebShell

Nginx解析漏洞

Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设SCRIPT_FILENAME。

当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:

PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.

也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析

文件上传漏洞解析及简单绕过技巧_第2张图片

简单绕过技巧


1.绕过前端验证

这种过滤方式其实跟没有过滤,没什么区别。

通过前端js脚本对用户上传文件进行检测,可以直接上传正常后缀文件,抓包修改后缀名即可绕过

2.Content-Type方式绕过

如何绕过Content-Type (内容类型)和文件头检测,这个时候我们就要去制作一个图片马了

图片马的制作很简单,写一个一句话木马放在txt文件然后找一张你喜欢的图片(注意文件大小,越小越好)

然后打开cmd         copy a.jpg/b + 1.txt 123.jpg    (a.jpg1.txt 合并为123.jpg   (注:这个是效果))

图片马可以很好的绕过内容类型和文件头

3.后端黑名单绕过

前面讲到过黑名单绕过机制不靠谱,我们看看这地方的过滤怎么玩的。很明显这个过滤不严谨,

php中,如果默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php

4.大小写绕过

我们可以通过大小写去绕过。WEB容器除非非常老的版本,不然都不区分大小写

5.文件后缀(空)绕过

在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么phpphp ,当然是不一样的

6.文件后缀(点)绕过

windows有一个特性,会自动去掉后缀名最后的‘.’

7.双写绕过

这种方式感觉也是相当古老了吧,至于要构造后缀名phphpp即可

8.构造文件后缀绕过

这种方式感觉需要在知道源码的情况下,在做代码审计的时候可以根据过滤规则,尝试是否可以构造处可绕过的后缀名

9.::$DATA(Windows文件流绕过)

(这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。)

我们肯定不懂这个意思是什么,我们先在CMD运行一个(藏文件的小福利)

echo abcd>>a.txt:b.txt  abcd写入a.txt:b.txt  很明显生成一个a.txt,但是却没有内容

文件上传漏洞解析及简单绕过技巧_第3张图片

然后再试试c.txt::$DATA 

::$DATA就是默认不修改文件流的情况

所以生成一个正常的c.txt 

文件上传漏洞解析及简单绕过技巧_第4张图片

利用windows特性,可在后缀名中加” ::$DATA”绕过

10. .htaccess文件绕过

.htaccess是什么? 

.htaccess文件也被成为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

.htaccess功能:

文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表

 

很可惜,这么一个强大的功能默认是不开启的,虽然这个默认不是开启的,但是开启了伪静态的网站都会开启,所以遇到伪静态可以直接尝试

如何配置.htaccess文件?

例如:AddType application/x-httpd-php .jpg    这个指令代表着.jpg文件会当做php来解析

但是发现,windows无法讲文件重命名为.htaccess文件怎么办?

可以使用cmd指令,如下图

11.白名单绕过之00截断

了解%00实际上我们要先了解0x000x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了

这有什么用呢?

在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,在没有解析漏洞的情况下我们该怎么办?

JPG格式并不会被解析,那么我们需要绕过上传过滤。

假如我写了1.php%00.jpg  传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php

%00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符

针对get请求我们可以使用%00,但是针对post请求呢?post请求并不会进行url解码,我们可以使用burp抓包,修改hex

12.条件竞争

说白了就是看你访问的快,还是服务器删除的快

这种情况下,后台并不会对文件进行判断,而是等你上传之后,服务器对文件进行判断,如果是有害文件则会被删除

那么这种情况下我们上传的木马文件肯定是会被删除的

怎么办?

马生马呗,php代码如下

';file_put_contents('1.php',$a)?>

如果觉得自己手速够快的话,你可以手工,不确定的话,可以用python写脚本,自动访问我们上传的页面和即将生成的页面

也可以shiyongburp重放或者爆破模块跑包

13.其他方式

剩下的可以根据web容器的解析漏洞来了

 

你可能感兴趣的:(web渗透学习笔记)