文件上传流程
- 前端校验 -> http协议传输 -> Web应用程序校验 -> Web应用程序存储 -> Web应用程序解析执行
文件上传漏洞 - 绕过js校验上传
Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javasrcipt进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。
- 绕过方法:
修改前端Javascript代码
使用Burp Suite篡改上传的文件
文件上传漏洞 - 后端上传代码校验绕过
根据绕过Web应用校验的方法可以分为下面几种。
- 绕过文件类型校验
- 绕过扩展名校验
- 绕过文件头校验
绕过文件类型校验
部分Web应用系统判定文件类型是通过content-type字段,可以通过抓包将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。
- 测试环境为DVWA安全等级为Medium
- 在如下目录下找到配置文件Medium.php,校验为对比上传文件的类型和大小。
- 使用Burp Suite修改content-type类型为image/jpeg
- 使用菜刀连接
绕过扩展名校验
绕过扩展名校验一般针对采用给黑名单的Web应用系统。
不同类型的网站,绕过黑名单的方式也不同,分为以下几种:
- PHP: php5 ,php6 ,php后面加空格,phtml,pHp(大小写混合)
- ASP: aspx,cer,cdx,aSp(大小写混合)
- JSP: jspx,jspf,jSp(大小写混合)
绕过文件头校验
- Web应用程序在校验文件类型,文件扩展名的同时,也会校验文件头,从而进一步确定文件的类型,针对这种情况,可以通过在上传文件的开头加入特定的文件头从而绕过这种校验方式。
文件类型 | 对应的文件头 |
---|---|
jpeg/jpg/png | JPGGraphic File |
gif | GIF 89A |
zip | ZIP Compressed |
doc/xls/xlt/ppt/apr | MS Compound Document v1 or Lotus Approach APRfile |
文件上传漏洞-结合00截断
在上传文件的时候,Web应用程序经过一系列文件校验之后,最终调用php的内置函数move_uploaded_file保存文件。
在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以把上传文件命名为xxxx.php%00.png。该函数遇到\0x00字符后回截断路径名。测试人员通过构造包含\x00的特殊文件名就可以通过上传文件的扩展名校验,但是保存时却以非法扩展名保存文件。
文件上传漏洞-结合解析漏洞
解析漏洞是指当Web中间件遇到特殊类型的文件时会被当成代码执行。不同的Web中间件出发解析漏洞的文件类型也不同。
- IIS6.0: test.asp;.jpg会被IIS6.0当作test.asp解析
- Apache:test.php.xxx会被低版本的apache当成test.php解析执行
- Nginx:在图片后加上/.php,图片被会被当做php脚本执行
其他绕过方式
- 重写解析规则
上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
- 双写后缀名绕过
Web应用系统可能对文件名进行替换过滤,如删除文件名中php等字符,恶意攻击者可以构造诸如phphpp类型的后缀绕过校验。