文件上传
文件上传漏洞
- 服务器配置不当,导致任意文件上传
- Web应用开启文件上传功能,但没有对文件进行足够的限制
危害
该漏洞可导致攻击者上传任意文件,包括恶意脚本、程序等。如果Web服务器所保存上传文件的可写目录具有执行权限,则可以上传后门文件getshell
条件
- Web服务器开启上传功能,且接口对外开放
- Web用户对目标目录具有可写权限,甚至执行权限
- Web中间件可以解析上传的脚本
验证/绕过
前端验证
JS类防护
如:
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
这种前端的验证方式非常薄弱,因为JS脚本的运行环境是浏览器,在浏览器中修改或者删除对应的JS脚本即可绕过
也可以通过抓取数据包修改的方式绕过
后端
黑名单
通过修改文件名、后缀名,使得文件不会被黑名单隔离,且上传的文件能被中间件解析
特殊后缀解析
仅通过黑名单过滤了常见的脚本文件后缀,如:php、jsp、asp、aspx
等
可以通过特殊后缀绕过,如:.php",".php5",".php4",".php3",".php2",".phtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".asp",".aspx"
需要中间件能够解析特殊后缀名
大小写绕过
用于黑名单不完整
点绕过/空格绕过
Windows系统中,文件最后一个字符是 . 或空格时,会被自动删除,可利用这一点,修改数据包中的文件名,绕过黑名单
::$$DATA
在window的时候如果文件名+"::$DATA"
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,如:example.php::$$DATA
,Windows会自动将其变为example.php
双写绕过
黑名单检测到隔离字符串时,将隔离字符串替换为空,但只执行一次时,可以双写绕过
如:example.php
被检测出后,替换为example.
;若双写后缀名example.pphphp
,则会被替换为example.php
实现绕过
.htaccess解析
.htaccess 是Apache 服务器的分布式配置文件,该配置文件会覆盖Apa