文件上传

文件上传本质是客户端向服务器端的POST请求,消息里面是上传的信息。前端上传页面需要指定 enctype 为 multipart/form-data 或者 Multipart/form-data 才能正常上传文件。

<form action='' enctype='multipart/form-data' method='POST'>
<input type='file' name='file'>
</form>

漏洞成因

  • 对于上传文件的后缀名(扩展名)没有做较为严格的限制

  • 对于上传文件的MIMETYPE 没有做检查

  • 权限上没有对于上传的文件的文件权限,(尤其是对于shebang类型的文件)

  • 对于web server对于上传文件或者指定目录的行为没有做限制

绕过方式

前端绕过

表单中通过onsumbit=checkfile()调用js函数来检测文件后缀名

  • 通过firebug或burp suite来绕过
Content-Type

HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型

  • 抓包重放绕过,修改Content-Type

MIMETYPE表

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/octet-stream(二进制数据)

application/pdf(PDF文档)

application/(编程语言) 该种语言的代码

application/msword(Microsoft Word文件)

message/rfc822(RFC 822形式)

multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)

application/x-www-form-urlencoded(POST方法提交的表单)

multipart/form-data(POST提交时伴随文件上传的表单)

######