PHP文件包含漏洞的形成、利用技巧及防范进行了
2021-10-18
摘要:本文对PHP文件包含漏洞的形成、利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell。
本文详细分析了含有漏洞的PHP文件的形成、利用技术和防范,并通过一个真实案例演示了如何利用含有漏洞的PHP文件对目标网站进行渗透测试,最终成功获取该网站。
PHP是一种非常流行的Web开发语言,网上很多Web应用都是用PHP开发的。在使用PHP开发的Web应用中,包含漏洞的PHP文件是一个常见的漏洞,利用PHP文件包含漏洞入侵网站也是一种主流的攻击方式。
PHP文件包含漏洞介绍
首先介绍一下什么是包含漏洞的文件。严格来说,文件包含漏洞是一种“代码注入”。其原理是注入用户可以控制的脚本或代码,让服务器执行。“代码注入”的典型代表是文件包含。文件包含漏洞可能出现在JSP、PHP、ASP等语言中,原理是一样的。本文仅介绍PHP文件包含漏洞。
为了成功利用文件包含漏洞进行攻击,需要满足以下两个条件:
1.Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件
2.用户能够控制该动态变量
在 PHP 中,有四个用于包含文件的函数。当这些函数用于包含文件时,将执行文件中包含的 PHP 代码。它们之间的区别解释如下:
():当使用该函数包含一个文件时,只有在执行到()函数的代码时才会包含该文件。当发生错误时,只会给出警告,并继续执行。
():功能与()相同,不同之处在于重复调用同一个文件时,程序只调用一次。
():1.()和()的区别在于,如果()的执行发生错误,函数会输出错误信息并终止脚本。2. 当使用()函数包含一个文件时,程序一执行就会立即调用该文件,只有在程序执行到该函数时才会调用()。
():它的功能和()一样,不同的是在重复调用同一个文件时,程序只调用一次。
现在看一个包含代码的简单文件,如下面的图 1 所示。
图1
从上面的代码可以看出,得到变量$的值后,直接带入()函数中,不做任何处理。存在一个包含漏洞的文件,我们可以利用这个漏洞查看系统中的任何文件。
让我们实际测试一下。首先将PHP页面上传到Web服务器,让它包含一个普通的txt文件。操作结果如下图2所示。
图2
然后我们把php代码插入到txt文本中,看看结果?插入如下图 3 所示的代码。
图 3
再次访问,结果如下图4所示。
图 4
从上图可以看出,文中的PHP代码执行成功。
利用该漏洞,我们可以查看系统中的任意文件,例如常用的“/etc/”文件,如图5所示。
图 5
PHP文件包含漏洞分为本地文件包含漏洞(LFI)和远程文件包含漏洞(RFI)。可以打开和包含本地文件的漏洞称为本地文件包含漏洞。使用本地文件包含漏洞,可以查看系统中任意文件的内容,也可以在有条件的情况下执行命令。这在下面的漏洞利用技术部分中有详细描述。
如果php.ini 的配置选项为ON,则文件包含功能可以加载远程文件。这种漏洞称为远程文件包含漏洞。使用远程文件包含漏洞,可以直接执行任意命令。在实际渗透攻击过程中,攻击者可以在自己的Web服务器上放置一个可执行的恶意文件,通过目标网站中包含漏洞的远程文件加载该文件php代码执行漏洞,从而达到执行任意命令的目的。
文件包含漏洞利用技术
远程文件包含漏洞之所以能够执行命令,是因为攻击者可以自定义包含文件的内容。因此,如果本地文件包含漏洞,如果要执行命令,还需要找到攻击者可以控制内容的本地文件。
目前常用的技术有以下几种:
包含用户上传的文件。这很容易理解,也是最简单的方法。如果用户上传的文件内容包含PHP代码,这些代码会在被文件函数加载后执行。但是,攻击的成功取决于上传功能的设计。例如,您需要知道上传文件存储的物理路径,还需要对上传文件具有执行权限。
包含伪协议,例如 data:// 或 php://。这需要目标服务器支持,并且需要设置为ON。PHP5.2.0之后的版本,支持data:伪协议,方便代码执行。
包含文件。这部分要求攻击者能够控制某些文件的内容。PHP默认生成的文件一般存放在/tmp目录下。
包含日志文件。例如,Web 服务器的访问日志文件是一种常用技术。因为几乎所有的网站都会记录用户的访问访问日志。因此,攻击者可以通过文件包含漏洞将PHP代码插入到Web日志中,并执行Web日志中包含的PHP代码。在以下案例中,该技术用于成功获取目标网站。但需要注意的是,如果网站访问量很大,日志文件可能会非常大。这时候如果包含这么大的文件,PHP进程可能会卡住。一般的网站通常每天都会生成一个新的日志文件,所以在凌晨攻击成功相对容易。
包含 /proc/self/ 文件。这也是一种通用技术,因为它不需要猜测包含文件的路径,用户也可以控制其内容。常见的方法是将PHP代码注入User-来完成攻击。
使用PHP文件渗透存在漏洞的网站案例
上面我们详细介绍了PHP文件包含漏洞的形成和测试。下面我们通过一个真实案例来说明如何利用PHP文件包含漏洞来渗透目标网站。
目标网站:中国电信业务系统
目的:获取目标网站的信息
详细的渗透过程如下:
1. 发现漏洞
我们先打开一个目标网站的网址看一下,如下图:
URL:http://XXX.vnet.mobi/index.php?path=jcb/zt/gfsdtjqg/index.html
注意path=后面的内容。通过这个URL,可以发现.php调用了文件函数,将网站目录下的文件包含进来,显示给用户。但目前我们不确定这个 URL 是否存在文件包含漏洞。让我们手动测试是否存在文件包含漏洞。因为网站有一个.php的测试页面,通过这个页面我们可以得到很多关于目标网站的有用信息。不用fuzz就可以得到web目录的绝对路径,所以这里可以直接构造已知文件的路径,让它包含php代码执行漏洞,快速确认是否存在文件包含漏洞。
我们通过包含已知文件“/etc/”文件来确认上述 URL 文件是否包含漏洞。
图 6
从上面返回的结果可以确定该网站存在包含漏洞的文件。下面我们来演示一下如何利用这个漏洞进行渗透测试。
2. 漏洞利用
通过以上测试,我们可以确定该网站存在文件包含漏洞。那么问题来了,如何利用这个漏洞来达到我们的目的呢?一种思路是将后门代码插入到网站的web日志文件中,利用目标网站的文件包含漏洞来包含这个日志文件。这时候web日志中的后门代码会作为PHP代码执行,这样我们就可以得到一个执行后续攻击。但此时,我们面临着一个问题。我们需要知道Web日志的存储路径,否则无法达到目的。通常web日志存储路径由web服务器的配置文件指定。以上获取的信息可用于判断目标网站是否使用该服务器。所以,我们可以先通过包含web服务器配置文件(.conf)来获取web日志存储路径。操作如下图7所示。
图 7
3.获取
上面,我们通过Web服务器配置文件(.conf)获取到了Web访问日志(/opt//logs/.log)的存在路径,但是由于网站的日志文件很大,访问程序会卡在这个时候,所以我们选择在清晨再次进攻。因为一般的网站每天都会生成一个访问日志文件,所以早上的日志文件很小,很容易成功。下面的图 8 显示了如何将后门代码插入到 Web 访问日志中,如下所示。
图 8
最终,我们成功获取了目标网站,如图9所示。
图9
PHP 文件包含漏洞预防
这部分主要从代码层和Web服务器的安全配置两个方面来讲解PHP文件包含漏洞的防范。首先,从代码层面来说,在开发过程中要尽量避免动态变量,尤其是那些用户可以控制的。一个保险的方法是使用“白名单”的方式将允许被包含的文件列出,只允许白名单中的文件被包含,这样就可以避免任何文件被包含的风险。您可以参考下面图 10 所示的代码实现。.
图10
另一种方法是在黑名单中定义漏洞利用过程中包含一些特殊字符的文件,并对传入的参数进行过滤,但有时会因为过滤不完整而被有经验的攻击者绕过。
在web服务器安全配置方面,可以通过设置php.ini中的值来限制特定目录下允许包含的文件,可以有效避免利用文件包含漏洞的攻击。需要注意的是,值是目录的前缀,所以假设设置了以下值:=/var/www /test,那么下面的目录其实都在允许的范围内。
/var/www/test
/var/www/test123
/var/www/testabc
如果要限制指定目录,需要在末尾加上“/”,需要特别注意。
open_basedir=/var/www/test/
如果有多个目录,下面的目录用分号隔开,下面用冒号隔开。
总结
以上,我们通过文字和代码详细分析了含有漏洞的PHP文件的形成、利用技巧和防范,并结合一个真实案例讲解了如何利用含有漏洞的PHP文件对目标网站进行渗透测试,最终获得许可。通过这些内容,相信读者对PHP文件包含漏洞有了深入的了解。其实,只要了解漏洞的原理,对漏洞有深入的了解,加上安全意识,彻底解决包含漏洞的PHP文件并不难。