文件包含漏洞学习
什么是文件包含漏洞
原理
web程序在处理文件包含功能时,没有进行严格的过滤和验证,导致用户可以通过构造特殊文件名,让服务器包含并执行一些恶意的文件,或者包含一些特殊的敏感文件,从而执行任意代码或获取一些敏感信息。
文件包含漏洞本质时一种注入型漏洞,我们通常把要执行的代码放在包含的文件中,文件中的任意代码都会被执行。
什么是包含?为什么要有包含这个功能?
我们以php为例,我们在写一段php代码的时候,通常会调用一些函数来实现我们想要的功能,但是不是所有我们想要实现的功能都能用已有定义的函数实现,所以就有了自定义函数等实现自己编程想法的功能,而文件包含的功能就是类似于这种的,php中的文件包含不在意文件的格式是什么类型的,只要文件中有可以解析的代码就都会被解析执行。
我们会将一些常用的代码段、函数或模板封装在一个文件中,等到需要应用到这个的时候我们就使用包含函数包含存放这些代码的文件,被包含的文件会被解析执行,这样做可以大量避免代码的复用率,减少代码的篇幅,也可以区块化管理代码,让维护更加简便但同时也衍生出了文件包含漏洞。
php中常用的包含函数
require():找不到被包含的文件会产生错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once():与require类似,区别是如果该文件的代码已经被包含,则不会再次包含
include_once():与include类似,区别是如果该文件的代码已经被包含,则不会再次包含
文件包含漏洞的类型
本地文件包含漏洞(LFI漏洞)
远程文件包含漏洞(RFI漏洞)
本地文件包含漏洞
在进行本地文件包含之前,我们要了解一下一些系统中的一些隐私文件的文件名和路径,这边就不说了
无限制文件包含漏洞
在实现文件包含的过程中,应用程序对用户输入的文件路径和名称没有进行任何限制或有效验证,导致攻击者可以随心所欲地让服务器包含任意文件,无论是服务器本地的系统文件、敏感信息文件,还是远程服务器上的文件。
我们通常利用../../ 来进行目录层级历遍,我们可以利用这个来跳跃目录层级,然后对目标文件进行包含执行
有限制文件包含漏洞
这个就是在上面的基础在实现文件包含的过程加上限制而已,原理都是一样的。那么有限制就有绕过,下面就是介绍几个绕过的手法