声明:
请遵守《中华人民共和国网络安全法》,禁止进行未经授权的渗透测试行为!
本人不提供任何攻击教程及工具,本文仅作研究和学习用途,请勿利用文中的技术资料进行未经授权的测试行为。利用文中所提供的信息对未授权的计算机系统造成的直接或间接后果和损失,由使用者承担。

文件包含漏洞(File Inclusion)包括本地包含漏洞(LFI)和远程包含漏洞(RFI)以及目录遍历,网页应用在向目标系统请求文件(图片,文本)时通过参数,参数是一个URL中的查询参数字符串

用户向网站服务器发请求获取文件,首先,用户向包含文件的服务器发起HTTP请求,如果含有php漏洞或缺少输入检测。就会产生漏洞,可以获取敏感信息,如果有权写入/tmp文件夹,则能得到远程命令执行(RCE)

路径遍历

路径遍历也叫目录遍历,一个网页安全漏洞允许攻击者读取网页资源,例如服务器本地资源,通过修改URL来定位根目录之外的资源

该漏洞在将用户输入传到PHP中函数例如file_get_contents时出现

可以通过添加payloads来测试URL参数去看网页应用的反应,路径遍历攻击,通常被称为dot-dot-slash攻击,用../来前移目录,如果攻击者发现了注入点,例如get.php?file=,就可以发送请求http://……/get.php?file=../../../../etc/passwd

Windows系统同理,例如访问boot.ini,请求http://……/get.php?file=../../../../boot.ini 或 http://……/get.php?file=../../../../windows/win.ini

常用文件:

地址 描述
/etc/issue 在登录提示之前输出的消息或系统标识
/etc/profile 控制系统范围内的默认变量,如导出变量、文件创建掩码(umask)、终端类型、邮件消息(指示何时有新邮件到达)
/prov/version Linux内核版本
/etc/passwd 所有已注册并可以访问系统的用户
/etc/shadow 系统用户密码的信息
/root/.bash_history root用户的历史命令
/var/log/dmessage 全局系统消息,包括在系统启动期间记录的消息
/var/mail/root root用户所有的邮件
/root/.ssh/id_rsa 服务器上根用户或任何已知有效用户的私有SSH密钥
/var/log/apache2/access.log 访问Apache web服务器的请求
C:\boot.ini 带有BIOS固件的计算机的启动选项

本地文件包含(LFS)

PHP中的include, require, include_once,和 require_once函数经常导致文件包含漏洞,用其他语言例如ASP, JSP, 或者Node.js也会出现

获取语言

1
2
3
4
5
6
7
8
9
10
<?PHP 
include($_GET["lang"]);
?>
```shi xian
用GET请求输入lang参数来更改语言,通过http://....../index.php?lang=EN.php 请求英文,这种情况下,可以尝试http://....../get.php?file=/etc/passwd 来获取密码

```PHP
<?PHP
include("languages/". $_GET['lang']);
?>

上面的代码制定了language文件夹,可以尝试http://……/index.php?lang=../../../../etc/passwd 获取

如果代码限定了获取文件的格式,例如限定后缀为.php,可以通过增加空字节(null bytes)%00 0x00来略过后面所有字符(PHP5.3.4后修复)

如果开发者加入了过滤关键词来防止泄露敏感信息,例如/etc/passwd, 则可以通过空字节NullByte或者当前目录技巧/.来绕过

PS:
cd .. 为返回上一级目录
cd . 为展示当前目录

如果开发者将../替换为空字符串,我们可以通过....//....//....//....//....//etc/passwd来绕过,PHP只会过滤首次找到的../

远程文件包含(RFI)

远程文件包含是一种将远程文件包含到易受攻击的应用程序中的技术,实现条件为allow_url_fopen为打开的状态

RFI的风险高于LFI,因为RFI允许攻击者拿到在服务器上的远程命令执行权限(RCE),RFI可能导致敏感信息泄漏,跨站脚本攻击(XSS),服务拒绝(DoS)

进行RFI攻击外部服务器必须与应用服务器通信,攻击者在服务器上托管而已文件,然后通过HTTP请求注入到include函数中,使恶意文件在应用服务器上运行

修复

为了防止文件包含漏洞

  1. 保持系统,服务,和网页应用框架为最新版本
  2. 关闭PHP错误显示,以避免泄露应用程序的路径和其他潜在的泄露信息
  3. 打开网络应用防火墙
  4. 在不需要的情况下关闭一些导致文件包含漏洞的功能,例如allow_url_fopenallow_url_include
  5. 仔细分析网络程序并只打开用到的协议和PHP封装
  6. 永远不要相信用户的输入,确保有特定的输入检测来防止文件包含
  7. 实现文件名字白名单和路径黑名单