文件上传——漏洞笔记

一般文件上传的流程

  1. 前端选择文件,进行提交。
  2. 浏览器形成POST MultiPart报文发送到服务器。
  3. 服务器中间件接收到报文,解析后交给相关后端代码进行处理。
  4. 后端代码将上传的文件内容写入到临时文件中(PHP特有)。
  5. 写入到文件中,文件名为提交的文件名或以一定规则生成的文件名。

上传漏洞原理

​ 当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件(asp/php/jsp等等)。

​ 如果上传的目标目录没有限制执行权限,导致所上传的动态文件(比如webshell)可以正常执行并且可以访问,即造成了文件上传漏洞。

上传漏洞的必要条件

  • 存在上传点
  • 可以上传动态文件
  • 上传目录有执行权限,并且上传的文件可以执行
  • 可访问到上传的动态文件

上传检测流程

image-20200903110543103

客户端检测绕过

  1. JavaScript检测
  2. Flash AS脚本检测
  3. APP上传检测

客户端检测一般只检测文件扩展名。

服务器检测绕过

  1. 文件名检测
  2. MIME/TYPE检测
  3. 文件内容检测
    1. 简单文件头检测
    2. 完整文件结构检测
    3. 恶意文件内容检测

常见白名单MIME TYPE

扩展名 MIME TYPE
jpg image/jpeg
png image/png
txt text/plain
zip application/zip
doc application/msword

一些绕过小技巧

  1. 文件参数多filename属性

    文件上传过程中,如果存在WAF拦截一些扩展名,可以通过尝试多个filename属性,达到混淆效果

  2. 目录可控时,可以尝试使用目录穿越的方法

  3. %00截断绕过

解析漏洞

  1. IIS7.0/IIS7.5/Nginx<8.03+PHP fastcgi取值错误解析漏洞(配置错误)

    开启了cgi.fix_pathinfo,如果开启以后,所执行文件不存在,会继续查找上一级文件是否存在。

    index.php/id/2

    并且未设置security.limit_extensions,该选项限制可以执行的文件类型。

    实例:abcde.jpg/.php

  2. Nginx文件名逻辑漏洞(CVE-2013-4547)

    影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

    上传一个以空格(%20)为结尾的文件,例如“abcde.jpg ”

    当访问abcde.jpg%20%00.php

    一般的php匹配正则:\.php$

    存在漏洞时,Nginx将abcde.jpg%20当作了脚本文件名。

  3. Apache解析漏洞

    Apache是从右向左开始判断解析,如果为不可识别解析,就再往左判断。

    比如shell.php.owf.rar,最后被解析为shell.php。

    如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个shell.php.rara.jpg.png...(把知道的常见后缀都写上)去测试是否是合法后缀。

  4. Apache解析漏洞(配置错误)

    如果在Apache的conf文件中有如下配置

    AddHandler application/x-httpd-php .php

    则abcde.php.jpg也会被当作php去执行

    如果在.htaccess中有如下配置,可以将扩展名.xxx当作php执行

    AddType application/x-httpd-php xxx

  5. IIS 5.x/6.0解析漏洞

    1. 上传文件名:abcde.asp;.jpg

      服务器默认不解析;号后面的内容,因此abcde.asp;.jpg被当作了asp文件解析。

    2. 向xxx.asp目录下面的文件都当作asp文件解析

  6. 其他

    在Windows环境下,xx.jpg[空格]?或xx.jpg.?这两类文件都是不允许存在的,若这样命名,Windows会默认除去空格或点,黑客可以通过抓包,在文件名否加一个空格或者点绕过黑名单,若上传成功,空格和点都会被Windows自动消除。

重绘图绕过

https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE

原理:

  1. 将正常图片用目标使用的图形库进行转换
  2. 寻找转换前后两次未变的部分
  3. 将未变部分替换为欲上传的webshell
  4. 将替换后的文件进行图像转换,看是否转换后仍存在替换后部分。

编辑器漏洞利用

知名的有 eweb、fck、ce等

  1. 获取编辑器的名称及版本信息
    1. 扫描爬行或字典扫描
    2. 观察图片的地址或编辑器特征
  2. 获取编辑器相关的漏洞
  3. 利用编辑器漏洞进行攻击测试

.htaccess文件上传漏洞

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,通过htaccess文件,可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

需要用到的代码如下:

<FileMatch "yourfilename">
    SetHandler application/x-httpd-php
</FileMatch>

通过.htaccess文件,调用php的解析器解析一个文件只要包含“yourfilename”这个字符串的任意文件。这个“yourfilename”的内容如果是一句话木马,即可利用菜刀进行连接。

实战意义:

  1. 如果存在可以上传的.htaccess文件,就直接利用规则解析
  2. 如果存在修改.htaccess文件权限,修改解析规则

posted on 2021-05-18 11:15  tech_lee  阅读(146)  评论(0编辑  收藏  举报

导航