文件上传

0x01、文件上传

文件上传是Web应用中经常出现的功能,它允许用户上传文件到服务器并保存到特定位置。文件上传漏洞指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。

0x02、文件上传漏洞的利用方法

1、上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行;
2、上传文件FLASH策略文件crossdomain.xml,以此来控制Flash在该域下的行为;
3、上传文件是病毒、木马文件,攻击者用以诱骗用户或管理员下载执行;
4、上传文件是钓鱼图片或为包含了脚本的图片,某些浏览器会作为脚本执行,实施钓鱼或欺诈;

0x03、文件上传漏洞的原因

1、文件上传时检查不严;一些应用在文件上传时没有进行文件格式检查,导致攻击者可以直接上传恶意文件。这种现在已经挺少的了。
2、文件上传后修改文件名时处理不当;一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。
3、使用第三方插件时引入;好多应用都引用了带有文件上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。

0x04、文件上传漏洞挖掘

1、白盒测试:大部分web应用都是基于框架来写的,上传的话都是调用同一个上传类,而上传函数只用move_uploaded_file(),所以我们在代码审计的时候,最直接快速的方法就是直接搜索move_uploaded_file()函数,再去查看调用此函数进行文件上传的代码是否存在上面所说的漏洞。
2、黑盒测试:对一些需要上传文件、图片等地方进行尝试

经常出现在一些上传文件、头像、图片等验证不严谨的地方。在我们平时的CTF比赛中也是经常遇到的题型。

0x05、上传绕过方法

1、前台脚本检测扩展名,比较简单
2、Content-Type检测文件类型,修改数据包中文件的Content-Type类型(如改为:image/gif),使其符合白名单的规则,达到上传的目的
3、文件系统00截断,通过抓包截断将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的。
4、服务器端扩展名检测黑名单,将一句话木马的文件名【evil.php】,改成【evil.php.abc】(奇怪的不被解析的后缀名都行)。首先,服务器验证文件扩展名的时候,验证的是【.abc】,只要该扩展名符合服务器端黑白名单规则,即可上传。另外,当在浏览器端访问该文件时,Apache如果解析不了【.abc】扩展名,会向前寻找可解析的扩展名,即【.php】
5、 JS检测上传文件,在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现。
6、重写解析规则,
在可以上传.htaccess文件时,先上传.htaccess文件,覆盖掉原先的.htaccess文件;再上传【evil.gif】文件。使用如下的.htaccess语句,即可将【evil.gif】文件以php脚本方式解析。

<FilesMatch "evil.gif">
    SetHandler application/x-httpd-php
</FilesMatch>

7、后缀名大小写绕过
用于只将小写的脚本后缀名(如php)过滤掉的场合;
例如:将Burpsuite截获的数据包中的文件名【evil.php】改为【evil.Php】
8、双写后缀名绕过
用于只将文件后缀名,例如”php”字符串过滤的场合;
例如:上传时将Burpsuite截获的数据包中文件名【evil.php】改为【evil.pphphp】,那么过滤了第一个”php”字符串”后,开头的’p’和结尾的’hp’就组合又形成了【php】。
9、特殊后缀名绕过
用于检测文件合法性的脚本有问题的场合;
例如:将Burpsuite截获的数据包中【evil.php】名字改为【evil.php6】,或加个空格改为【evil.php 】等。php3 php4 php5 php7 PHP PHP3 phtml

0x06、对于上传文件php内容绕过

1、过滤<?php

<script language = "php"> @eval($_post['123']);</script>

2、使用require_once()

<script language="PHP">require_once("$_POST[id]") ;</script>

直接进行文件包含,使用php的filter流id=php://filter/convert.base64-encode/resource=../flag.php直接输出

3、使用linux命令

<script language="PHP">echo `$_POST[id]` ;</script>
反引号`,反引号(``) 执行运算符,PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回


0x07、防御方法

1、使用白名单进行过滤,上传记录上传操作;
2、对上传的文件头进行判断,限制上传文件格式 、大小;
3、对上传的文件进行重命名操作,图片压缩;
4、存储目录与Web应用分离,存储目录无执行权限;

链接:https://www.secpulse.com/archives/40617.html
https://my.oschina.net/yonghan/blog/496483
http://www.2cto.com/article/201308/233831.html