简介

文件上传漏洞是web应用最常见的漏洞之一,也是危害最大的漏洞之一。web应用有很多场景需要用户自己上传文件,比如头像上传。如果对上传的文件没有限制或者限制有缺陷,就可以上传一些脚本文件(shell文件),用户可以通过脚本文件远程连接服务器且获取对服务器的控制,将对信息安全造成极大的危害。
文件上传也是渗透测试中最重要的一个环节。

常用的检测和绕过方式

  1. js检测

很多应用只是在前端对文件后缀类型进行判断。用js对常见的shell文件后缀名过滤,如sap、jsp、php等文件。只需要删除相应的过滤代码,或者禁用js文件即可绕过。这也是最简单最不安全的限制方式,为了安全,目前很少存在了。

  1. 后端对MIME类型检测

MIME:全称Multipurpose Internet Mail Extensions,MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
常见的MIME类型:

text/plain    纯文本
text/html HTML    文档
text/javascript    js代码
application/xhtml+xml    XHTML文档
image/gif    GIF图像
image/jpeg    JPEG图像
image/png    PNG图像
video/mpeg    MPEG动画
application/x-www-form-urlencoded    POST方法提交的表单

可以通过抓包工具修改MIME值来绕过。比如使用Burpsuite工具。

  1. 文件头检测

文件中不仅存储着数据信息,还存储着文件类型等基本信息,一般存储在文件的头部。比如很多手机拍照会在照片中存储位置信息。
常见文件头:

文件类型    16进制
html    68746D6C3E
zip    504B0304
rar    52617221
  1. 大小写绕过

Windows系统对大小写不敏感,所以可以通过大小写绕过。Linux不可以,Linux大小写敏感。
php == pHp == PHP

  1. 双写绕过

当对后缀名过滤进行换空过滤时,可以用双写绕过。
"php"-->"" 时,"phphpp" --> "php";

  1. 0x00截断

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。

  1. 图片马

向图片中植入 php 代码,但是执行较困难,必须要中间件将该文件认为是 php 文件.除非有有相关的中间件解析漏洞或者有特定的运行php的网页。