专栏首页ChaMd5安全团队文件上传漏洞的一些总结

文件上传漏洞的一些总结

0x00 前言

在跟p猫的py交易后,写下了这篇文章,根据之前写文章后表哥给予的一些改进建议,尽量在这篇文章中写得更加详细。因为本人技术水平有限菜的要死,所以可能很多方面写不到位,希望可以帮助一些入门的新手进一步提升,也希望更多的表哥可以给予一些补充让本人学到更骚的套路,话不多说,这次文章主要讲解任意文件上传漏洞。

0x01 漏洞原理

程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是只考虑在前端通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而攻击者访问这些恶意脚本对包含的恶意代码动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

0x02 漏洞成因

  1. 未过滤或Web前段过滤被绕过
  2. 文件检测被绕过
  3. 中间件解析
  4. 不完善的黑名单扩展名
  5. 文件路径截断
  6. HTTP不安全方法(PUT协议)

0x03 漏洞成因分析及案例

1、 未过滤或者web前端过滤被绕过

未过滤是没有对文件上传格式做限制,前端绕过是指当前页面中js对上传文件做限制,可通过HTTP抓包工具进行改包上传。

这类相对好理解,前部分是可以任意上传文件,后部分是因为只是前端限制,只用上传可以上传的文件,然后抓包对后缀进行修改就可以成功。

2、文件内容检测被绕过

检测CONTENT-TYPE内容(判断是否为特定数据类型),检测文件头,检测文件扩展功能相关内容。

(1) Content-Type绕过

这里看到让我们上传一个php文件,但是上传后显示[非图片文件]

这里我使用burpsuite进行截包然后重放。

发现并没用但是将Content-Type:改为 image/jpeg则成功上传

可以看到这里只是对content-Type进行验证,我们只需要修改成图片的格式就上传成功。

(2) 文件头检测绕过

//检查是否图片
if(function_exists('getimagesize')) {
    $tmp_imagesize = @getimagesize($new_name);
    list($tmp_width, $tmp_height, $tmp_type) = (array)$tmp_imagesize;
    $tmp_size = $tmp_width * $tmp_height;
    if($tmp_size > 16777216 || $tmp_size < 4 || empty($tmp_type) || strpos($tmp_imagesize['mime'], 'flash') > 0) {
        @unlink($new_name);
        return cplang('only_allows_upload_file_types');
    }
}

这是php的一串检查图片代码,使用getimagesize函数无法判断其图片是无效的

我们只需要再上传的文件头加入GIF89a 便可以欺骗服务器认为我们的文件是图片。

这里举几个常见的文件头对应关系:

(1) .JPEG;.JPE;.JPG,"JPGGraphic File"

(2) .gif,"GIF 89A"

(3) .zip,"Zip Compressed"

(4) .doc;.xls;.xlt;.ppt;.apr,"MS CompoundDocument v1 or Lotus Approach APRfile"

3、中间件解析

由于中间件本身的缺陷,再对上传文件进行解析时会出现一些不可预料的错误从而导致被利用进行上传绕过。

(1) IIS6.0解析漏洞

第一种,当建立*.asp、*.asa格式的文件夹时,其目录下任意文件都会被iis当作asp文件来解析。

例如:创建xxx.asp目录那么在xxx.asp目录下如果存在1.txt文件会被当做1.asp文件来执行。

第二种,在IIS6.0下分号后的不被解析。

例如:xxx.asp;.jpg会被服务器看作为xxx.asp文件

(2) IIS7.0/7.5畸形解析漏洞

IIS7.0/7.5中:任意文件名/任意文件名.php就会被解析为php

(3) Apache解析漏洞

在Apache 1.x和Apache 2.x中存在解析漏洞。

Apache在解析文件时有一个原则,当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。

如:1.php.rar.sa.xs就会被解析为php,可以据此来绕过文件名限制

(4) Nginx<8.03畸形解析漏洞

在默认Fast-CGI开启的情况下上传一个xxx.jpg,内容为<?php eval($POST[‘cmd’])?>的文件然后访问xxx.jpg/.php在该目录下就会生成一句话木马文件xxx.php。

(5) PHP CGI解析漏洞

当php的配置文件中的选项cgi.fix_pathinfo= 1开启时,当访问http://www.example.com/xxx.txt/xxx.php时,若xxx.php不存在,则PHP会递归向前解析,将xxx.txt当作php脚本来解析

4、不完善的黑名单扩展名

因为程序员在开发文件上传时加入了不允许上传类型的黑名单,但是黑名单内容并不完善,这时候我们可以利用一些其他扩展名绕过黑名单限制,这里就不进行详细的赘述了,这里列举一些可用于绕过的文件名:

PHP: php2、php3、php5、phtml、pht

ASP: aspx、ascx、ashx、cer、asa

JSP: jspx

5、文件路径截断

(1)php%00截断

利用条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态

详情:CVE-2006-7243

(2)Nginx<8.03空字节代码执行漏洞

影响版本:0.5,0.6,0.7<=0.7.65,0.8<=0.8.37

Nginx在图片中嵌入PHP代码然后访问xxx.jpg%00.php来执行其中的代码

(3)截断后缀上传

部分上传功能在对后缀名进行验证时存在缺陷,导致在文件写入过程中产生错误,导致可通过十六进制截断符(%00)对后缀进行截断。

例如:

POST /Upload HTTP/1.1
Host: www.example.com
Proxy-Connection: keep-alive
Content-Length: 363
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5YpmA9D3wW207kB7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8

------WebKitFormBoundary5YpmA9D3wW207kB7
Content-Disposition: form-data; name="uploadfile"; filename="xxx.php%00.jpg"
Content-Type: image/jpg

<?php eval($POST[‘CMD’]);?>
------WebKitFormBoundary5YpmA9D3wW207kB7--

上传处理时将对检测到%00(这里需要对%00进行urldecode)并对.jpg字符串进行截断删除,最终文件名为xxx.jsp导致可成功上传动态脚本到服务器上

6、HTTP不安全方法(PUT协议)

(1)WebDav漏洞

WebDav是一种基于HTTP1.1协议的通信协议,它扩展了HTTP协议。在开启WebDav后若 支持PUT、Move、Copy、Delete等方法,就会存在安全隐患。

测试流程:

首先提交options 请求看服务器是否支持此类方法

OPTIONS /HTTP/1.1

Host:www.example.com

通过PUT方法上传脚本文件

PUT /xxx.txtHTTP/1.1

Host:www.example.com

Content-Length:30

<?phpeval($POST[‘cmd’]);?>

通过move或者copy方法移动文件

COPY /xxx.txtHTTP/1.1

Host:www.example.com

Destination:http://www.example.com/cmd.asp

(2)去年发布的tomcat漏洞

http://blog.csdn.net/u011499747/article/details/78108240

0x04 其他的上传利用

1、结合文件包含

很多时候网站检测的过于严格,我们只能上传白名单的文件格式,这时我们可以尝试去看看网站是否存在一些文件包含漏洞,结合我们上传的文件进行联合利用。

2、黑白名单共存

之前我遇到过这样一个网站,就是黑白名单共存。该网站的架构是这样的,在后台有个地方是可以设置上传的白名单内容,在代码层面又含有黑名单检测。当时猜测他网站的判断是这样的:

if(正则匹配在白名单中==正则匹配不在黑名单中)

上传成功

Else:

上传失败

于是我清空了白名单的内容,然后上传了在黑名单中的文件格式于是,代码false==false 上传成功。

3、利用源代码进行文件上传

很多时候我们通过各种源码泄露,例如:.svn、.git、网站备份、任意文件下载等等获取到了网站的源码,我们可以进行代码审计寻找文件上传的接口,我之前测试过的很多网站他们的代码都有一个api接口用来处理上传的文件,而黑白名单仅仅是进行了上传检测,我们可以在本地直接构造一个上传页面然后调用这个api接口直接上传文件解析。

4、操作系统解析

由于windows会将文件的后缀中的空格以及点进行过滤,如果遇到是黑名单校验的,如限制不允许上传PHP文件,而系统又是windows系统,那么我们可以上传xx.php ,或者xx.php.,通过这种方式就可以绕过黑名单检验的文件上传!

5、htaccess文件解析

如果Apache中.htaccess可被执行并可被上传,那么可以尝试在.htaccess中写入:

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

然后再上传xxx.jpg的木马,这样xxx.jpg就可被解析为PHP文件了。

0x05 总结

作为获取shell最直接的方法,上传地方检测是最为严密的,我们需要想方设法的去尝试各种思路才能绕过各种限制。随着信息安全发展的不断壮大,文件上传也越来越难以被利用,但是在很多系统管理层后台是并没有限制的,看上去越强壮的网站内部越脆弱不堪。我们需要细心挖掘每一个点并加以利用。比起基础来说更多的是经验,只有经验不断增加才会有更多的思路拓展。

本文分享自微信公众号 - ChaMd5安全团队(chamd5sec),作者:Daybreak

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Web应用渗透测试-本地文件包含

    0x01 前言 本文的目的在于帮助网络安全爱好者们去识别和测试LFI漏洞,通过研究去探究LFI渗透测试技术以及LFI漏洞通常在哪里被发现。如果你有更好的奇淫技巧...

    ChaMd5安全团队
  • blackhat议题深入 | phar反序列化

    在Blackhat2018,来自Secarma的安全研究员Sam Thomas讲述了一种攻击PHP应用的新方式,利用这种方法可以在不使用unserialize(...

    ChaMd5安全团队
  • CryptoShield勒索病毒分析

    这篇文章主要分析一下Cryptoshield,来自于RITEST RIG EK的一个勒索病毒。病毒样本可以从这里得到: http://www.malware-t...

    ChaMd5安全团队
  • 漏洞复现|文件上传漏洞利用方式与原理概述

    文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马...

    陈殷
  • 【逻辑漏洞】通过条件竞争进行文件上传

    基本概念:竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

    一名白帽的成长史
  • 文件上传漏洞另类绕过技巧及挖掘案例全汇总

    文件上传漏洞作为获取服务器权限最快的方式,虽然相关资料很多,但很多人对上传校验方式、如何针对性绕过检测、哪种上传和解析的场景会产生危害等还是比较模糊。本文作一...

    Jayway
  • [红日安全]Web安全Day5 - 任意文件上传实战攻防

    大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ...

    红日安全
  • 文件解析漏洞

    是指中间件(Apache、nginx、iis等)在解析文件时出现了漏洞,从而,黑客可以利用该漏洞实现非法文件的解析。

    洛米唯熊
  • PHP-文件上传

    ​ 默认情况下,表单传递是字符流,不能传递二进制流,通过设置表单的enctype属性传递复合数据。

    cwl_java
  • 看图说话:文件上传(File Upload)漏洞示例

    作为测试人员,我们常常听到“安全测试”这个词,但鲜有人真正做过安全测试。从我们的职责“保障质量”角度来说,说是一种“失职”也不为过。那么安全测试是什么,究竟怎么...

    张树臣

扫码关注云+社区

领取腾讯云代金券