文件包含漏洞原理
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶意代码。
分类
本地文件包含
被包含的文件在本地服务器中。
远程文件包含
被包含的文件在第三方服务器中。
文件包含函数
a、include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出
一个警告并继续向下执行。
b、include_once():和include()功能相同,区别在于当重复调用同一文件时,程
序只调用一次。
c、require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止
运行。
d、require_once():和require()功能相同,区别在于当重复调用同一文件时,程序
只调用一次。
存在的风险
读取文件、写入文件。
实战
攻击目标
系统:Ubuntu16.04
IP:192.168.1.11
环境:Apache2+PHP7.2+mysql5.7
应用:DVWA
读取文件
使用…/…/…/…/…/…/etc/shadow读取本地账户信息
2、写入文件
使用input写入文件
如何防御
1、严格检查变量是否已经初始化。
2、严格判断包含中的参数是否外部可控。
3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。
4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("func.php")。
5、对所有输入提交可能包含的文件地址,包括服务器本地文件及远程文件,
进行严格的检查,参数中不允许出现../之类的目录跳转符。
6、可以通过调用str_replace()函数实现相关敏感字符的过滤,
一定程度上防御了远程文件包含。