文件上传
文件上传本质是客户端向服务器端的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提交时伴随文件上传的表单)
######