PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)
摘要
PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的。而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞。利用PHP文件包含漏洞入侵网站也是主流的一种攻击手段。本文对PHP文件包含漏洞的形成、利用技巧及防范进行了详细的分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell。
1. PHP文件包含漏洞介绍
首先,我们来介绍下何为文件包含漏洞。严格来说,文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。“代码注入”的典型代表就是文件包含。文件包含漏洞可能出现在JSP、PHP、ASP等语言中,原理都是一样的,本文只介绍PHP文件包含漏洞。
要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件:
1.1 Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件;
1.2 用户能够控制该动态变量。
在PHP中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的PHP代码会被执行。下面对它们之间的区别进行解释:
include(): 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
include_once(): 功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。
require(): 1.require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。2.使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到该函数时才调用。
require_once(): 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
现在来看一段简单的文件包含代码,如下图所示:
图1
通过上面的代码可以看到,在得到变量$filename的值后没有经过任何处理,直接带入include()函数中。此处就存在一个文件包含漏洞,利用该漏洞我们可以查看系统中的任意文件。
下面我们来实际测试一下,首先将该PHP页面上传到Web服务器,先让其包含一个正常的txt文件,运行结果如下图所示:
图2
接着我们在该txt文本中插入php代码,看结果如何?这里给其插入如下代码:
图3
再次访问,结果如下图所示:
图4
通过上图我们可以看到文本中的PHP代码被成功执行了。
利用该漏洞我们可以查看系统中的任意文件,比如经常用到的“/etc/passwd”文件。
图5
PHP文件包含漏洞分为本地文件包含漏洞(LFI)和远程文件包含漏洞(RFI),能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞。利用本地文件包含漏洞可以查看系统任意文件内容,如果具备一些条件,也可以执行命令。在下面的漏洞利用技巧部分对这个有详细的介绍。
如果php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,则文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞可以直接执行任意命令。在实际渗透攻击过程中,攻击者可以在自己的Web服务器上放一个可执行的恶意文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的。
2. 文件包含漏洞利用技巧
远程文件包含漏洞之所以能够执行命令,就是因为攻击者可以自定义被包含的文件内容。因此,本地文件包含漏洞要想执行命令,也需要找一个攻击者能够控制内容的本地文件。
目前主要有几下几种常见的技巧:
2.1 包含用户上传的文件
这个很好理解,也是最简单的一种办法。如果用户上传的文件内容中包含PHP代码,那么这些代码被文件包含函数加载后将会被执行。但能否攻击成功,取决于上传功能的设计,比如需要知道上传文件存放的物理路径,还需要上传的文件有执行权限。
2.2 包含data://或php://input等伪协议
这需要目标服务器支持,同时要求allow_url_fopen为设置为ON。在PHP5.2.0之后的版本中支持data: 伪协议,可以很方便的执行代码。
2.3 包含Session文件
这部分需要攻击者能够控制部分Session文件的内容。PHP默认生成的Session文件一般存放在/tmp目录下。
2.4 包含日志文件
比如Web服务器的访问日志文件,这是一种通用的技巧。因为几乎所有网站都会将用户的访问记录到访问日志中。因此,攻击者可以向Web日志中插入PHP代码,通过文件包含漏洞来执行包含在Web日志中的PHP代码。下面的安例中就是利用该技巧成功获取到目标网站的WebShell的。但需要注意的是,如果网站访问量大的话,日志文件可能会非常大,这时如果包含一个这么大的文件时,PHP进程可能会卡死。一般网站通常会每天生成一个新的日志文件,因此在凌晨时进行攻击相对来说容易成功。
2.5 包含/proc/self/environ文件
这个也是一种通用的技巧。因为它根本不需要猜测被包含文件的路径,同时用户也能控制它的内容。常见的做法是向User-Agent中注入PHP代码来完成攻击。
3. 利用PHP文件包含漏洞渗透某网站案例
上面我们详细的介绍了PHP文件包含漏洞的形成和测试,下面我们通过一个真实案例来讲解下如何利用PHP文件包含漏洞对目标网站进行渗透攻击。
目标网站:中国电信某业务系统
目的:获取到目标网站的WebShell
详细渗透过程:
3.1 发现漏洞
我们先来打开目标网站的一个URL看下,如下所示:
URL:http://XXX.vnet.mobi/index.php?path=jcb/zt/gfsdtjqg/index.html
注意path=后面的内容,通过这个URL可以发现index.php调用文件包含函数来包含网站目录下的文件,并展示给用户。但这时我们并不能确定此URL存在文件包含漏洞。下面我们来手工测试下是否存在文件包含漏洞。因为该网站存在一个phpinfo.php的测试页面,我们可以通过该页面得到目标网站的很多有用信息,不必进行模糊测试就可以获取到Web目录的绝对路径,所以这里可以直接构造已知文件的路径,让其包含,快速确认是否存在文件包含漏洞。
我们来通过包含一个已知的文件”/etc/passwd”文件来确认以上URL是否文件包含漏洞。
图6
OK,通过上面返回的结果可以确定网站存在文件包含漏洞,下面我们来演示下如何利用该漏洞进行渗透测试。
3.2 漏洞利用
通过上面的测试,我们可以确定网站存在文件包含漏洞。那么这时问题来了,如何利用这个漏洞来达到我们的目的呢?其中一个思路就是将后门代码插入网站的Web日志文件中,利用目标网站存在的文件包含漏洞包含此日志文件,这时Web日志中的后门代码将会作为PHP代码执行,这样我们就可以获取到一个WebShell进行后续的攻击。但这时面临一个问题,我们需要知道Web日志的存放路径,否则无法实现目标。通常Web日志存放路径通过Web服务器的配置文件指定。通过上面获取的信息可以确定目标网站使用的是Nginx服务器,因此我们可以先通过包含Web服务器配置文件(Nigix.conf)来获取到Web日志存放路径。具体操作如下图所示:
图7
3.3 获取到WebShell
上面我们通过Web服务器配置文件(Nginx.conf)获取到了Web访问日志的存在路径(/opt/nginx/logs/access.log),但因为该网站的日志文件很大,这时访问WebShell程序会卡死,所以我们选择凌晨的时候进行再次攻击。因为一般的网站都是每天生成一个访问日志文件,在凌晨的时候日志文件较小,容易成功。下图展示了如下向Web访问日志中插入后门代码:
图8
最终,我们成功获取到了目标网站的WebShell。
图9
4. PHP文件包含漏洞防范
本部分主要从代码层和Web服务器安全配置两个方面来讲解PHP文件包含漏洞的防范。首先来从代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。一种保险的做法是采用“白名单”的方式将允许包含的文件列出来,只允许包含白名单中的文件,这样就可以避免任意文件包含的风险。可参考下面的代码实现:
图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下面则用冒号隔开。
5. 总结
上面我们通过文字和代码对PHP文件包含漏洞的形成、利用技巧及防范都做了详细的分析,并结一个真实案例讲解了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终获取到一个WebShell权限。通过这些内容,相信读者对PHP文件包含漏洞有了一个深入的认识。其实只要明白了漏洞的原理,对漏洞有一个深入的认识,加上安全意识,彻底解决PHP文件包含漏洞并不是一件困难的事情。
PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)的更多相关文章
- PHP文件包含漏洞攻防实战
本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. PHP是一种非常流行的W ...
- web安全原理-文件包含漏洞
前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...
- PHP文件包含漏洞剖析
一. 什么才是”远程文件包含漏洞”?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的. ...
- ✔PHP文件包含漏洞全面总结
我的另一篇博客总结的不够全面,但依然有借鉴价值:https://www.cnblogs.com/Zeker62/p/15192610.html 目录 文件包含的定义 文件包含漏洞常见函数 文件包含漏洞 ...
- PHP文件包含漏洞小结
参考链接:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 四大漏洞函数 PHP文件包含漏洞主要由于四个函数引起的: include() include_ ...
- php安全开发(1)文件包含漏洞
开发过程总结的漏洞: 一,,如何造成包含漏洞:在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶 ...
- php伪协议,利用文件包含漏洞
php支持多种封装协议,这些协议常被CTF出题中与文件包含漏洞结合,这里做个小总结.实验用的是DVWA平台,low级别,phpstudy中的设置为5.4.45版本, 设置allow_url_fopen ...
- PHP文件包含漏洞总结
0x00 前言 PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入. 最常见的就属于本 ...
- 18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613) phpMyAdmin是一套开源的.基于Web的MySQL数据库管理工具.其index.php中存在一处文件包含逻辑, ...
随机推荐
- Makefile 编写 tips
1.变量赋值 VARIABLE = value #在执行时扩展,允许递归扩展 VARIABLE := value #在定义时扩展 VARIABLE ?= value #只有在该变量为空时才设置该值 V ...
- 嵌入式Linux驱动学习之路(十三)按键驱动-异步通知
之前的按键方式: 查询: 极度占用CPU资源 中断: 在读的时候产生休眠,在没有信号的时候永远不会返回. poll机制: 在中断的基础上加上超时时间. 异步通知就是通过信号来传送. 首先在应用程序中有 ...
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- jquery工具方法swap
swap : css交换(内部) 详细内容请点击 -> 当元素的样式为display:none时获取他的宽高
- HTML中      等6种空白空格的区别
HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格 ( )在不同浏览器中宽度各异. ...
- [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环
题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...
- OpenGL在Ubuntu 14.04 中的设置与编程
在sudo apt-get install XXX,别的教程讲的很详细了. 编写好程序需要在shell中链接 g++ teapot.c -o teapot -lglut -lGL -lGLU 此处要注 ...
- Asp.Net MVC3 简单入门详解过滤器Filter(转)
前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...
- JAVA的垃圾回收机制
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- 编译安装php7
yum install libxml2-devel curl-devel openjpeg openjpeg-devel openjpeg-libs libjpeg libpng freetype l ...