首页 > 代码库 > 文件包含漏洞原理分析

文件包含漏洞原理分析

文件包含这个漏洞,用我自己的话来说就是程序员在网站设计中,为方便自己在设计构架时,使用了一些包含的函数,就像‘文件包含‘这几个字的字面意思一样,在文件中,包含一个文件。

我在总结这篇文章的时候看了,其他人总结的,感觉别人总结的很是详细,就像一开始我只认为包含只有PHP代码中才存在,后来我再整理复习的时候,才发现,包含这个漏洞在各大语言中,都存在的,只不过现在大部分网站都是PHP网站,所以存在这个漏洞的几率大一点,好了不废话了,我开始整理了。

文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。


程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。


几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,
而在JSP、ASP、程序中却非常少,甚至没有,这是有些语言设计的弊端。


在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

常见的函数

  • PHP

include() , include_once() , require_once() , fopen() , readfile() ....

  • jsp/Servlet

ava.io.file() , java.io.filereader() ....

  • asp

include file , include virtual ....

就先列这些把,我们主要以PHP为例子,来讲解文件这个漏洞。

文件包含漏洞,分为本地包含,和远程包含。

本地包含故名思议,就是在网站服务器的本身存在恶意文件,然后本地包含使用。

远程包含,就是调用其他网站的恶意文件进行打开。

下面来先说说,常见PHP包含函数的意思:

include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
include_once()require_once():若文件中代码已被包含则不会再次包含

我们主要以第一个为例子,include()这个函数,本地包含。

首先先搭建环境,我先写了一个简单的存在include()这个函数的PHP代码,用 id来当接受值。

技术分享

然后在同目录下,创建一个txt文件,然后写个代码,在include()这个函数接受过来的都会以PHP代码来处理。

技术分享

看吧,是同一个文件目录下。

技术分享

我打开浏览器,进行本地包含测试。

技术分享看吧,包含成功了,输出了 shiyan ,也就是我的昵称,哈哈!

那么是不是说,我把那个c.txt的文件内容,写成我的一句话,是不是就可以拿shell了?

技术分享

简单的替换成我的一句话,然后开始连我的菜刀看看,能不能成功。

技术分享

好吧,成功了,这就是本地包含,大家发现了没有,我包含的文件不管什么格式,都是以该语言执行的,这里就是PHP代码执行。

下面我开始说说远程包含这个例子。

远程包含,要保证php.ini中allow_url_fopen和allow_url_include要为On,也就是打开状态。

我了个擦类,,,我光打开 allow_url_include 我打开了三遍,就是一直远程包含不成功,,,我看了下 allow_url_include 状态,一直是off,我还很TM纳闷,后来我想开了,我没重启下,,,,擦了!!!!

技术分享

这是关闭状态。

技术分享

我把它给打开了,但是它就显示没打开,然后我就又......

技术分享

我就又.......

技术分享

再又......

技术分享

还是显示的没打开,我就怒了,后来仔细一想,我是不是没有重启的原因,,,然后就重启了下,,,,就打开了。。。。。tmd。。。我这脑筋。。。。。

技术分享

好了,开始演示远程包含!!!哈哈!!!

我就不多演示了,反正和本地包含差不多,只不多把包含的东西换成外网的链接就行了,我就以一张图概括远程包含这个原理。

技术分享

总结:

文件包含的原理,就是这么个意思,但是确实很危险的漏洞,想想除了能 getshell, 我们还能利用这个漏洞干很多事情了,这里就不一一举例, 我就总结个原理,其实我主要是我朋友现在催着我去驾校预约了,,,不扯了,赶紧把这个原理总结完了,我走了。。。

文件包含漏洞原理分析