文件处理相关问题
概述:
在有些Web应用中,外界能够通过传入参数的形式来指定服务器中的文件名。比如由外界参数来指定模板文件的情况。这样的Web应用可能会招致以下攻击。
- 非法访问Web服务器内的文件(目录遍历)
- 调用OS命令(OS命令注入)
目录遍历漏洞:
Web应用中允许外界以参数的形式来指定服务器上的文件名时,如果没有对文件名进行充分的校验 ,就可能会造成意料之外的问题,比如文件被浏览、篡改或删除。该安全隐患被称为目录遍历漏洞。
目录遍历漏洞会造成以下影响。
浏览Web服务器中的文件
泄露重要信息
篡改或删除Web服务器中的文件。
篡改网页内容,散布谣言或恶意诽谤他人
布下圈套将用户诱导至恶意网站
删除脚本文件或配置文件导致服务器宕机
通过篡改脚本文件从而在服务器上执行任意脚本。
目录遍历漏洞的防范策略如下,执行其中一项即可。
- 避免由外界指定文件名
- 文件名中南不予许包含目录名
- 限定文件名中仅包含字母和数字
目标遍历漏洞总览:
产生地点:
- 能够由外界指定文件名的页面。
影响范围:
- 所有页面。
影响类型:
- 泄露隐私信息、篡改或删除信息、执行任意脚本、使应用停止服务
影响程度:
- 大
用户参与程度:
- 不需要
对策概要:
执行其中一项即可。
- 避免由外界指定文件名
- 文件名中南不予许包含目录名
- 限定文件名中仅包含字母和数字
安全隐患产生的原因:
当应用满足一下3个条件时,就有可能产生目录遍历漏洞。
- 外界能够指定文件名
- 能够使用绝对路径或相对路径等形式来指定其他目录的文件名。
- 没有校验是否允许访问拼接后的文件名
如果从开发着的角度来考虑的话,漏洞产生的可能原因是因为开发者没有考虑到“外界能够指定其他目录”的可能性。
由于目录遍历漏洞的产生需要同时满足以上3个条件,因此,只要使其中任意一项无法满足也就能够将漏洞消除。
防御措施:
避免由外界指定文件名:
如果能避免文件名由外界指定,就能从根本上解决目录遍历漏洞。具体方法右如下几种。
- 将文件名固定
- 将文件名保存在会话变量中
- 不直接指定文件名,而是使用编号等方法间接指定。
文件名中不允许包含目录名:
如果文件名中不包括目录名(包括../)就能确保应用中只能访问给定目录中的文件,从而也就消除了目录遍历漏洞产生的可能性。
表示目录的字符/ 、 \ : 等因操作系统而异,不同的操作系统应当采用不同的程序库。在PHP中南则能够使用basename函数。
basename函数会接收带有目录的文件名(也包括Windows的盘符),并返回末尾的文件名部分。例如basename(’../../…/etc/hosts’)返回的结果即为hosts。
限定文件名中仅包含字母和数字:
如果能够限定文件名的字符种类仅为字母和数字,那么用于目录遍历攻击的字符就会无法使用,因此这个方法也能作为目录遍历的防范策略。
1 |
|
总结对策:
实施以下任一一项
- 避免由外界指定文件名
- 文件名中不允许包含目录名
- 限定文件名中仅包含字母和数字
内部文件被公开
概述:
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 |
|
学习过程中笔记的记录与资料整理。