浅谈文件包含漏洞

导语:文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序。当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行时执行的文件。

文件包含漏洞的出现及危害

文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序。当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行时执行的文件。如果一个文件包含这个漏洞,为了方便起见,经常在开发阶段就实施。由于它经常用于程序开发阶段,所以这就为后来的攻击埋下了伏笔并导致了各种基于文件的攻击。

文件包含漏洞主要是程序员把一些公用的代码写在一个单独的文件中,然后使用其他文件进行包含调用,如果需要包含的文件使用硬编码,一般是不会出现安全问题,但是有时可能不确定需要包含哪些具体文件,所以就会采用变量的形式来传递需要包含的文件,但是在使用包含文件的过程中,未对包含的变量进行检查及过滤,导致外部提交的恶意数据作为变量进入到了文件包含的过程中,从而导致提交的恶意数据被执行。

文件包含漏洞分为本地文件包含(Loacl File Inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)。这种漏洞貌不惊人,却危害很大。通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解。若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制。另外不管是本地文件包含还是远程文件包含,文件包含漏洞还可能导致执行任意代码。

本地文件包含

本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。

首先,当值可以直接被控制时,你就会有一个非常类似的如下的代码片段。


如果你可以找到上面的代码,那么就有一个直接包含的$文件,你可以控制它。

请注意:该文件可以是任何类型,无论它是被删除的文件类型、图片还是任意的内容,都包括在内。

首先,在当前文件夹中创建任意后缀的任意文件,如:file.txt(即使是像file.jpg这样的图片格式,则会产生以下效果)。

将文件的内容设置为:


此时,文件包含漏洞还包含当前服务器中的其他文件,同时支持包含Web应用程序的目录,如下所示:

尝试包括你的硬盘的一些内容,例如:C:\WINDOWS\system.ini。

如果你这样做,就可以在浏览器上看到任何文件的输出内容。

这只有当你有完全控制和文件类型没有进一步指定时才有效。

那么,如果代码片段变成如下这样,你该怎么做?


在这种情况下,你可以尝试按照上面的方法:

这将导致以下的输出:

你可以看到,如果后缀是固定的,就像上图一样,你不会找到前面包含的文件。

搜索的文件名是:./Include.txt.php。

所以这里有另一种方法:%00到达时截断一个字符串。这个技巧也被广泛应用于不同的领域,我不会在这里再详述,如果想详细了解,请点此

在PHP中使用%00:

1.PHP版本<5.3(不包括5.3);

2. PHP `magic_quotes_gpc = off`;

3.PHP不会在收到的参数中使用addslashes函数,例如上面代码中的$ _GET ['file'],不过在PHP版本5.3或更高版本中,此问题已得到解决。

如果打开gpc或者使用了加法器函数,序列将被正确地转义。

首先,你可以尝试如果gpc打开会发生什么(效果与使用该函数相同)。

如果你启用了gpc标志,你可以直接看到这个过程是如何发生的。

接下来可以看看5.3版本中的情况:

这里也没有明显的效果。

所以你可以看到,只要满足上述三个条件,就可以使用%00。

首先,你要将PHP版本更改为5.2,并在php.ini更改为 magic_quotes_gpc = on tomagic_quotes_gpc = off.后重新启动Apache。

这使你就能够在尝试时使用截断。

这时可以看到,你已经成功地使用了其中的截断。

那么文件只包含了包含的功能吗?当然不是,之所以会这样,是因为你可以控制可以包含的内容。

你可以创建一个文件:shell.txt来进一步利用这个漏洞。

你可以看到,其中也包括了shell。

那么两者有什么区别呢?其实没有什么区别,原理是一样的,但是第一个是用后缀来介绍的,第二个是固定在程序后缀后面的。但是可以使用%00,因为当程序流(program stream )遇到%00终止符(terminator)时它会直接终止。

远程文件包含

远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码。

本地文件包含与远程文件有着相同的原理,但前者只能包含服务器上存在的文件,而后者可以包含远程服务器上的文件。

对于远程文件,你需要考虑以下2点:

1.在php.ini中需要allow_url_include = on和allow_url_fopen= on

2.所需的远程文件后缀不能与目标服务器的语言相同,如目标服务器解析PHP代码,则远程文件后缀不能为.php。

让我解释一下第二点,如果你的远程文件具有.php后缀,并且你的远程文件内容如下所示:


那么在远程服务器执行phpinfo()之后,你就可以获得目标服务器的内容。由于它不会运行代码,所以包含的信息不是目标服务器,而是远程服务器。

如下所示:

这是我的PHP5.6版本的远程设备信息,目标设备是5.2版本。

接下来是包含文件:

你可以看到,包含文件后,你的远程设备发生了变化,这是为什么呢? 

由于目标服务器不包含此代码:


此时,远程服务器会执行此代码的源代码,如下所示:

所以为了使这个攻击开始运行,你需要做一些修改:

1.修改配置

2.修改文件后缀

此时,你可以再来尝试一下包含的攻击向量:

那么你可以看到所需的信息在此包含之后返回,并且你的目标设备信息不再改变。

接下来,你要再次为远程文件包含做一个shell示例。

远程文件包含使用的前提是,符合本地文件包含的前提并符合远程文件包含其可用性的前提。

文件包含许多伪协议

文件中可以包含不同的伪协议,我将在下面演示其中的一些:

1.data:text/plain or data: text/plain; base64 2.php://input 3.php://filter 4.file:// 5.zip://

其他协议可以在官方文档中找到。

data:text/plain

输出直接显示在相应的URL中,显示参数:data:text / plain。

然后你需要执行如下所示的php代码:

data:text/plain; BASE64

有另一种方法来使用data: text/plain; base64,不过此时你需要使用base64编码来执行PHP代码,base64php代码如下所示:

## php://input

php://input访问请求的原始数据的只读流(read-only stream),会将post请求中的数据作为php代码执行。

你可以看到程序自动添加了一个.php后缀,因此使用包括php://input,将自动添加.php,所以它肯定不能正常工作。

此时,你可以参考以上的%00技巧来截断文件路径。

你可以看到终止符(terminator)是非常强大的。

php://filter

php://filter可以读取php文件的代码base64编码的输出并将其返回给你。

例如,你想读取一个PHP文件,但不希望它是正常的PHP。你可以通过php://filter/read=convert.base64-encode/resource=

../ 读取文件代码的内容。

解码base64后,你可以像正常情况一样获取内容:

file://

file://用于访问本地文件系统,不受allow_url_fopen orallow_url_include的影响,你可以使用file:// absolute / path / to / file来获取。

zip://

zip://可以访问zip文件中的文件,但它需要一个绝对路径。你可以使用zip://[archive absolute path] # [compressed file name]在本地创建一个文件并将其压缩到一个zip压缩文件中。

此时,你就可以填入绝对路径和文件的名称了。那么,你可能会有两个疑问?

为什么你不能成功显示包括zip://的错误?

这其中就包含zip://C:/phpStudy/WWW/include/phpinfo.zip.php,这是因为你不想包含这个文件,而是想把这个文件包含在zip里。

为什么是#以后的值?

因为#会忽略它后面的参数,所以你需要在表单中使用%23。还有一点就是,包含的文件以.php结尾,但你压缩了php后缀的文件。

所以如下所示,你不需要这个后缀。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • http://tieba.baidu.com/p/2310282657 什么是”远程文件包含漏洞”?服务器通过ph...
    查无此人asdasd阅读 1,926评论 0 2
  • 一、什么才是”远程文件包含漏洞”? 回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来...
    喜欢吃栗子阅读 2,586评论 1 4
  • 文件转载自https://blog.csdn.net/chence19871/article/details/51...
    许胖子阅读 360评论 0 0
  • 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直...
    付出从未后悔阅读 1,097评论 0 4