本文对PHP文件包含漏洞的形成、利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell。 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的。在利用php开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞,利用PHP文件包含漏洞入侵网站也是主流的一种攻击手段。 PHP文件包含漏洞介绍 首先,我们来介绍下何为文件包含漏洞。严格来说,文件包含漏洞是“代码注入”的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。“代码注入”的典型代表就是文件包含,文件包含漏洞可能出现在JSP、PHP、ASP等语言中,原理都是一样的,本文只介绍PHP文件包含漏洞。 要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件: Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件 用户能够控制该动态变量 在PHP中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的PHP代码会被执行。下面对它们之间的区别进行解释: include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。 include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。 require():1.require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。.使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到该函数时才调用。 require_once():它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。 现在来看一段简单的文件包含代码,如下图1所示。 图1 通过上面的代码可以看到,在得到变量$filename的值后没有经过任何处理,直接带入include()函数中。此处就存在一个文件包含漏洞,利用该漏洞我们可以查看系统中的任意文件。 下面我们来实际测试一下。首先将该PHP页面上传到Web服务器,先让其包含一个正常的txt文件,运行结果如下图所示。 图 接着我们在该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..0之后的版本中支持data:伪协议,可以很方便地执行代码。 包含Session文件。这部分需要攻击者能够控制部分Session文件的内容,PHP默认生成的Session文件一般存放在/tmp目录下。 包含日志文件。比如Web服务器的访问日志文件,这是一种通用的技巧。因为几乎所有网站都会将用户的访问记录到访问日志中。因此,攻击者可以向Web日志中插入PHP代码,通过文件包含漏洞来执行包含在Web日志中的PHP代码,下面的案例中就是利用该技巧成功获取到目标网站的WebShell的。但需要注意的是,如果网站访问量大的话,日志文件可能会非常大,这时如果包含一个这么大的文件时,PHP进程可能会卡死。一般网站通常会每天生成一个新的日志文件,因此在凌晨时进行攻击相对来说容易成功。 包含/proc/self/environ文件。这个也是一种通用的技巧,因为它根本不需要猜测被包含文件的路径,同时用户也能控制它的内容,常见的做法是向User-Agent中注入PHP代码来完成攻击。 利用PHP文件包含漏洞渗透某网站案例 上面我们详细地介绍了PHP文件包含漏洞的形成和测试,下面我们通过一个真实案例来讲解下如何利用PHP文件包含漏洞对目标网站进行渗透攻击。 目标网站:中国电信某业务系统 目的:获取到目标网站的WebShell 详细渗透过程如下: 1.发现漏洞 我们先来打开目标网站的一个URL看下,如下所示: URL:白癜风的偏方贵州白癜风医院
|