文件包含漏洞学习

什么是文件包含漏洞

原理

web程序在处理文件包含功能时,没有进行严格的过滤和验证,导致用户可以通过构造特殊文件名,让服务器包含并执行一些恶意的文件,或者包含一些特殊的敏感文件,从而执行任意代码或获取一些敏感信息。

文件包含漏洞本质时一种注入型漏洞,我们通常把要执行的代码放在包含的文件中,文件中的任意代码都会被执行。

什么是包含?为什么要有包含这个功能?

我们以php为例,我们在写一段php代码的时候,通常会调用一些函数来实现我们想要的功能,但是不是所有我们想要实现的功能都能用已有定义的函数实现,所以就有了自定义函数等实现自己编程想法的功能,而文件包含的功能就是类似于这种的,php中的文件包含不在意文件的格式是什么类型的,只要文件中有可以解析的代码就都会被解析执行。

我们会将一些常用的代码段、函数或模板封装在一个文件中,等到需要应用到这个的时候我们就使用包含函数包含存放这些代码的文件,被包含的文件会被解析执行,这样做可以大量避免代码的复用率,减少代码的篇幅,也可以区块化管理代码,让维护更加简便但同时也衍生出了文件包含漏洞。

php中常用的包含函数

require():找不到被包含的文件会产生错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once():与require类似,区别是如果该文件的代码已经被包含,则不会再次包含
include_once():与include类似,区别是如果该文件的代码已经被包含,则不会再次包含

文件包含漏洞的类型

本地文件包含漏洞(LFI漏洞)

远程文件包含漏洞(RFI漏洞)

本地文件包含漏洞

在进行本地文件包含之前,我们要了解一下一些系统中的一些隐私文件的文件名和路径,这边就不说了

无限制文件包含漏洞

在实现文件包含的过程中,应用程序对用户输入的文件路径和名称没有进行任何限制或有效验证,导致攻击者可以随心所欲地让服务器包含任意文件,无论是服务器本地的系统文件、敏感信息文件,还是远程服务器上的文件。

我们通常利用../../ 来进行目录层级历遍,我们可以利用这个来跳跃目录层级,然后对目标文件进行包含执行

我们用dvwa靶场试试看,源码:

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

我们包含本机桌面上的一个文件

我们包含的文件格式是txt文件,可以看到程序将文件中的内容输出出来了,其实也不是简单的输出,就是将文件内容解析执行了。我们包含一个存在phpinfo()的图片码

可以看到图片马中的php文件被执行了,我们同样也可以把phpinfo()写进去上面传参的txt文件中,php代码同样能被执行

但是我在实验相对路径包含的时候,单纯的用../../去替代包含不出来,我们尝试将图片马放在和网站文件同一个盘的根目录中,还是使用../去跳跃目录,但是如果跳跃的目录层级不够还是包含不到

我们可以尽量多地跳跃多层,因为文件是在根目录,所以无论多加几个../都没事

有限制文件包含漏洞

这个就是在上面的基础在实现文件包含的过程加上限制而已,原理都是一样的。那么有限制就有绕过,下面就是介绍几个绕过的手法

%00截断

这个方法要求php版本<5.3.4,所以一般只在题目中用得到。为什么需要使用%00截断呢,首先%00截断在ASCII码中表示null,在PHP版本<5.3.4且magic_quotes_gpc=off下,null会被当作字符串结束的标志,在一些有过滤和验证的web程序中,会对包含的文件后缀有限制,例如只允许包含.php和.inc格式的文件,这时我们就能使用%00截断,例如我们构造1.txt%00.php这样的payload,这样构造既能使包含的文件当作php文件执行,也能绕过包含文件格式的限制。这时候可能有疑问,为什么不把包含的文件直接定义成合法的格式就好呢?我们现在了解的是本地文件包含,我们是针对系统现有的文件进行包含,这些文件的格式是固定的,所以我们需要绕过。

长度截断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值