07-04 【VULNERABLITY】文件上传学习总结

栏目: 服务器 · Apache · 发布时间: 6年前

内容简介:通常此类检测会在js文件中有一个检测的函数,一般对上传的文件后缀名做检测,例如仅允许上传png,jpg,gif等类型的文件,如果检测到的文件后缀名不是在这些名单内,则不向服务器端传输文件内容。这类检测也是最容易绕过的检测,可以使用firebug之类的插件把它禁掉或者通过burp之类的代理工具进行绕过提交。使用burp,上传时提供一个白名单内的后缀,通过burp拦包,并修改后缀后提交
  1. 客户端javascript检测(检测文件扩展名为主)
  2. 服务端MIME类型检测(检测Content-type内容)
  3. 服务端目录路劲检测(检测跟path相关的内容)
  4. 服务端文件扩展名检测(检测跟文件后缀相关的内容)
  5. 服务端文件内容检测(检测内容是否合法或含有恶意代码)

客户端javascript检测

通常此类检测会在js文件中有一个检测的函数,一般对上传的文件后缀名做检测,例如仅允许上传png,jpg,gif等类型的文件,如果检测到的文件后缀名不是在这些名单内,则不向服务器端传输文件内容。

这类检测也是最容易绕过的检测,可以使用firebug之类的插件把它禁掉或者通过burp之类的代理 工具 进行绕过提交。

使用burp,上传时提供一个白名单内的后缀,通过burp拦包,并修改后缀后提交

服务端检测绕过(MIME类型检测)

<?php
	if($_FILES['userfile']['type'] != "image/gif") { //检测Content-type
		echo "Sorry, we only allow uploading GIF images";
		exit;
	}
	$uploaddir = 'uploads/';
	$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
	if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 	  {
		echo "File is valid, and was successfully uploaded.\n";
	} else {
		echo "File uploading failed.\n";
	}
?>

上面为 php 后端检测MIME类型的一个例子

通过判断 $_FILES['userfile']['type'] != "image/gif" 来保证上传的类型为gif类型的文件。

绕过这一类型的检测,可以通过burp拦包,将原 Content-Type 类型该为符合要求的 image/gif 类型。

服务端检测绕过(目录路劲检测)

有一些web应用程序有多个文件夹用来存储图片文件,所以为了标识上传的图片是属于哪个文件夹的,上传文件时会带上文件存储路劲。而此时如果对文件目录路劲检测不够完全,可以通过截断攻击。(如%00,windows下%80-%90)

如上传时提供存储路劲为 image/20160704/ 可以通过修改为 image/20160704/evil.php%00 来达到截断目的。后端程序会将该路劲连接为 image/20160704/evil.php%00filename.gif 00截断导致最终存储的文件名为evil.php

服务器端检测绕过(文件扩展名检测)

  1. 黑名单检测

    黑名单检测通常会有一个文件后缀名黑名单(例如html|htm|php|php2|php3|php4|php5…)

    但是通常黑名单检测不能包含所有的恶意脚本后缀,防护难度会比较大,推荐使用白名单

    绕过的方法:

evil.asp%00.jpg

.htaccess文件攻击

如果黑名单中未包含.htaccess后缀的可以通过重写解析配置来达到解析的效果

针对php,上传自定义.htaccess

<FilesMatch "haha">
SetHandler application/x-httpd-php
</FilesMatch>

同目录有个我们上传一个只有文件名并包含字符串”haha”,但是却无任何扩展名的文件

里面的内容是 php 一句话木马,通过菜刀连接可以解析php

成因:

在 PHP manual 中提到了下面一段话

move_uploaded_file section, there is a warning which states ‘If the destination file already exists, it will be overwritten.’

如果 PHP 安全没配置好

就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的

这样就能任意定义解析名单了

  • 解析漏洞(apache解析漏洞,iis6.0解析漏洞,nginx解析漏洞)

apache解析漏洞

apache是从右到左开始判断解析,如果最右的后缀无法解析,则尝试解析后一个后缀

iis6.0解析漏洞

.asp

iis7.0/7.5解析漏洞

对于php有一个类似Nginx的解析漏洞 evil.jpg/evil.php 解析evil.jpg中的php代码,这个漏洞成因在于php-cgi的漏洞

nginx解析漏洞

  • 将php文件换成其他可以通过的文件后缀,访问的时候在后面加上/.php,即evil.jpg/.php,evil.jpg会解析为php的格式
  • %00截断
  • 其他方式
    提交前将filename=”evil.php”该为”evil.php”.jpg”
  1. 白名单检测
  • 0x00截断绕过
  • 解析漏洞绕过(文件名不被重写)

服务器端检测绕过(文件内容检测)

图像类的文件内容检测

  • 文件幻数检测(图片头格式检测)

    jpg内容头value= FF D8 FF E0 00 10 4A 46 49 46

    gif内容头value= 47 49 46 38 39 61

    png内容头value= 89 50 4E 47

在文件头后加上一句话木马就能绕过

  • 文件相关信息检测

图像文件相关信息检测常用的就是php的getimagesize()函数,可以通过修改图片的注释区(data区)插入一句话代码,如下:

GIF89a
(...some binary data for image...)
<?php phpinfo(); ?>
(... skipping the rest of binary data ...)
  • 文件加载检测

调用API或函数去进行文件加载测试,常见的是图像渲染测试,二次渲染,可以通过上传恶意文件,再下载下来,diff一下找到不变的位置插入一句话木马,但成功率不高

总结

轻量级检测绕过攻击

  1. 绕过 javascript 对扩展名的检测
    <用 burp 之类的反向代理工具直接 POST 数据包到服务端,绕过前端检测>
  2. 绕过服务端对 http request 包 MIME 类型检测
    <用 burp 之类的反向代理工具伪造 POST 数据包到服务端,绕过 MIME 检测>

路径/扩展名检测绕过攻击

  1. 黑名单绕过

    文件名大小写绕过

    名单列表绕过

    特殊文件名绕过

    0x00 截断绕过

    .htaccess 文件攻击

    本地包含漏洞

    Apache 解析漏洞

    IIS 解析漏洞

    Nginx 解析漏洞

  2. 白名单绕过

    0x00 截断绕过

    本地文件包含漏洞

    IIS 解析漏洞

    Nginx 解析漏洞

  3. 文件内容检测绕过攻击

以上所述就是小编给大家介绍的《07-04 【VULNERABLITY】文件上传学习总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Math Adventures with Python

Math Adventures with Python

Peter Farrell / No Starch Press / 2018-11-13 / GBP 24.99

Learn math by getting creative with code! Use the Python programming language to transform learning high school-level math topics like algebra, geometry, trigonometry, and calculus! In Math Adventu......一起来看看 《Math Adventures with Python》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器