文件上传——漏洞笔记
一般文件上传的流程
- 前端选择文件,进行提交。
- 浏览器形成POST MultiPart报文发送到服务器。
- 服务器中间件接收到报文,解析后交给相关后端代码进行处理。
- 后端代码将上传的文件内容写入到临时文件中(PHP特有)。
- 写入到文件中,文件名为提交的文件名或以一定规则生成的文件名。
上传漏洞原理
当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件(asp/php/jsp等等)。
如果上传的目标目录没有限制执行权限,导致所上传的动态文件(比如webshell)可以正常执行并且可以访问,即造成了文件上传漏洞。
上传漏洞的必要条件
- 存在上传点
- 可以上传动态文件
- 上传目录有执行权限,并且上传的文件可以执行
- 可访问到上传的动态文件
上传检测流程
![image-20200903110543103](https://photobeds.oss-cn-shanghai.aliyuncs.com/uPic/image-20200903110543103.png)
客户端检测绕过
- JavaScript检测
- Flash AS脚本检测
- APP上传检测
客户端检测一般只检测文件扩展名。
服务器检测绕过
- 文件名检测
- MIME/TYPE检测
- 文件内容检测
- 简单文件头检测
- 完整文件结构检测
- 恶意文件内容检测
常见白名单MIME TYPE
扩展名 | MIME TYPE |
---|---|
jpg | image/jpeg |
png | image/png |
txt | text/plain |
zip | application/zip |
doc | application/msword |
一些绕过小技巧
-
文件参数多filename属性
文件上传过程中,如果存在WAF拦截一些扩展名,可以通过尝试多个filename属性,达到混淆效果
-
目录可控时,可以尝试使用目录穿越的方法
-
%00截断绕过
解析漏洞
-
IIS7.0/IIS7.5/Nginx<8.03+PHP fastcgi取值错误解析漏洞(配置错误)
开启了cgi.fix_pathinfo,如果开启以后,所执行文件不存在,会继续查找上一级文件是否存在。
index.php/id/2
并且未设置security.limit_extensions,该选项限制可以执行的文件类型。
实例:abcde.jpg/.php
-
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当作了脚本文件名。
-
Apache解析漏洞
Apache是从右向左开始判断解析,如果为不可识别解析,就再往左判断。
比如shell.php.owf.rar,最后被解析为shell.php。
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个shell.php.rara.jpg.png...(把知道的常见后缀都写上)去测试是否是合法后缀。
-
Apache解析漏洞(配置错误)
如果在Apache的conf文件中有如下配置
AddHandler application/x-httpd-php .php
则abcde.php.jpg也会被当作php去执行
如果在.htaccess中有如下配置,可以将扩展名.xxx当作php执行
AddType application/x-httpd-php xxx
-
IIS 5.x/6.0解析漏洞
-
上传文件名:abcde.asp;.jpg
服务器默认不解析;号后面的内容,因此abcde.asp;.jpg被当作了asp文件解析。
-
向xxx.asp目录下面的文件都当作asp文件解析
-
-
其他
在Windows环境下,xx.jpg[空格]?或xx.jpg.?这两类文件都是不允许存在的,若这样命名,Windows会默认除去空格或点,黑客可以通过抓包,在文件名否加一个空格或者点绕过黑名单,若上传成功,空格和点都会被Windows自动消除。
重绘图绕过
https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE
原理:
- 将正常图片用目标使用的图形库进行转换
- 寻找转换前后两次未变的部分
- 将未变部分替换为欲上传的webshell
- 将替换后的文件进行图像转换,看是否转换后仍存在替换后部分。
编辑器漏洞利用
知名的有 eweb、fck、ce等
- 获取编辑器的名称及版本信息
- 扫描爬行或字典扫描
- 观察图片的地址或编辑器特征
- 获取编辑器相关的漏洞
- 利用编辑器漏洞进行攻击测试
.htaccess文件上传漏洞
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,通过htaccess文件,可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
需要用到的代码如下:
<FileMatch "yourfilename">
SetHandler application/x-httpd-php
</FileMatch>
通过.htaccess文件,调用php的解析器解析一个文件只要包含“yourfilename”这个字符串的任意文件。这个“yourfilename”的内容如果是一句话木马,即可利用菜刀进行连接。
实战意义:
- 如果存在可以上传的.htaccess文件,就直接利用规则解析
- 如果存在修改.htaccess文件权限,修改解析规则