文件上传漏洞学习笔记
对文件上传的一个笔记总结。
前言&&参考
参考链接:
- Upload-lab练习
- fuping-upload-labs writeup
- Misaki's 文件上传漏洞
- 先知社区-浅谈常见的文件上传的检测方式与绕过方法
- 先知社区-Upload-labs 20关通关笔记
- 安全客-部分中间件漏洞总结
- 文件上传漏洞是什么?要怎样防御文件上传的漏洞攻击?
前端检测
前端限制是最不靠谱的限制办法。
解决办法:
- html页面删除检测javascript检测函数
- 禁用javascript脚本
- 先将恶意脚本后缀改为前端脚本允许的后缀。然后抓包再修改为php/asp等
后端检测
后端限制方式较多,有检测后缀黑名单和白名单,检测内容等。
检查后缀黑名单
上传特殊可解析后缀
php5 phtml等,但前提是要目标服务器有相应的配置才行。
上传.htaccess
适用于:Apache服务器
前提:
- 要求目标服务器,没有将.htaccess加入为黑名单。
- 要求服务器不将上传文件重命名。
限制较多,能用的场景较少。。
Nginx应该也可以使用,但前提是要求服务器有做相应的配置。例如:使Nginx服务器支持.htaccess的方法,不过服务器做什么配置,不是由我们说了算的啊,还是鸡肋。
.htaccess
内容如下
1 | SetHandler application/x-httpd-php |
将所有类型的文件,都可以当成php文件解析。
后缀大小写、加空格、加点绕过
当服务器没有对后缀大小写、空格、.
进行过滤时,可以使用。因为windows会忽略文件末尾的.和空格。
例如shell.php
改名成
- shell.pHp
- shell.php <这里有个空格
- shell.php. 加多一个点
- shell.php. . 多加一个空格和点(如果服务器只校验一次。
- shell.php. .点空格和上面一致
::$DATA绕过
::$DATA文件流绕过(仅限Windows)
NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。
所有当上传shell.php::$DATA
,服务器实际上上传之后保存的文件名是shell.php
而不是shell.php::$data
。
双写绕过
如果目标服务器会将上传文件的敏感后缀名去空,那就可以考虑双写绕过。
.pphphp
检测后缀白名单
MIME绕过
抓包修改MIME类型为允许的类型
1 | jpg- image/jpeg |
等等。。
%00截断
00截断是利用了php的一个漏洞。漏洞编号为CVE-2015-2348
。使用前提要求较为严格。
- 服务器
php
版本小于5.3
- 魔术引号
gpc
处于关闭状态,没有使用转义函数 - 要求上传路径可控
这个上传路径是通过GET
型去传值的,直接在URL中显示。所以使用url编码的%00
对其进行截断。
0x00截断
0x00
截断和%00
截断一样的,只不过区别在与0x00
是用与上传路径为POST型的时候。
在../upload/
后面写shell2.php+
文件名随意,+
在16进制中代表0x2b
方便我们在hex显示时,对其进行定位修改。
将在hex显示的值中2b
修改为00
,改好之后会发现其实没什么区别。只是将+号去掉了的样子。但是发送包后会发现是上传成功的。
上传后的文件名,会发现有一个特殊符号,这就是我们的0x00
对其进行蚁剑/菜刀等进行连接时文件名只取%00/0x00
之前的字符。
检测文件内容
文件头检查(file magic number)
file magic number好像是国外的说法,国内大部分好像都是直接说改文件头?如果只检查文件的前几个字节。那就直接添加图片的文件头信息就好了。
添加gif89a,改成其他的也行。不过gif89a好记。
二次渲染
二次渲染会将上传后的图片马重新压缩一次,会将原有的php代码消除。
绕过思路:需要用一张GIF图,生成一个图片马后,上传成功后下载下来,与原来的图片马进行HEX对比,找到相同的地方,在那里插入一句话。(用GIF是因为GIF比JPG和PNG容易。
中间件文件解析漏洞
可以通过观察IIS版本来猜测大概的系统版本
IIS版本
- IIS6.0 2003
- IIS7.0/7.5 2008
- IIS8.0-8.5 2012
- IIS10 2016
IIS 5.x/6.0解析漏洞
目录解析
目录解析,在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
例如创建了一个目录xx.asp
那么可以上传一个图片马。
1 | /xx.asp/shell.jpg |
文件解析
在IIS6.0下,分号后面的不被解析。
上传一个文件shell.asp;.jpg。
1 | shell.asp;.jpg |
因为分号后面的IIS不会识别,所以就会被解析成shell.asp
IIS6.0中 asa,cer,cdx也能被当成asp解析
IIS 7.0/7.5/Nginx <8.03畸形解析漏洞
好像在apache中也会?
在默认Fast-CGI开启状况下,上传一个图片马shell.jpg,内容为
1 | 'shell.php','w'),'<?php eval($_POST[a])?>'); fwrite(fopen( |
然后访问shell.jpg/.php,在这个目录下就会生成一句话木马shell.php
Apache文件解析漏洞
Apache从右向左去读文件后缀,不认识的后缀会丢掉。
假设有一个文件名为shell.php.zxc.wwc
后面两种不认识会被舍弃掉,所以就会被识别成shell.php
。
Apache多后缀解析后缀
Apache Httpd支持一个文件拥有多个后缀,不同的后缀执行不同的命令,也就是说当我们上传的文件中只要后缀名含有php,该文件就可以被解析成php文件,利用Apache httpd这个特性,就可以绕过上传文件的白名单。
属于管理员配置不当造成的漏洞。如果上传shell.php.jpg
的话将会被apache识别成shell.php
修复
- apache配置文件,禁止.php.这样的文件执行 禁止.php文件执行
- 使用SetHandler,写好正则
FCK文件编辑器漏洞
FCK文件编辑器漏洞2.4.3/2.6.2这里都是用了IIS6.0的解析漏洞。而且FCK文件编辑器的上传路径是可控的。所以很简单的就可以利用成功了。
生成图片马
cmd 生成图片马
1 | copy 1.jpg/b+1.php/a 2.jpg |
linux
1 | echo '<?php eval($_POST[a])?>' > 1.jpg |
防御方式
文件上传漏洞防御方式:
- 上传目录禁止执行,浏览权限
- 判断文件类型(最好白名单
- 使用随机数改写文件名和文件路径
- 单独设置文件服务器
- 二次渲染图片
- 及时更新中间件
- 关闭不必要的配置如nginx的畸形解析漏洞中的Fast-cgi
- 只允许访问特定类型的文件
- 指定特定扩展名的文件的处理方式,如.py,.php,.asp用纯文本明文显示。
AddType text/plain .py .php