本文共 5006 字,大约阅读时间需要 16 分钟。
定义
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
简单来说就是一个好用的,并且能支持基础的HTML、PHP、Perl、Python等语言。一个字:贼强!Apache的目录结构
Apache原理介绍
下面要讲到的Apahce的漏洞必须要理解Apache的运行原理。很多朋友在搭建PHP环境时,经常采用PHPStudy、LAMP、XAMPP等集成环境搭建,很容易忽略里面的一些原理。为了更好的理解本节课中讲到的漏洞,必须要说一下Apache与PHP的小秘密。通过图来说下完整的WEB请求流程,如下图:以上图片来自灵魂画手Margin(抽象派)
图中简易描述了Apahce与PHP配合完成了一次WEB请求,Apahce在前,PHP在后,那两者之间如何进行通信的呢?先了解下PHP的架构。如下图上图来自鸟哥的文章,深入理解Zend SAPIs
通过上图可以看出PHP的整体分为5层(类似Android的架构图),分别解释下:OK,上面的PHP的架构明白了,那么现在关于Apache和PHP通信的过程还是不明白。众所周知,Apache本身是不支持PHP解析的,通过架构图可以知道是通过SAPI进行通信,那Apache如何和SAPI通信呢?Apache怎么知道什么类型的文件要解析为PHP?如果你手动搭建过Apache解析PHP的环境,就肯定了解这两个步骤:
# 加载php5_module模块LoadModule php5_module php5apache2_2.dll的路径# 添加可以执行php的文件类型,让.php文件类型解析为PHPAddType application/x-httpd-php .php# 或者将AddType变为下面的(在Apache 2.4.0~2.4.29中默认使用了该方式)SetHandler application/x-httpd-php 以及DirectoryIndex index.html index.htm index.php index.phtml
Apache通过LoadModule来加载php5_module模块(php5apache2_2.dll),这样做的目的是让Apache加载php5_module模块来解析PHP文件。意思其实就是用LoadModule来加载php5_module。也就是把php作为Apache的一个子模块来运行。当通过Web访问php文件时,Apache就会调用php5_module来解析php代码。
调用过程可以概括为HTTP->Apahce->php5_module->sapi->php讲到这里各位应该明白了Apache是怎么调用php的了。影响版本:Apache 2.4.0~2.4.29
影响说明:绕过服务器策略,上传webshell
环境说明:PHP5.5 、 Apache2.4.10
环境搭建:
此次环境使用docker环境搭建,环境采用地址Vulhub,环境文件有3个执行构建环境命令如下(启动后在浏览器中访问http://127.0.0.1:8080)
docker-compose builddocker-compose up -d
漏洞原理
为什么叫换行解析漏洞?是因为在上传时在文件名后缀后面加了0x0a(换行),需要注意的是3.PHP是我抓完包后手动加上的,因为后台php代码用的是$_POST['name']方式获取的filename,例如如下截图
为什么加上0x0a就能绕过了呢?先看下index.php的代码
后台是通过黑名单方式过滤了php后缀的文件,根据最开始的知识,什么样的文件算是php文件呢?在<FilesMatch .php$>有定义,这句话的意思是以.php结尾的文件都算php文件,在正则中表示匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则也匹配 'n' 或 'r'。
恰好,我们在文件末尾加了0x0a(n),所以被匹配成功了。讲到这里有两个概念需要讲清楚:0x0a与0x0d、正则表达式的m修饰符var str="This is ann Apple"; var reg=/an$/;console.log(str.match(reg));
由于未采用多行匹配,以上是匹配不出来的,尽管他第一行以an结尾,如果正则改为/an$/m即可匹配。以上是apache的换行解析漏洞的原理,但也不能称之为漏洞,因为这只是Apache的特性,只是开发或者运维人员没有使用到位。
漏洞复现
接下来通过实验的方式复现整个利用过程,首先先确认环境中的配置文件是否是<FilesMatch .php$>,路径为/etc/apache2/conf-available/docker-php.conf,该路径取决于apache2的目录,在搭建环境的时候不同apache版本路径可能不同,在Linux下的apache目录下执行grep -rn "FilesMatch" * 即可搜索到。(在FilesMatch中的定义是将.php为后缀的文件解析为PHP,如果将其改为.(php|html)$的话,html中的php也会被解析。)按照正常的漏洞利用步骤将其复现0x01 抓包/改包准备工作:将浏览器的代理打开、将burpsuit打开开启抓包。访问漏洞页面http://IP:8080/index.php可以看到点击submit进行上传,burp可以抓到
上图中最下面标红的地方是index.php代码中获取文件名的位置,但现在为空,需要填写上phpinfo.php1,后缀加1的目的是占位,下一步将1改为0x0a,点击上面红色箭头指向的Hex,将包修改为以下内容:
改完后将数据包给服务器,此时在浏览器中访问http://IP:8080/phpinfo.php%0a便可以看到phpinfo的界面,说明利用成功。
在Windows下的表现
将漏洞代码复制到windows的环境中,进行访问、抓包(和文章中在Linux的方法一样),最终会出现以下问题:根据上图可以发现,move_uploaded_file函数已经被执行了,说明我们绕过了黑名单的检测,只不过在windows创建文件的时候由于结尾是换行符,windows不允许,所以创建失败了。
index.php源码
影响版本:使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcig模式与php结合的所有版本apache不存在此漏洞。
影响说明:绕过服务器策略,上传webshell
环境说明:PHP7 、 任意版本的使用module模式与php结合的apache
漏洞原理:
什么是多后缀解析?我们来看个例子,假设访问index.php.abc,这个就是多后缀解析,Apache在特定的配置下,会将其解析为php文件。这样可以绕过后台的后缀检测,达到上传webshell的目的。那为什么会产生多后缀解析?哪个配置引起的?答案是:AddHandler application/x-httpd-php .php或者SetHandler application/x-httpd-php
上面两个配置都可以实现解析文件名中包含.php后缀的文件,apache对文件后缀名的识别是从后向前进行匹配的,以单个.作为分隔符。当遇到不认识的后缀时继续往前,直到识别,若都不识别就不做处理。在/etc/mime.types中有定义哪些后缀是apache识别的。关于Apache多后缀的解释,可以看官方文档。
apache支持php有多种模式,常见的有module、cgi、fastcgi等,此漏洞存在于module模式。漏洞复现
复现过程非常简单,将webshell后缀名改为http://xxx.php.xxx上传即可,如果程序验证必须要图片文件,可以修改为xxx.php.png。效果截图:windows下效果相同,不再赘述。
影响版本:Apache全版本(支持SSI与CGI)
影响说明:绕过服务器策略,上传webshell
环境说明:PHP7.1 、 Apache2.4.25
环境搭建:
此次环境使用docker环境搭建,环境采用地址Vulhub,环境文件有2个执行构建环境命令如下(启动后在浏览器中访问http://127.0.0.1:8080)
docker-compose builddocker-compose up -d
漏洞原理
SSI(server-side includes):是放置在HTML页面中的指令,它可以将动态生成的内容添加到现有的HTML页面,而不必通过CGI程序或其他动态技术来提供整个页面。以上是定义采用在Apache官网对SSI的定义,说白了就是可以在HTML中加入特定的指令,也可以引入其他的页面。开启SSI需要单独配置Apache,可以参考SSI配置。SSI可以完成查看时间、文件修改时间、CGI程序执行结果、执行系统命令、连接数据库等操作,功能非常强大。我们要利用的就是SSI执行系统命令的功能,正常的一个包含SSI指令的文件,可以如下内容:文件名保存为test.shtml,这个后缀取决于Apache的配置,默认是此后缀。
当后台对扩展名校验不严格时,可以上传此类型文件,达到执行命令,获取webshell的目的。执行效果:上传webshell:
echo ' ' > shell.php
反弹shell:
转载地址:http://dwyms.baihongyu.com/