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

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

内容简介:通常此类检测会在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】文件上传学习总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Looking For a Challenge

Looking For a Challenge

the University of Warsaw / the University of Warsaw / 2012-11 / 0

LOOKING FOR PROGRAMMING CHALLENGES? Then this book is for you! Whether it's the feeling of great satisfaction from solving a complex problem set, or the frustration of being unable to solve a task,......一起来看看 《Looking For a Challenge》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

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

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具