目录
文件包含
文件包含函数
文件包含漏洞原理
文件包含的分类
LFI-本地文件包含
RFI-远程文件包含
基于pikachu靶场练习
本地文件包含
远程文件包含
防御
文件包含
文件包含是程序员将需要重复调用的函数写入一个文件,对该文件包含时的操作,如导航栏,尾部栏
文件包含函数
这些是基于代码开发层面的设计,也是文件包含漏洞能否利用的关键
- include:在包含文件时,如果找不到包含的文件,它只会产生告警,页面的解析过程不会停止
- include_once:如果文件的代码已经被包含,则不会再次被包含,避免出错---只包含一次
- require:在包含文件时,如果找不到包含的文件,则会产生一个致命的错误(fatal error),页面 解析就会停止
- require_once
文件包含漏洞原理
没有对文件包含函数中的参数进行规范定义,导入了恶意文件,执行攻击代码。文件包含并不属于漏洞,但是,由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
文件包含的分类
LFI-本地文件包含
- 所包含文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
- 所包含文件内容不符合PHP语法规范,会暴露其源代码(相当于文件读取)。
- 常用于敏感文件读取
RFI-远程文件包含
本质与LFI相同,但是其能利用远程控制的方法结合蚁剑能更便于攻击
基于pikachu靶场练习
本地文件包含
通过下拉菜单选择球星实际是发送不同的get请求回显对应内容,文件包含漏洞的关键是文件包含函数(include/require)身份对参数有严格定义,因此我们是要找到能调用文件包含的php文件
发现参数的变化是有规律的file?,所以我们可以把这个数值设定为payload进行爆破,通过长度我们进入file7
通过的报错内容得知:调用file7.php时失败因为../fi_local.php没有file7.php这个路径,那我们就先找到这个fi_local
1.if(isset($GET['submit']) && $GET['filename']!=null)---isset()函数是检测变量是否引用且是否为0,这两个变量正是对应url中的两个参数。$_GET[' ']这是超全局变量,用于访问通过 HTTP GET 方法传递给当前脚本的参数。
2.include "include/$filename"---这是23行的内容也是漏洞的成因,因为将用户的get请求中的参数直接无条件的放入include语句去执行。当然漏洞修复在文档中也给出就是使用严格的白名单制,拒绝执行未知变量。
------------------------------
以上是确定漏洞的存在 现在就能利用了
输入路径时要用相对路径../代表上一级父目录,因为作为攻击者是很难完整掌握攻击主机的绝对路径,因此相对路径也提供了试错的更多可能性
远程文件包含
前提条件,设置完后必须要重启apache服务
我们先验证一下能否支持远程访问文件,注意需要把文件放在www目录或其子目录下,因为输入的IP就是指向的WWW目录。
如果要借助蚁剑工具现在就能写一个一句话木马然后生成php文件了,
<?php file_put_contents('s.php','<?php @eval($_REQUEST["password"]);?>'); ?>
但是这里我们选择file_put_contents
函数,用于将一个字符串写入文件,通过url
访问看似正常的文件文件时自动生成php恶意代码
注:.php文件生成的路径是url的对应的路径
url访问该txt 就会触发php代码生成s.php文件且该文件包含一个 eval()
函数,这个函数会执行通过 $_REQUEST
(POST)数组接收到的任何代码。