Web安全之文件操作
网站在处理文件相关内容的时候可能会出现漏洞。分为文件上传攻击和文件下载攻击。
文件上传
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. 下载文件之前做权限判断。