简述&&原理
文件包含就是一个文件里面包含另外一个文件。
程序员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
程序员希望代码更灵活,所以把包含的文件设置为变量,用来调用,
然鹅,当用户可以控制这个变量时,就造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP应用中最多,而在JSP、ASP、应用中却非常少,甚至没有,这是有些语言设计的弊端。在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。
常见包含函数
include()、require()
区别:
- include是当代码执行到它的时候才加载文件,发生错误的时候只是给一个警告,然后继续往下执行
- require是只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行
require一般是用于文件头包含类文件、数据库等等文件,include一般是用于包含html模版文件
include_once()、require_once()与(include\require)的功能相同,只是区别于当重复调用的时候,它只会调用一次。
<?php
include($_GET['f']);
?>
远程文件包含和本地文件包含的配置区别
allow_url_fopen=On并且 allow_url_include=On
- 本地文件包含php.ini配置文件中 allow_url_include on
- 远程文件包含与本地文件包含的区别(allow_url_include on和allow_url_fopen on)
-
远程文件(包括本地文件包含)包含比本地文件包含的危害大
-
php为了安全性考虑,有一项 open_basedir 的设置,设置php应用可以访问的目录。
漏洞代码分析
<?php
//获取参数page的值
$page=$_GET['page'];
//此处可以加一些代码对变量$page一些过滤,达到防护的效果。
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX
//暂时先不写
//包含函数
include($page);
?>
利用思路
不做详细解释,在需要时查询相关资料进行利用,此处仅提供利用思路
文件包含函数会把包含的任意文件都当作php文件来执行。
所以可以利用的思路:
1、包含目录任意文件
2、包含日志文件
3、包含系统环境
4、包含session文件
5、包含其他由php创建的tmp文件
6、包含图片
......
封装协议的利用
http|https|ftp|php://input|php://filter|data|zip|phar