在有些Web应用中,外界能够通过传入参数的形式来指定服务器中的文件名。比如由外界参数来指定模板文件的情况。这样的Web应用可能会招致以下攻击。
Web应用中允许外界以参数的形式来指定服务器上的文件名时,如果没有对文件名进行充分的校验 ,就可能会造成意料之外的问题,比如文件被浏览、篡改或删除。该安全隐患被称为目录遍历漏洞。
目录遍历漏洞会造成以下影响。
浏览Web服务器中的文件
泄露重要信息
篡改或删除Web服务器中的文件。
篡改网页内容,散布谣言或恶意诽谤他人
布下圈套将用户诱导至恶意网站
删除脚本文件或配置文件导致服务器宕机
通过篡改脚本文件从而在服务器上执行任意脚本。
目录遍历漏洞的防范策略如下,执行其中一项即可。
产生地点:
影响范围:
影响类型:
影响程度:
用户参与程度:
对策概要:
执行其中一项即可。
当应用满足一下3个条件时,就有可能产生目录遍历漏洞。
如果从开发着的角度来考虑的话,漏洞产生的可能原因是因为开发者没有考虑到“外界能够指定其他目录”的可能性。
由于目录遍历漏洞的产生需要同时满足以上3个条件,因此,只要使其中任意一项无法满足也就能够将漏洞消除。
如果能避免文件名由外界指定,就能从根本上解决目录遍历漏洞。具体方法右如下几种。
如果文件名中不包括目录名(包括…/)就能确保应用中只能访问给定目录中的文件,从而也就消除了目录遍历漏洞产生的可能性。
表示目录的字符/ 、 \ : 等因操作系统而异,不同的操作系统应当采用不同的程序库。在PHP中南则能够使用basename函数。
basename函数会接收带有目录的文件名(也包括Windows的盘符),并返回末尾的文件名部分。例如basename(’…/…/…/etc/hosts’)返回的结果即为hosts。
如果能够限定文件名的字符种类仅为字母和数字,那么用于目录遍历攻击的字符就会无法使用,因此这个方法也能作为目录遍历的防范策略。
define('TMPLDIR', '/var/www/html/web');
$templ = $_GET['template'];
if(!preg_match(/\A[a-z0-9]+\.html\z/ui', $tmpl)){
die('<h3>template仅仅能指定数字和字母</h3>')
}
?>
readfile(TMPLDIR . $tmple); ?>
实施以下任一一项
Web服务器的公开目录中有时会放置对外保密的文件。这种情况下,外界一旦得知文件的URL,就能够浏览这些内部文件。
内部文件被公开会造成如下影响。
防范内部文件被公开的对策为,不在公开目录中放置内部文件。或者保险起见,也可以直接禁用目录列表功能。
在httpd.conf文件中:
Options Include ExecCGI FollowSymLinks Indexes
导致内部文件被公开的原因为,内部文件被放在了公开目录中。当应用满足一下条件时,放置在公开目录下的文件就能被外界访问。
其中,得知访问文件的URL的手段有如下几种:
针对文件上传功能的攻击类型有如下几种:
防范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命令注入同样的影响,具体如下:
为了防范通过上传文件而在服务器上执行脚本,可以综合实施以下两种方法,或者实施其中的任意一种。
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;
}
学习过程中笔记的记录与资料整理。