文件类漏洞总结, 文件包含, 文件上传, 文件下载
文件类漏洞总结
一, 文件包含
1. 文件包含绕过
实际环境中不是都是像$_GET['file'];
incude $file
这样直接把变量传入包含函数的。
在很多时候包含的变量文件不是完全可控的,比如下面这段代码指定了前缀和后缀:
<?php
$file = S_GET['filename'];
include '/opt/lampp/htdocs/security/' . $file . '/test/test.php';
?>
-
目录穿越绕过指定前缀,构造 file =…/…/./etc/passwd
-
编码绕过前缀:
../
的编码为:%2e%2e%2f
,..\
的编码为:%2e%2e%5
-
二次编码绕过前缀:
../
的二次编码为:%252e%252e%252f
, 的二次编码为:%252e%252e%255C
-
对于远程包含,使用
?
号绕过后缀,此时后缀将变成参数的一部分.前端提交: http://xxx/xxx/read.php?filename=http://xxx/xxx/mm.php
后端包含: http://xxx/xxx/mm.php/test/test.php, 由于后端添加了后缀, 导致路径错误
"?"
绕过 : http://xxx/xxx/read.php?filename=http://xxx/xxx/mm.php? -
%00截断
后缀,只适用于PHP5.3以前的版本 -
使用伪协议
phar://
构造一个与后缀同路径的压缩包,比如此时 file = phar://test.zip
2. 文件包含防御
(1) 配置open_basedir,只允许包含某个目录下的内容
(2) 不允许文件包含让用户可控,直接写在代码中
(3) 尽量包含一个确定的文件,而不是一个变量或参数值
(4) 检测用户输入参数,确保路径可控
(5) 过滤各种./../
或经过编码的 %2e%2E
(6) 不使用远程包含,关闭 allow_url_include
(默认关闭)
(7) 如果需要使用,则限定域名或路径
(8) 使用白名单,只要不在白名单列表中的内容,则验证不通过
二, 文件上传
1. 文件上传绕过:
1. 前端绕过
2. 类型MIME绕过
3. 黑名单绕过
4. 大小写绕过
5. 双写绕过
6. 空格绕过
7. 点绕过
8. 点空格点绕过
9. 图片马
2. 文件上传防御:
(1) 前后端一起校验,校验后缀名,校验MIME
类型
(2) 后缀名的校验必须全部转换成小写进行处理
(3) 使用白名单,不是白名单的一律禁止.
(4) 去除文件名后续的各种符号,如点
和空格
等
(5) 针对图片文件,使用二次渲染
或压缩技术处理图片,并另存
(6) 对文件名进行重命名,则先命名再移动,避免条件竞争
(7) 将上传文件所在目录的权限设置为不可执行
三, 文件下载
1. 文件下载绕过:
参考文件包含绕过.
2. 文件下载防御:
(1)过滤特殊字符"."
(点),使用户在url中不能回溯上级目录
(2)正则严格判断用户输入参数的格式
(3)php.ini
配置open_basedir
限定文件访问范围
(4)将文件路径保存于数据库中,通过 file?id=3
的数据库序号id方式下载文件, 而不是通过具体的文件名.