文件处理相关问题

文件处理相关问题

概述:

在有些Web应用中,外界能够通过传入参数的形式来指定服务器中的文件名。比如由外界参数来指定模板文件的情况。这样的Web应用可能会招致以下攻击。

  • 非法访问Web服务器内的文件(目录遍历)
  • 调用OS命令(OS命令注入)

目录遍历漏洞:

Web应用中允许外界以参数的形式来指定服务器上的文件名时,如果没有对文件名进行充分的校验 ,就可能会造成意料之外的问题,比如文件被浏览、篡改或删除。该安全隐患被称为目录遍历漏洞。

目录遍历漏洞会造成以下影响。

  • 浏览Web服务器中的文件

    泄露重要信息

  • 篡改或删除Web服务器中的文件。

    篡改网页内容,散布谣言或恶意诽谤他人

    布下圈套将用户诱导至恶意网站

    删除脚本文件或配置文件导致服务器宕机

    通过篡改脚本文件从而在服务器上执行任意脚本。

目录遍历漏洞的防范策略如下,执行其中一项即可。

  • 避免由外界指定文件名
  • 文件名中南不予许包含目录名
  • 限定文件名中仅包含字母和数字

目标遍历漏洞总览:

产生地点:

  • 能够由外界指定文件名的页面。

影响范围:

  • 所有页面。

影响类型:

  • 泄露隐私信息、篡改或删除信息、执行任意脚本、使应用停止服务

影响程度:

用户参与程度:

  • 不需要

对策概要:

执行其中一项即可。

  • 避免由外界指定文件名
  • 文件名中南不予许包含目录名
  • 限定文件名中仅包含字母和数字

安全隐患产生的原因:

当应用满足一下3个条件时,就有可能产生目录遍历漏洞。

  1. 外界能够指定文件名
  2. 能够使用绝对路径或相对路径等形式来指定其他目录的文件名。
  3. 没有校验是否允许访问拼接后的文件名

如果从开发着的角度来考虑的话,漏洞产生的可能原因是因为开发者没有考虑到“外界能够指定其他目录”的可能性。

由于目录遍历漏洞的产生需要同时满足以上3个条件,因此,只要使其中任意一项无法满足也就能够将漏洞消除。

防御措施:

避免由外界指定文件名:

如果能避免文件名由外界指定,就能从根本上解决目录遍历漏洞。具体方法右如下几种。

  • 将文件名固定
  • 将文件名保存在会话变量中
  • 不直接指定文件名,而是使用编号等方法间接指定。

文件名中不允许包含目录名:

如果文件名中不包括目录名(包括../)就能确保应用中只能访问给定目录中的文件,从而也就消除了目录遍历漏洞产生的可能性。

表示目录的字符/ 、 \ : 等因操作系统而异,不同的操作系统应当采用不同的程序库。在PHP中南则能够使用basename函数。

basename函数会接收带有目录的文件名(也包括Windows的盘符),并返回末尾的文件名部分。例如basename(’../../…/etc/hosts’)返回的结果即为hosts。

限定文件名中仅包含字母和数字:

如果能够限定文件名的字符种类仅为字母和数字,那么用于目录遍历攻击的字符就会无法使用,因此这个方法也能作为目录遍历的防范策略。

1
2
3
4
5
6
7
8
<?php
define('TMPLDIR', '/var/www/html/web');
$templ = $_GET['template'];
if(!preg_match(/\A[a-z0-9]+\.html\z/ui', $tmpl)){
die('<h3>template仅仅能指定数字和字母</h3>')
}
?>
<?php readfile(TMPLDIR . $tmple); ?>

总结对策:

实施以下任一一项

  • 避免由外界指定文件名
  • 文件名中不允许包含目录名
  • 限定文件名中仅包含字母和数字

内部文件被公开

概述:

Web服务器的公开目录中有时会放置对外保密的文件。这种情况下,外界一旦得知文件的URL,就能够浏览这些内部文件。

内部文件被公开会造成如下影响。

  • 重要信息被泄露。

防范内部文件被公开的对策为,不在公开目录中放置内部文件。或者保险起见,也可以直接禁用目录列表功能。

在httpd.conf文件中:

1
Options Include ExecCGI FollowSymLinks Indexes

安全隐患的产生原因:

导致内部文件被公开的原因为,内部文件被放在了公开目录中。当应用满足一下条件时,放置在公开目录下的文件就能被外界访问。

  • 文件被放置在公开目录中
  • 有方法得知访问文件的URL
  • 没有对文件设置访问权限

其中,得知访问文件的URL的手段有如下几种:

  • 目录列表功能被设为有效
  • 文件名为日期、用户名或连续数值等能够被推测的值
  • user.dat、data.txt等常见文件名
  • 通过错误消息或其他安全隐患而得知文件名
  • 被外部网络链接进而被搜索引擎收录

文件上传相关问题

概要:

针对文件上传功能的攻击类型有如下几种:

  • 针对上传功能的DoS攻击
  • 上传的文件在服务器上作为脚本执行。
  • 诱使用户下载恶意文件。

防范策略:

防范DoS攻击:

防范DoS攻击的一种有效策略为限制上传文件的容量。PHP能够在php.ini中设置上传功能的容量限制。下表中列出了与文件上传相关的配置项。建议在满足应用需求的前提下禁令将值设置的小一些。如果应用不提供文件上传功能,那么只需要将file_uploads设置为Off即可。

设置项目名 解说 默认值
file_uploads 是否允许使用文件上传功能 On
upload_max_filesize 单个文件的最大容量 2MB
max_file_uploads 单词请求最大文件上传个数 20
post_max_size POST请求正文的最大限制 8MB
memory_limit 脚本所能申请到的最大内存值 128MB

通过上传文件使服务器执行脚本:

有些文件上传处理会将用户上传的文件保存至Web服务器的公开目录中。这时,如果应用中允许上传文件的扩展名为php、asp、aspx、jsp等脚本文件的扩展名,用户就能在服务器上将啥概念车的文件作为脚本执行。

如果外界传入的脚本在服务器上被执行,就会造成与OS命令注入同样的影响,具体如下:

  • 浏览、篡改或删除Web服务器内的文件。
  • 对外发送邮件
  • 攻击其他服务器(称为垫脚石)

为了防范通过上传文件而在服务器上执行脚本,可以综合实施以下两种方法,或者实施其中的任意一种。

  • 不将用户上传的文件保存在公开目录中,浏览文件需要通过脚本。
  • 将文件的扩展名限定为不可执行的脚本文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
define('UPLOADPATH', '/var/uplaod');
function get_upload_file_name($tofile){
$info = pathinfo($tofile);
$ext = strtolower($info['extension']);
if($ext != 'png' && $ext != 'jpg' && $ext != 'gif'){
die('只能上传扩展名为gif,jpg,png的图像文件');
}
//下面的处理为生成唯一的文件名
$count = 0;//尝试生成文件名的次数
do{
$file = sprintf('%s%08x.%s', UPLOADPATH, mt_rand(), $ext);
$fp = @fopen($file, 'x');
}wihle($fp === FALSE && ++$count < 10);
if($fp === FALSE){
die('无法生成文件');
}
fclose($fp);
return $file;
}

学习过程中笔记的记录与资料整理。


坚持原创技术分享,您的支持将鼓励我继续创作!