文件上传漏洞绕过方式总结

0x00 文件上传漏洞

在网站一些可以上传文件的地方,利用上传漏洞上传木马可以直接得到WEBSHELL,危害等级极高。上一篇文件上传漏洞的博客介绍了文件上传漏洞的原理和实战,这里来记录一些常见的绕过方法。

0x01 绕过前端验证

我们都知道,任何基于前端的验证都是不安全的,因为用户能直接修改它进行绕过。

如果在前端对上传文件的格式进行了限制,我们可以通过以下的办法进行绕过:

  • 禁用js
    我们通过firefox中的一个插件NoScript,将脚本禁用,这个时候上传文件的时候就不会触发js校验。

  • 修改可上传的文件类型
    因为是基于前端的验证,所有代码我们都可以通过firebug来修改,只需要在允许的类型中加入我们的文件类型,或者在禁止的类型中删除我们的文件类型,提交即可饶过。

  • 通过BurpSuite绕过
    我们通过BurpSuite进行绕过时,首先将文件名后缀改成它允许的类型,然后通过了前端的检查之后截取这个包,将文件后缀再改回来,就成功的绕过了js检查。

0x02 后端检测-MIME

此类后端检查时,检查的是Content-Type,也叫Mime-Type,这个时候,我们上传一个PHP文件,通过BurpSuite抓包,将.php后缀的Content-Type: application/octet-stream更改为.jpg的Content-Type: image/jpeg。
然后发包,就可以绕过后端基于Content-Type的检测。

0x03 后端检测-文件头

这个时候他会检测文件的16进制数据头是否是合法文件的数据头,这个时候我们找一个普通的图片文件,再写一个一句话木马文件:

1
<?php eval($_POST[123456])?>

然后通过前面隐写术的方法,进入两个文件的路径,在cmd中输入:

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

制作成图片马,即可通过菜刀连接一句话木马。

0x04 后端检测-黑名单

对于黑名单的检测方式,我们有如下几种办法绕过:

  • 后缀名大小写混用
    假如.php后缀,我们可以写成.PHp之类的形式,用于一些过滤不严谨的系统。
  • 双写后缀
    在一些系统中,仅仅匹配非法后缀删除,这个时候我们构造.pphphp,当它将第一个php匹配删除之后,剩下的字符又重新组合成了.php。
  • 同义后缀名
    很多文件的后缀名不止一个,一些不常用的后缀名如果没有加入黑名单,就可以通过其他的同义后缀绕过。

如下是几种常见的扩展名绕过:

Asp: asa cer cdx

Aspx: ashx asmx ascx

Php: php3 phtml

Jsp: jspx jspf

0x05 后端检测-iis解析漏洞

在iis6中,如果提交图片格式为1.asp;.jpg,后缀是asp可以绕过检测,然后在上传后就会被解析成asp格式的文件,这个时候通过上面的办法制作图片马,然后上传后通过菜刀连接上传后的图片马即可。

0x06 目录禁止执行

在一些存放上传文件的目录,禁止执行脚本,这个时候我们可以通过在这个目录创建新的子目录,然后将脚本写入子目录中,即可执行。

0x07 总结

文件上传漏洞带来的危害十分巨大,在有文件上传的位置,一定要做严格的检查,不能因为开发一时的方便而忽视危害,建议在开发时遵循如下几点:

  • 1.应用白名单的方式过滤文件扩展名
  • 2.使用三等于(===)来对比扩展名(防止类型转换带来的逻辑漏洞,之后写逻辑漏洞的时候会写到)
  • 3.如果不是图片等必要呈现出来的文件,对上传路径设置权限。