文件上传漏洞

1、前端限制

前端验证文件的合法性,例如检查扩展名。

绕过方法:可以利用插件禁用掉 js 验证或者 F12 删掉对应的验证代码

2、后端检查扩展名

两种策略:黑名单或白名单

服务器根据黑白名单进行扩展名检查,判断是否允许上传

绕过方法:

在一些Web server中,存在解析漏洞:
1.老版本的IIS6中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
2.老版本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg
3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行
4.nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行(fastcgi会把这个文件当php看,不受空字节影响,但是检查文件后缀的那个功能会把空字节后面的东西抛弃,所以识别为jpg)
5.apache1.x,2.x的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的

3、检查 Content-Type

HTTP 协议规定了上传资源的时候在 Header 中加上一项文件的 MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的, 因为 HTTP header 可以被发出者或者中间人任意的修改。

upload-labs 靶场

Pass-01(前端验证)

方法 1:因为是进行前端 JS 校验,因此可以直接在浏览器检查代码把验证删除掉,即可成功上传 php 文件

方法 2:将 php 文件修改为 jpg 后缀,然后利用 burp 工具在修改为 php 后缀

上传成功后可以利用蚁剑连接上传的 php 后门。

Pass-02(MIME 验证)

使用 burp 抓包,修改上传的 PHP 的 content-type 为 image/jpeg

Pass-03(黑名单验证,特殊后缀)

Pass-06(黑名单验证,大小写绕过)

Pass-07(黑名单验证,空格绕过)

Pass-08(黑名单验证,点号绕过)

Pass-09(黑名单验证,特殊字符::$DATA 绕过)

php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。

注意:蚁剑连接路径不要加上::$DATA