文件包含是代码注入的一种,其原理是注入一段用户能控制的脚本或代码,并让服务器端执行.文件包含可能出现在JSP,PHP,ASP等语言中.
PHP:include(),include_once,require(),require_once(),fopen(),readfile()...
JSP:ava.io.File(),java.io.FileReader()...
ASP:include file,include virtual...
文件包含是PHP的一种常见用法,主要由四个函数完成:
当使用这四个函数包含一个新的文件时,该文件讲作为PHP代码执行,PHP内核并不会在意被包含的文件时什么类型(如果被包含的文件时txt.jpg等,也作为PHP代码执行)
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行.
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(简称LFI)
文件包含漏洞能够读取敏感文件或服务器端脚本的源代码,从而为攻击者进一步攻击奠定基础,这种使用了"../../"来返回到上层目录中的方式,又被称为目录遍历
// 测试代码
<?php
$filename = $_GET[‘filename‘];
include($filename);
?>
// 通过目录遍历漏洞可以获取到系统中其他文件的内容:
http://127.0.0.1/file.php?filename=../../../etc/passwd
如果PHP的配置选项allow_url_include为NO的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含(EFI)
远程文件包含可以用来执行任意命令,如包含远程恶意代码
// 测试代码
<?php
echo system("ver;");
?>
// 通过远程文件包含可以获得命令执行:
http://127.0.0.1/file.php?filename=http://127.0.0.1/test.php
原文:https://www.cnblogs.com/Frieza/p/14596500.html