什么是文件包含?在文件包含里面,我们要想方设法把真正包含的文件掉包,换成恶意文件,服务器却不知道。
文件包含:是一种代码处理方式,当一个代码文件想要引用另外一个代码文件,就要用到包含,常见的包含函数有include、require等,参数是文件名。但是如果文件包含的参数用户可控且过滤不严,被攻击者偷梁换柱。
LOW等级:
首先进行正常的操作:点击fil1和file2时,仅仅是配置参数的变化,而其他并没有变化,这个参数便是可以利用的。
首先进行尝试,将这个参数随便改成test.php,显示找不到文件,证明这个参数是可以利用的。如图可以看到错误信息,同时爆出来web的绝对路径。
思考:之前的file1.php、file2.php、file3.php肯定是在一个目录中的,而这个目录加上这个文件名形成了绝对路径,这个目录我们已经在出错信息里面找到了,所以这个include函数如下图所示。
进一步思考,如果我们要包含根目录里面的php.ini文件,就要跳转到上两级目录,如下图所示:
在浏览器中,php.ini的文件成功读取:
接下来思考如何进行攻击:
1、本地文件执行:
尝试读取DVWA跟目录下面的phpinfo.php文件,如图所示,表明了文件包含不仅仅能读取文件,换能够执行文件。
2、远程文件执行:
在DVWA跟目录下面放一个phpinfo.txt文件,然后进行远程包含:如下图所示,说明是可以远程包含php文件的,而且非php的文件,只要里面包含了php格式的代码都可以正常执行。经过进一步尝试远程的phpinfo.php文件也可以执行,但两者的区别是.txt显示的是DVWA的域名,而.php文件显示的是本地127.0.0.1。我们要清楚远程的执行不是在攻击者的web服务器上执行,而是在受害者web服务器上执行命令,所以phpinfo.txt才是正经。
攻击思路:a现在要攻击b,攻击者首先在a上传有webshell代码的文本文件,得到URL,找到b的文件包含漏洞,就成功地执行了webshell,获得了b的web权限。
Medium等级:
1、本地文件执行:
首先进行本地包含,在这个等级,发现刚刚的../没用了,经过测试观察报错信息,发现输入../报错信息里面不出现,说明这个等级过滤了../,但我们可以使用..\
如图所示,成功读取
2、远程文件包含:
接下来进行远程包含,发现同样被过滤了,经过不断的判断,观察出错信息,发现服务端只将http://作为整体进行过滤,如图所示采用双写的方法可成功绕过。
High等级:
1、本地文件包含:
前面两种方法都不行,经过测试,观察出错信息,发现page参数只认file开头的文件,其他的则提示找不到文件。
所以我们可以利用file 协议:在file://后面加上物理路径即可,成功查看php.ini里面的内容。
随便读取D盘下面的phpinfo.txt文件可成功执行:
远程文件执行:前面两种方法失效,经过验证同样只支持file开头的字符串,而file协议只支持本地文件,远程的不支持,所以就需要有一种方法将远程的文件上传到服务器上,所以这里要结合文件上传漏洞,然后进行本地文件执行。
防御:
白名单