为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓
- 01 漏洞描述
- 02 审计要点
- 03 漏洞特征
- 04 漏洞案例
- 05 修复方案
01 漏洞描述
网站可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。
02 审计要点
任意文件下载漏洞发生的根本原因是系统自带的查看或下载功能,用户可控制下载路径,且当服务器不做任何限制的时候,就可以完成对任意文件的读取/下载。
当判断代码中是否存在任意文件下载漏洞时,可从以下3点进行判断:
1、是否存在文件读取接口?Java中如read函数等。
2、待读取的文件名参数是否为用户可控?是否直接拼接http请求数据?或者调用存储在数据库中的数据?
3、用户输入的文件名是否经过了校验?是否预先设置好文件白名单?对输入的特殊字符是否存在敏感字符过滤?
03 漏洞特征
如果存在文件下载接口,且该接口接受用户输入的文件名作为将要下载的文件资源,且对文件资源名字没有进行路径和文件名字的校验,则存在该漏洞。
.Net
using System.IO;
class Example
{
void ExampleFun(string filename)//filename为用户的输入数据
{
//filename 可能包含“..”字符序列导致访问受限目录之外的文件
string path = Path.GetFullPath(filename);
DirectoryInfo info = new DirectoryInfo(path);
......
}
}
上述代码中,前端输入filename未进行任何校验及过滤,可造成任意文件下载。
PHP
<?php
$filename = $_GET['filename'];
readFile($filename);
?>
上述代码中,文件名用户可控,且未作任何校验和限制,导致存在任意文件下载漏洞。
04 漏洞案例
如上述代码所示,存在文件下载接口,且该接口接受用户输入的文件名作为将要下载的文件资源,且对文件资源名字没有进行路径和文件名字的校验,明确存在任意文件下载/读取漏洞。
漏洞验证示例如下:
http://127.0.0.1/resin-doc/viewfile/?file=index.jsp
05 修复方案
1、过滤.(点),使用户在url中不能回溯上级目录。
2、对下载路径进行过滤,如下载前对传入的参数进行过滤,并且对下载文件类型进行检查,是否是允许下载的类型。