为什么有文件上传漏洞?

上传文件时,如果服务器端没有对客户端上传的文件作严格的过滤和验证,就可以造成任意文件上传的漏洞,上传的脚本文件包括(asp,aspx,php,jsp等)

绕过

前端检测绕过

如果控制文件上传的地方只有简单的前端验证,就是上传的文件后缀名不符合要求,那么就可以先上传一个符合条件的名称,内容是一句话木马,然后抓包,把后缀改成php或其他的
还有一种js验证,我们可以先把当前网站的js验证功能关闭,这步操作可以在浏览器里进行,然后就可以上传任意类型的文件了

文件后缀绕过(服务器端)

原理
这是指在服务器端有验证代码,限制某些后缀名的上传。但是有些Apache是允许解析其他文件的,例如在httpd.conf中,如果配置有如下代码

AddType application/x-httpd-php .php .phtml

就能解析php和phtml文件。
绕过方法
在Apache解析顺序中,是从右向左开始解析文件的,如果最右侧的文件类型不可识别,就继续向左判断,直到遇到可以解析的文件为止。如果上传的文件类型类似1.php.xxx,因为xxx不可解析,所以向左解析php。因此实际上传的时候可以使用1.php.phtml等其他这一类的

文件类型绕过(服务器端)

原理
在客户端上传文件时,通过burp suite抓取数据包,当上传一个php文件时,可以看到content-type的值为appliction/octet-stream,而上传一个jpg格式的文件时,值为image/jpeg。
绕过方法
如果服务器端是通过content-type来判断文件类型时,那么就存在被绕过的可能,因为conten-type的值是客户端传递的,是可以任意修改的。
所以当上传一个php文件时,在burp里把content-type修改为image/jpeg就可以绕过服务器端的检验。
在PHP中还存在一种相似的文件上传漏洞,PHP函数getimagesize()函数可以获取到图片的宽,高等信息,如果上传的不是图片文件,那么getimagesize()函数就获取不到信息,就不允许上传。但是,我们可以通过将一个图片和一个webshell合并为一个文件,也就是生成一个图片木马。
具体操作
准备好写有一句话木马的php文件1.php,一张图片1.jpg,然后敲命令

copy 1.jpg/b+1.php 2.jpg

文件截断绕过

**截断类型:**PHP%00截断
**截断原理:**由于00代表结束符,所以会把00后面的所有字符删去
**截断条件:**PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
比如上传一个1.php%00.jpg,由于服务器是从右向左检验,所以检验的文件类型是jpg,但是当文件被保存到服务器的时候,%00会把后面的内容截断,因此,1.php就会被保存到服务器中。有时候windows不支持有特殊符号的文件,可以在burp suite中改包,也有两种方式,一种是直接改filename=“1.php%00.jpg”,还有一种是在HEX值里改,找到文件名对应的HEX值的位置,修改成00即可。

条件竞争绕过

原理
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者可以利用这个短的时间差完成条件竞争的上传漏洞攻击。
绕过方法
攻击者可以先上传一个1.php,里面的内容是

<?php 
	fputs(fopen('../shell.php','w'),'<?php @eval($_POST["hello"]); ?>');
?>

1.php的作用是生成一个shell.php,而且里面写有一句话。当1.php上传成功时,服务器会在当前目录下自动生成shell.php,虽然1.php会被删除,但是留下了shell.php.

重写编辑规则绕过

原理
上传.htaccess文件,覆盖服务器上的原有文件,重写编辑规则,将上传的带有脚本马的图片以脚本方式解析
绕过方法

如果条件允许我们上传.htaccess文件,先上传.htaccess文件,覆盖掉原先的.htaccess文件,在上传eval.jpg,可以使用如下的脚本
<FilesMatch "evil.jpg">

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

其他方式绕过

原理
部分程序员的思维不严谨,并使用逻辑不完善的上传文件合法性检测手段,导致可以找到方式绕过其检测方式。
绕过方法

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

一些骚姿势

只能看大佬总结的了(持续更新…)