原理
在通过PHP的相应函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
文件包含漏洞的形成,需要满足两个条件:
1、用户能够控制这个动态变量
2、include()等函数通过动态变量的方式引入需要包含的文件
涉及包含文件的危险函数
include():包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
require():包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
include_once():和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require_once():和 require 类似,不同处在于 require_once 只导入一次。
文件包含漏洞又分为本地文件包含和远程文件包含
本地文件包含(LFI)
能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞
下面将用一道CTF题作为例子讲解
题目来源:南京邮电大学网络攻防训练平台
writeup
打开题目地址看到题目
这道题非常简单。根据提示是文件包含,而且是本地文件包含,所以直接在URL后添加?file=php://filter/read=convert.base64-encode/resource=index.php,读取到base64加密的index.php文件
base64解码,查看到flag
远程文件包含(RFI)
如果php.ini的配置选项allow_url_fopen,allow_url_include都为ON的话,文件包含函数是可以加载远程文件的,这种漏洞就被称为远程文件包含。利用这个漏洞,可以直接执行任意命令。
allow_url_fopen 是否允许打开URL文件
allow_url_include 是否允许引用URL文件
文件包含的各种写法
include $_GET[]
include $_GET[].”.inc”
include “./“.$_GET[]
include “./include”.$_GET[]
include “./include”.$_GET[].”.inc”
PHP伪协议
在文件包含漏洞中,可以使用PHP伪协议来构造语句进行漏洞测试
file协议
当存在某个用户可控制、并得以访问执行的输入点时,可以尝试输入file://去获取本地磁盘文件
使用方法:
www.test.com?file://C:windows/1.txt
php://filter
对本地磁盘文件进行读写
使用方法:
www.test.com?file=php://filter/read/convert.base64-encode/resource=./index.php
php://input
使用方法:
www.test.com?file=php://input[POST]<?php phpinfo();?>
data://
使用方法:
www.test.com?file=data://text/plain,<?php phpinfo();?>
文件包含漏洞的危害
1、敏感信息泄露
2、获取webshell
3、任意命令执行
文件包含漏洞修复
1、设置白名单
2、过滤危险字符
3、设置文件目录
4、关闭危险配置
来源:freebuf.com 2020-07-24 09:38:00 by: hahali
请登录后发表评论
注册