Web安全之文件操作

作者: 康康 分类: Web安全 发布时间: 2017-05-07 21:15

网站在处理文件相关内容的时候可能会出现漏洞。分为文件上传攻击和文件下载攻击。


文件上传

File upload,任意文件上传攻击。Web应用程序在处理用户上传的文件时,没有判断文件的拓展名是否在允许的范围内,就把文件保存在服务器上,导致恶意用户可以上传任意文件,甚至上传木马到Web服务器上,直接控制服务器。

攻击

下面是处理用户上传文件请求的Java代码,这段代码没有过滤文件拓展名:

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(
        request.getRealPath("/")+getFIlename(request))));
ServletInputStream in = request.getInputStream();
int i = in.read();
while (i != -1) {
    pw.print((char) i);
    i = in.read();
}
pw.close()

PHP代码如下:

file_put_contents($_REQUEST["filename"],$_REQUEST["context"]);

由于上面的代码直接将用户上传的文件保存在了Web目录中,攻击者可以上传一段木马jspmuma.jsp,再通过访问来触发木马,控制服务器。即使jsp文件不会被Web服务器解析,攻击者也可以上传自定义的html文件,造成XSS攻击。

防御

想要防止文件上传攻击,需要做到以下几点:
1. 检测上传文件扩展名白名单,不属于白名单,不允许上传。
2. 上传文件的目录必须是http请求无法直接访问到的,如果需要访问,必须上传到其他域名下,并设置该目录不解析php等脚本语言。
3. 上传文件保存的文件名和目录名由系统根据时间生成,不允许用户自定义。
4. 图片上传,要通过处理(压缩图、水印),无异常后才能保存到服务器。


文件下载攻击

接下来说说文件下载攻击。不仅仅文件上传可以进行攻击,文件下载也会产生漏洞。
处理用户请求下载文件时,如果允许用户提交任意文件目录,并把服务器上对应的文件直接发送给用户,将造成任意文件下载攻击。如果让用户提交文件目录地址,就把目录下的文件列表发送给用户,会造成目录遍历安全威胁。
攻击者可以下载服务器上的敏感文件,比如数据库链接配置文件、网站源代码等。

攻击

下面是处理用户请求的java代码:

String path = request.getParameter("path");
java.io.OutputStream os = response.getOutputStream();
java.io.FileInputStream fis = new java.io.FileInputStream(path);
byte[] b = new byte[1024];
int i = 0;
while ((i = fis.read(b)) > 0 ){
    os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();

PHP代码如下:

$o = file_get_contents($filename);
echo $o;

这段代码根据用户提交的路径,从服务器上获取指定文件,展示给用户。
攻击者可以修改参数中的文件名,下载服务器中的敏感文件:

/filedownload.do?filename=/etc/passwd

防御

要防止文件下载攻击,需要做到以下几点:
1. 将要下载的文件地址保存在数据库中,让用户提交文件对应ID下载文件。
2. 文件放在Web无法直接访问的目录
3. 下载文件之前做权限判断。

发表评论

电子邮件地址不会被公开。 必填项已用*标注