本质
本质和SQL注入相同,都是输入一段用户可以控制的脚本或代码,让服务器执行
包含就比如把函数写在一个文件里,调用函数时直接用文件
文件包含漏洞就是攻击者修改了文件的位置,让后台执行任意文件
函数
(PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛应用于Web开发的开源脚本语言)
以PHP为例,常用的文件包含函数有以下四种
include(),require(),include_once(),require_once()
以下是对PHP中这四种常用文件包含函数的详细介绍:
1.include()
- 功能:
- 用于在当前PHP文件中包含并执行指定的文件。如果包含的文件不存在,会产生一个警告( E_WARNING ),但脚本会继续执行
2.require()
- 功能:
- 与include()类似,也是在当前PHP文件中包含指定文件并执行其中的代码。但如果指定文件不存在,会产生一个致命错误( Fatal error ),脚本会立即停止执行。
3.include_once()
- 功能:
- 其功能基本等同于include(),但它会在包含文件之前先检查该文件是否已经被包含过。如果已经被包含过,就不会再次包含,从而避免了重复包含可能导致的函数重定义、变量重新赋值等问题。
4.require_once()
- 功能:
- 结合了require()和include_once()的特点。如果指定文件不存在,会产生致命错误导致脚本停止执行;并且在包含之前会检查文件是否已被包含过,若已包含则不再重复包含。
在实际开发中,根据具体需求来选择合适的文件包含函数。如果希望即使包含文件失败脚本也能继续运行(可能提供一些降级处理),可以使用include()或include_once();如果包含文件是脚本正常运行必不可少的,就应该使用require()或require_once()。
php伪协议
PHP伪协议是一种利用PHP的一些特性来进行特定操作的方式,它允许以类似协议的形式来处理各种不同类型的数据或执行特定功能,以下是一些常见的PHP伪协议介绍:
1.file://
- 用途:
- 用于访问本地文件系统中的文件。它的格式一般为 file:///path/to/file ,其中 /path/to/file 是本地文件的实际路径。
- 示例:
php
<?php
$content = file_get_contents('file:///etc/passwd');
echo $content;
?>
上述代码通过 file:// 伪协议读取了 /etc/passwd 文件的内容(在类Unix系统中,该文件包含了系统用户的基本信息)。
2.http:// 和 https://
- 用途:
- 用于从远程服务器获取网页内容或其他资源,就如同在浏览器中访问网页一样。可以通过函数如 file_get_contents() 等来使用。
- 示例:
php
<?php
$html = file_get_contents('http://example.com/index.html');
echo $html;
?>
这里通过 http:// 伪协议获取了 example.com 网站的首页内容。
3.ftp://
- 用途:
- 用来访问FTP服务器上的资源。可以进行文件的读取、上传、下载等操作(具体取决于所使用的PHP函数和FTP服务器的权限设置)。
- 示例:
php
<?php
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'username', 'password');
$content = ftp_get_contents('ftp://ftp.example.com/path/to/file');
ftp_close($conn);
echo $content;
?>
此示例先连接到指定的FTP服务器,登录后通过 ftp:// 伪协议获取了服务器上指定文件的内容。
4.data://
- 用途:
- 是一种比较特殊的伪协议,它允许在代码中直接嵌入数据并进行处理。可以嵌入文本数据、PHP代码等,然后通过相关函数进行相应操作。
- 示例:
php
<?php
// 嵌入PHP代码并执行
$code = '<?php echo "Hello from data:// protocol";?>';
eval(file_get_contents('data://text/plain;base64,'.base64_encode($code)));
?>
在这个例子中,先将一段PHP代码进行 base64 编码,然后通过 data:// 伪协议将编码后的代码嵌入并利用 eval( 函数执行。
5. php://
- 用途:
- 这是一组功能多样的伪协议,其中包含多个子协议,比如 php://input 、 php://output 、 php://filter 等,用于在PHP内部进行各种操作,如读取输入流、写入输出流、过滤数据等。
- 示例:
php
<?php
// 使用php://input读取POST请求的原始内容
$input = file_get_contents('php://input');
echo $input;
?>
这里通过 php://input 读取了POST请求的原始内容。
PHP伪协议在正常开发中有很多合法的应用,比如方便地获取远程资源、处理本地文件等,但如果被恶意利用,也可能会带来安全风险,比如通过 data:// 伪协议执行恶意代码等,所以在开发过程中要注意防范相关风险。