本篇文章用于巩固对自己文件包含漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: pikachu File Inclusion 文件包含漏洞 (皮卡丘漏洞平台通关系列)
链接: 【文件包含】文件包含漏洞知识总结
和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include(),require(),include_once(),require_once()
区别如下:
include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析。
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
6、做好管理员权限划分,做好文件的权限管理
进入关卡发现有一个下拉框,可以选NBA球星。
我们随机选一个进行点击,比如这里我选取Kobe,页面是下图这样,url是
http://www.pikachu.com:90/vul/fileinclude/fi_local.phpfilename=file1.php&submit=%E6%8F%90%E4%BA%A4
可见其中包含了一个文件file1.php,很可能是文件包含,并且既然是通过URL参数从前端传到后端的,那就是用户可以控制的了,如果再没有严格的过滤,就很可能有文件包含漏洞。
首先,由于观察到上图的filename是file1.php,猜测这里其他文件名可能也是个filex.php(x是数字)的格式。
把5个NBA球星都选一遍,发现文件名确实是file1.php~file5.php。
那有没有可能这套文件里面就有废弃或者隐藏的文件咧?
把burpsuite请出来爆破一下:
把下图这个请求报文send to intruder
然后像下面这样设置一下:
爆破位置设置为文件名中的数字,payload设置为Numbers,从6到100,步长为1,点start attack开始爆破
把爆破结果按照长度排个序,发现有如下四种长度,分别取代表file6.php、file7.php、file14.php、file100.php
盲猜应该file6.php有点东西。把上面4个文件名在浏览器地址栏试一下:
file6.php果然是个包含用户名和密码的隐藏文件
file7.php返回了报错,通过这个报错,可以知道fi_local.php中用来进行文件包含的函数是include(),并且包含的文件路径为与fi_local.php同文件夹下include文件夹中的文件。
file14.php和file100.php都是一样的报错信息,这里就不贴图了。
由上图可以看出网站根目录是: D:\study\apache-tomcat-8.5.33\xiaopi\phpstudy_pro\WWW\pikachu-master\
我们在此目录下写入一个shell.txt格式的php代码
上一部分已经分析过,上图报错信息泄露出include()函数包含的文件是与fi_local.php同文件夹下include文件夹中的文件,由于路径参数中有个固定的include/,因此就不能用绝对路径了。
结合报错信息中泄露的fi_local.php文件位置,可以算出相对路径为 …/…/…/shell.txt,代入url中组成payload:
(这里应该是两个点,但是由于csdn显示问题显示成3个点)
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=../../../shell.txt&submit=%E6%8F%90%E4%BA%A4
windows系统肯定有的文件是C:\Windows\win.ini,用这个来尝试有没有文件包含漏洞。
结合报错信息中泄露的fi_local.php文件位置,可以算出相对路径为C:/…/…/…/…/windows/win.ini,代入url中组成payload:
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=C:/../../../../Windows\win.ini&submit=%E6%8F%90%E4%BA%A4
在pikachu Unsafe Fileupload 不安全的文件上传(皮卡丘漏洞平台通关系列)的”三、getimagesize“关卡,上传了图片马,该图片马被重命名为7894046247af76131f8422881876.png,其内容包含下图所示的一句话木马。
上传图片马之后网页有回显文件保存位置的相对路径,与本关文件包含的路径对比可得相对路径,完整payload为:
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/04/02/7894046247af76131f8422881876.png&submit=%E6%8F%90%E4%BA%A4
用蚁剑连接:
这关的下拉框和local那关还是一样的,随便选一个,观察一下url有什么不同?
url中把include()函数的完整参数给出来了。
所以这关其实除了远程文件包含,还可以本地文件包含使用绝对路径
该文件内容如下,其作用是在fi_remote.php文件的同级目录下新建一个文件shell.php,并将一句话木马写入shell.php
' ); ?>
payload:
http://www.pikachu.com:90/vul/fileinclude/fi_remote.php?filename=D:\study\apache-tomcat-8.5.33\xiaopi\phpstudy_pro\WWW\pikachu-master\vul\fileinclude\shell.txt&submit=%E6%8F%90%E4%BA%A4
包含文件shell.txt
服务器请求shell.txt,由于确定有文件包含漏洞,此时test.txt应该被成功解析,在服务器上创建了一句话木马文件shell.php。