网站安全(7) —— PHP文件包含漏洞介绍

  其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。文件包含漏洞可能出现在JSP、PHP、
ASP等语言中,原理都是一样的,本文只介绍PHP文件包含漏洞。

  

  要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件:

  1. Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件 (文件包含函数还有
include_once()、require()、require_once())

  2. 用户能够控制该动态变量

  现在来看一段简单的文件包含代码:

?





1

2

3

<?php

$filename
= $_GET[‘filename‘];

include($filename);

  通过上面的代码可以看到,在得到变量$filename的值后没有经过任何处理,直接带入include()函数中。此处就存在一个文件包含漏洞,利用该漏洞我们可以查看系统中的任意文件。

下面我们来实际测试一下。首先将该PHP页面上传到Web服务器,先让其包含一个正常的txt文件,运行结果如下图2所示。

 图2

接着我们在该txt文本中插入php代码,看结果如何?这里给其插入如下图3所示代码。

图3

再次访问,结果如下图4所示。

图4

通过上图我们可以看到文本中的PHP代码被成功执行了。

利用该漏洞,我们可以查看系统中的任意文件,比如经常用到的“/etc/passwd”文件,如图5所示。

图5

PHP文件包含漏洞分为

一、本地文件包含漏洞(LFI):能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞。利用本地文件包含漏洞,可以查看系统任意文件内容,如果具备一些条件,也可以执行命令。在下面的漏洞利用技巧部分对这个有详细介绍。

二、远程文件包含漏洞(RFI):如
果php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,则文件包含函数是可以加载远程文件的,这种
漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行任意命令。在实际渗透攻击过程中,攻击者可以在自己的Web服务器上放一个可执行的恶意
文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的。

文件包含漏洞利用技巧

远程文件包含漏洞之所以能够执行命令,就是因为攻击者可以自定义被包含的文件内容。因此,本地文件包含漏洞要想执行命令,也需要找一个攻击者能够控制内容的本地文件。

目前主要有几下几种常见的技巧:

包含用户上传的文件。这个很好理解,也是最简单的一种办法。如果用户上传的文件内容中包含PHP代码,那么这些代码被文件包含函数加载后将会被执行。但能否攻击成功,取决于上传功能的设计,比如需要知道上传文件存放的物理路径,还需要上传的文件有执行权限。

包含data://或php://input等伪协议。这需要目标服务器支持,同时要求allow_url_fopen为设置为ON。在PHP5.2.0之后的版本中支持data:伪协议,可以很方便地执行代码。

包含Session文件。这部分需要攻击者能够控制部分Session文件的内容,PHP默认生成的Session文件一般存放在/tmp目录下。

包 含日志文件。比如Web服务器的访问日志文件,这是一种通用的技巧。因为几乎所有网站都会将用户的访问记录到访问日志中。因此,攻击者可以向Web日志中
插入PHP代码,通过文件包含漏洞来执行包含在Web日志中的PHP代码,下面的案例中就是利用该技巧成功获取到目标网站的WebShell的。但需要注
意的是,如果网站访问量大的话,日志文件可能会非常大,这时如果包含一个这么大的文件时,PHP进程可能会卡死。一般网站通常会每天生成一个新的日志文
件,因此在凌晨时进行攻击相对来说容易成功。

包含/proc/self/environ文件。这个也是一种通用的技巧,因为它根本不需要猜测被包含文件的路径,同时用户也能控制它的内容,常见的做法是向User-Agent中注入PHP代码来完成攻击。

PHP文件包含漏洞防范

本部分主要从代码层和Web服务器安全配置两个方面来讲解PHP文件包含
漏洞的防范。首先来从代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。一种保险的做法是采用“白名单”的方式将允许包含的文
件列出来,只允许包含白名单中的文件,这样就可以避免任意文件包含的风险
,可参考下面图10所示的代码实现。

  图10

还有一种做法是将文件包含漏洞利用过程中的一些特殊字符定义在黑名单中,对传入的参数进行过滤,但这样有时会因为过滤不全,导致被有经验的攻击者绕过。


Web服务器安全配置方面可以通过设定php.ini中open_basedir的值将允许包含的文件限定在某一特定目录内,这样可以有效避免利用文件包
含漏洞进行的攻击
。需要注意的是,open_basedir的值是目录的前缀,因此假设设置如下值:open_basedir=/var/www
/test,那么实际上以下目录都是在允许范围内的。

/var/www/test

/var/www/test123

/var/www/testabc

如果要限定一个指定的目录,需要在最后加上“/”,这一点需要特别注意。

open_basedir=/var/www/test/

如果有多个目录,在Windows下目录间用分号隔开,在Linux下面则用冒号隔开。

文章转自:http://www.rising.com.cn/newsletter/news/2013-04-25/13587.html

时间: 2024-10-28 06:15:43

网站安全(7) —— PHP文件包含漏洞介绍的相关文章

PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的一种攻击手段.本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细的分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. 1. PHP文件包含漏洞介绍 首先,我们来介绍下何为文件包含漏洞.严格来说,文件包含漏洞是“代码注入”的一种

pikachu学习——Files lnclusion(文件包含漏洞)

File Inclusion(文件包含漏洞)概述: 文件包含,是一个功能.在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件. 比如 在PHP中,提供了: include(),include_once() require(),require_once() 这些文件包含函数,这些函数在代码设计中被经常使用到. 大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题. 但是,有些时候,文件包含的代码文件被写成了一个变量,且

PHP文件包含漏洞总结

0x00 前言 PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入.最常见的就属于本地文件包含(Local File Inclusion)漏洞了. 我们来看下面一段index.php代码: if ($_GET['func']) { include $_GET['func']; } else { include 'default.php'; } 程序的本意可能是当提交url为http:

文件包含漏洞原理分析

文件包含这个漏洞,用我自己的话来说就是程序员在网站设计中,为方便自己在设计构架时,使用了一些包含的函数,就像'文件包含'这几个字的字面意思一样,在文件中,包含一个文件. 我在总结这篇文章的时候看了,其他人总结的,感觉别人总结的很是详细,就像一开始我只认为包含只有PHP代码中才存在,后来我再整理复习的时候,才发现,包含这个漏洞在各大语言中,都存在的,只不过现在大部分网站都是PHP网站,所以存在这个漏洞的几率大一点,好了不废话了,我开始整理了. 文件包含 程序开发人员一般会把重复使用的函数写到单个文

DVWA篇四:文件包含漏洞

1      测试环境介绍 测试环境为OWASP环境中的DVWA模块 2      测试说明 2.1  什么时远程文件包含漏洞 什么才是"远程文件包含漏洞"?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的. 涉及到的危险函数:include(),require()和include_once(),require_once() Include:包含并运行指定文件,当包含外部文件

10_文件包含漏洞(属于任意代码执行)

一.背景介绍 随着网站业务的需求,web脚本可能允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式. 二.漏洞成因 文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入.当被包含的文件在服务器本地时,就形成的本地文件包含漏洞.被包含的文件在第三方服务器时,就形成了远程文件包含漏洞. 本地到

php文件包含漏洞(allow_url_include=Off)的绕过方法

分享几个当allow_url_include = Off时的文件包含漏洞的绕过方法. 假设服务端的php代码(aaa.php)如下图所示: 第1种:smb协议 Payload:http://127.0.0.1/aaa.php?path=\\43.5*.**.74\ica\abc1238.htm 这种方法只适用于Windows类型的网站服务器,不能用于Linux服务器. 首先在VPS上搭建Samba服务,然后添加一个无需认证即可访问的共享目录,配置信息如下图所示: 然后在/home/share目录

【DVWA(九)】文件包含漏洞

文件包含漏洞 前言: 由于开发人员编写源码,将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执行.由于并没有针对代码中存在文件包含的函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行.文件包含攻击中WEB服务器源码里可能存在inlcude()此类文件包含操作函数,通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因. 如果攻击者为动态包含指令指定一个有效文件,那么该文件的内容会被传递给 PHP 解析器,

2019-11-12:Discuz3.2漏洞文件包含漏洞复现

*文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. Discuz3.2漏洞文件包含漏洞复现,由于创建专题时未对 ,静态化名称,做任何限制引发此漏洞问题,问题出在代码中的函数check_seccode(),该函数在/source/class/helper/helper_seccheck.php中,作用是检查验证码是否正确.在后台的防灌水功能中可以设置验证码类型,对应的变量是$_G['setting']['seccodedata']['