博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apache 代理 图片无法展示_Apache中间件漏洞详解
阅读量:4569 次
发布时间:2019-06-08

本文共 5006 字,大约阅读时间需要 16 分钟。

86435491be3de20ab7b2ced5eabd8938.png

中间件漏洞详解-Apache

定义

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

简单来说就是一个好用的,并且能支持基础的HTML、PHP、Perl、Python等语言。一个字:贼强!

Apache的目录结构

  • bin-------存放常用的命令工具,例如httpd
  • cgi-bin---存放Linux下常用的命令,例如xxx.sh
  • conf------Linux的配置相关文件,例如httpd.conf
  • error-----错误记录
  • htdocs----放网站源码
  • icons-----网站图标
  • logs------日志
  • manual----手册
  • modules---扩展模块

Apache原理介绍

下面要讲到的Apahce的漏洞必须要理解Apache的运行原理。
很多朋友在搭建PHP环境时,经常采用PHPStudy、LAMP、XAMPP等集成环境搭建,很容易忽略里面的一些原理。为了更好的理解本节课中讲到的漏洞,必须要说一下Apache与PHP的小秘密。
通过图来说下完整的WEB请求流程,如下图:

213456bb940d1e48b5b364632a559d4e.png

以上图片来自灵魂画手Margin(抽象派)

图中简易描述了Apahce与PHP配合完成了一次WEB请求,Apahce在前,PHP在后,那两者之间如何进行通信的呢?先了解下PHP的架构。如下图

e8afa7131021a58aceff9f1b877c4b21.png

上图来自鸟哥的文章,深入理解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/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换行解析漏洞

影响版本: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 builddocker-compose up -d

漏洞原理

为什么叫换行解析漏洞?是因为在上传时在文件名后缀后面加了0x0a(换行),需要注意的是3.PHP是我抓完包后手动加上的,因为后台php代码用的是$_POST['name']方式获取的filename,例如如下截图

6d14ecf88bc98c311830d9a18116ea8e.png

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

后台是通过黑名单方式过滤了php后缀的文件,根据最开始的知识,什么样的文件算是php文件呢?在<FilesMatch .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 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可以看到

96b32adf8d1f782b145278aa68214e91.png

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

36a92ec71ecb50bf9043ccde9c59e648.png

上图中最下面标红的地方是index.php代码中获取文件名的位置,但现在为空,需要填写上phpinfo.php1,后缀加1的目的是占位,下一步将1改为0x0a,点击上面红色箭头指向的Hex,将包修改为以下内容:

b16cf1abd1932c9f5a661907706a6e90.png

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

在Windows下的表现

将漏洞代码复制到windows的环境中,进行访问、抓包(和文章中在Linux的方法一样),最终会出现以下问题:

a505fa7ddf5293e22635359d8b024ee6.png

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

index.php源码

Apache多后缀解析漏洞

影响版本:使用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。效果截图:

1bd80e61a78ddec46ec2cf21ceed3529.png

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

Apache SSI远程命令执行漏洞

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

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

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

环境搭建

此次环境使用docker环境搭建,环境采用地址Vulhub,环境文件有2个

  • docker-compose.yml
  • upload.php

执行构建环境命令如下(启动后在浏览器中访问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的目的。执行效果:

9035e1983fbd1195bd0caa95560208f7.png

上传webshell:

echo '
' > shell.php

反弹shell:

转载地址:http://dwyms.baihongyu.com/

你可能感兴趣的文章
learnByWork
查看>>
lua 函数
查看>>
Git的基本命令
查看>>
四平方和
查看>>
第十八周 12.27-1.2
查看>>
C# IP地址字符串和数值转换
查看>>
TCHAR和CHAR类型的互转
查看>>
常用界面布局
查看>>
C语言—— for 循环
查看>>
IBM lotus9.0测试版即将公测
查看>>
xml常用方法
查看>>
Cube Stacking(并差集深度+结点个数)
查看>>
AndroidStudio3更改包名失败
查看>>
jq 删除数组中的元素
查看>>
js URL中文传参乱码
查看>>
Leetcode 367. Valid Perfect Square
查看>>
UVALive 3635 Pie(二分法)
查看>>
win系统查看自己电脑IP
查看>>
Backup&recovery备份和还原 mysql
查看>>
一道面试题及扩展
查看>>