简述
程序员将一些可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般称为文件包含。
而文件包含漏洞就是文件包含函数加载的参数没有经过过滤,可以被攻击者控制,包含了其他恶意文件,执行了恶意代码。
php中的文件包含函数
include()
include_once()
require()
require_once()
include和require函数的区别:include在文件包含过程中如果出现错误,会抛出警告,程序继续执行,而require则会抛出一个致命错误,退出程序执行。
include_once和require_once,是只包含一次,适用于程序执行过程中一个文件可能被包含超过一次的情况下,只被包含一次以避免函数重定义,变量重新赋值等问题。
漏洞分类及其原理
1.本地文件包含漏洞
就是能够打开并包含本地文件的漏洞。
示例:
//index.php
<?php
$filename = $_GET['filename'];
include($filename);
?>
//info.php
<?php
phpinfo();
?>
因为filename直接传入到incldue()函数中,所以可以控制filename直接访问到想访问的内容:
2.远程文件包含漏洞
是能够包含远程服务器上的文件并执行的漏洞。
利用条件:配置中的allow_url_fopen和allow_url_include需要为on。
allow_url_fopen:on 默认开启,该选项为on便是激活了URL形式的fopen封装协议使得可以访问URL对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许包含URL对象文件等。
php伪协议
1.file://协议
用于访问本地文件系统,不受allow_url_fopen和allow_url_include的影响。
用法:file://[文件的绝对路径和文件名]
http://192.168.1.7/testfile/index.php?filename=file://C:/windows/system.ini
2.zip://协议
可以访问压缩文件中的子文件,不需要指定后缀名。不受allow_url_fopen和allow_url_include的影响。
用法:zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
http://192.168.1.7/testfile/index.php?filename=zip://C:/phpStudy/PHPTutorial/WWW/testfile/info.zip%23info.php
如果对zip的文件格式有限制,压缩后可以改成其他格式:
http://192.168.1.7/testfile/index.php?filename=zip://C:/phpStudy/PHPTutorial/WWW/testfile/info.jpg%23info.php
3.php://协议
不需要开启allow_url_fopen,仅php://input、php://stdin、php://memory和php://temp需要开启allow_url_include。
①php://filter :读取源代码并进行base64编码输出。
http://192.168.1.7/testfile/index.php?filename=php://filter/read=convert.base64-encode/resource=info.php
4.data://协议
需要开启allow_url_fopen和allow_url_include,和php://input类似,可以执行任意代码。
用法1:data:text/plain,php代码
用法2:data:text/plain;base64,编码后的php代码
5.phar://伪协议
这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。(压缩包需要是ZIP协议压缩)
用法:phar://[压缩文件路径]/[压缩文件内的子文件名]
http://192.168.1.7/testfile/index.php?filename=phar://C:/phpStudy/PHPTutorial/WWW/testfile/info.zip/info.php
参考链接
https://www.cnblogs.com/iamstudy/articles/include_file.html
https://www.freebuf.com/articles/web/182280.html
https://blog.csdn.net/weixin_42277564/article/details/80641849