Apache与文件解析漏洞详解

1. Apache介绍与服务搭建

1.1. apache介绍

Apache跨平台的纯粹的web服务器,负责接收处理/响应http请求,之所以说它是纯粹的web服务器,是因为apache对于html页面的解析能力很强,但是不能解析嵌入页面内的服务器端脚本代码(如jsp/servlet)。
前面也说了,apache没有办法解析服务器端的脚本代码(此处以php为例),若需要解析.php文件,还需要php处理器。即,apache负责接收和响应http请求,若请求中涉及到.php文件,那么apache会将该文件发送给php处理器处理,php处理器解析完成后,生成html文件,并将该html文件发送给apache,再由apache返回最终的结果给浏览器。

1.2.apache+php+mysql服务器的搭建与配置(以centos 7.4为例)

1.2.1. apache的安装

在安装之前注意关闭firewalld和selinux
01 apache的安装

  • yum install httpd #安装httpd
  • systemctl start httpd #开启httpd服务
  • systemctl status httpd #查看httpd服务的状态
  • 使用浏览器访问,检查apache是否安装成功:http://ip

02 修改站点默认路径
apache的默认站点路径为/var/www/html/,可将其修改为自己想要的路径。

  • 修改配置文件/etc/httpd/conf/httpd.conf
    修改站点路径为/www/,将DocumentRoot字段进行修改:
    在这里插入图片描述
  • 重启httpd服务(修改httpd.conf重启服务生效)
    systemctl restart httpd
    在这里插入图片描述
  • 在新站点目录下(/www/)新建html文件,使用浏览器访问服务器ip,即可看到html信息。

1.2.2. mysql的安装

01 下载mysql的yum源

  • wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm

02 安装mysql源

  • yum localinstall mysql57-community-release-el7-8.noarch.rpm

03 安装mysql服务

  • yum install mysql-community-server

04 启动服务(先关闭防火墙)

  • systemctl start mysqld

05 查看进程
-ps -ef | grep mysqld
06 修改root默认密码
#默认密码存放在/var/log/mysqld.log,可使用命令:
grep “temporary password” /var/log/mysqld.log查看

在这里插入图片描述

  • 登陆数据库:mysql -uroot -p
  • 修改密码:update user set password=password(‘123’) where user=‘root’;

07 添加远程登陆用户

  • mysql -uroot -p
  • use mysql
  • update db set host =’%‘ where user = ’root’ ; #允许远程登陆
  • flush privileges; #刷新MySQL的系统权限相关表(也可以重启服务)
  • grant all privileges on . to ‘admin’@’%’ identified by ‘123456’ with grant option; #设置admin用户远程连接权限

08 mysql若忘记root密码,重置
方式如下:

  • 修改数据库配置文件/etc/my.cnf文件,在[mysql]下添加”skip-grant-tables”
    Apache与文件解析漏洞详解_第1张图片
  • 登陆数据库,跳过密码登陆:mysql -uroot -p 直接回车
    修改密码:
    Update user set authentication_string = passwor(‘新密码’) where user = ‘root’;
  • 若登陆数据库时报错,则可以先杀掉mysql的相关进程,重启服务,再次尝试

1.2.3. php的安装

01 php安装

  • yum install php

02 安装php组件

  • yum install php-*

03 重启apache

  • systemctl restart httpd

04 重启mysql

  • systemctl restart mysqld

05 测试php环境

  • 站点目录下创建.php文件:
    echo “ “ > /var/www/html/index.php
  • 使用浏览器访问http://ip/index.php看到php的安装信息

06 设置网站访问带参数跳转

  • 修改httpd.conf文件,将所有的AllowOverride None改为AllowOverride All
  • 编辑.htaccess文件,添加Options Indexes FollowSymLinks(去掉Indexes即不显示文件列表),且该文件需放在站点根目录下
    Apache与文件解析漏洞详解_第2张图片
  • 默认.htaccess文件隐藏,如下,直接查看不到)
    Apache与文件解析漏洞详解_第3张图片

07 网站显示文件列表设置

  • 修改.htaccess文件,添加Options Indexes FollowSymLinks(去掉Indexes即不显示文件列表),且该文件需放在站点根目录下
    Apache与文件解析漏洞详解_第4张图片
  • 修改/etc/httpd/conf.d/welcome.conf文件如下:
    Apache与文件解析漏洞详解_第5张图片
  • 重新访问服务器,显示目录
    Apache与文件解析漏洞详解_第6张图片

2.Apache与php的三种结合方式

2.1.CGI(common gateway interface)

公共网关接口,web服务器与机器上其他程序进行通信的一个接口。Web服务器在必要时启动额外的程序处理动态内容。
Web服务器接收客户端的http请求,然后建立进程执行CGI程序,请求被传递给CGI程序,CGI处理后,将结果返回给web服务器。
CGI方式下,客户端每次http请求都要建立和销毁进程(用于运行CGI程序),不断的fork既消耗时间又消耗资源。

2.2.FastCGI

常驻型CGI,只要CGI被激活,就可以一直执行,不需要每次请求都再建立一个进程。并且FastCGI还支持分布式运算。
Apache启动时,载入apache module(fastcgi进程管理器),module自身初始化时,预启动多个CGI进程,等待web服务器的连接。客户端发起请求时,module会对CGI进行选择并连接。CGI处理完后将结果解析成html返回给web服务器,同时进程关闭连接(并不是进程退出,而是该连接关闭),重新处于等待请求接入状态。
注:php-fasrcgi中php-fpm用于调度php解释进程,实现进程管理。

2.3.Module

Module方式即将php作为apache的模块来启动,在apache启动时按需加载模块。Apache是基于模块的,大多数功能都被分散到各个模块中,各个模块在系统启动时,按需载入。
说到module,就要先了解apache的Multi-Processing Module(多路处理模块,简称MPM)。Apache为不同平台(windows/linux)提供不同的mpm。MPM的三种工作模式分别为:prefox、worker及event,最常用的是prefox和worker。不支持多线程的操作系统,采用的是预派生子进程的方式,unix。支持多线程的操作系统,大多采用多进程多线程混合的模worker。

  • MPM-prefox(多进程模式)
    Apache在启动之初,为了减少频繁创建和销毁进程造成的开销,就预先派生一些子进程,然后等待请求进来,每个子进程只有一个线程,在一个时间点内只能处理一个请求。
    Apache的优点在于它兼容所有新老模块,同时,由于每个子进程只有一个线程,因此不需要担心线程安全问题。
    但同时,由于每个子进程只有一个线程,不并不擅长处理高并发请求。(一个进程相对与线程占用更多系统资源,消耗更多的内存)。
    注:进程是一个具有独立功能的程序,在数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的最小单位。而线程是程序执行流的最小单位,是一个进程中代码的不同执行路线。
  • MPM-worker(多进程多线程模式)
    Worker模式为多进程多线程混合模式,在启动之初,它同样也预先派生了几个子进程(较少),每个子进程再创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。
    线程通常是共享父进程的资源,因此,占用的内存和消耗较少,适用于并发请求处理。但同时,由于采用多线程需要考虑到线程安全的问题(如线程异常退出处理)。
    Worker模式下,为了减少tcp的连接数量,采用keep-alive,但keep-alive需要与服务器线程或进程进行绑定。导致线程消耗问题。
  • MPM-event
    Event模式是apache最新的工作模式,它和worker模式很像,但event解决了某些线程因为keep-alive长连接一直挂着等待直到超时,造成线程资源浪费的问题。
    Event模式下,有专门的线程用于管理keep-alive类的线程,当有真实的请求过来时,将请求传递给服务器的线程,执行完毕后,又允许它释放。实现了异步非阻塞。
    工作在Event模式的apache,在遇到某些不兼容的模块时,会失效,将会回退到worker模式。

2.4.查看apache与php的结合方式及php处理器激活条件

  • 可使用命令 /usr/sbin/apachectl -M | grep php查看apache与php的结合方式:
    在这里插入图片描述
  • 查看apache激活php处理器的条件
    如下图,php.conf中定义的正则表达式“.php$”,即若客户端请求的文件名满足该正则表达式的条件,则apache就将该文件交给php处理器处理。否则不认为是php处理文件。
    Apache与文件解析漏洞详解_第7张图片
    例如:基于以上正则表达式,php处理器只处理.php后缀的文件,在站点根目录下创建.php3的文件,浏览器访问该文件时,apache会认为自己无法识别该文件,故将该文件作为DefaultType text/plain类型处理,即返回纯文本返回给浏览器:
    在这里插入图片描述

3.Apache文件解析漏洞

3.1.Apache的多后缀名识别

在讲apache文件解析漏洞之前,首先简单介绍一下apache的多后缀名识别。
Apache默认一个文件可以有多个后缀名,每次识别从右到左识别,当最右边的后缀无法识别时,则继续向左识别。mime.types中记录apache可识别的后缀名。
举个例子:
浏览器请求一个文件为a.php.xx时,apache先从.xx识别,但.xx是它不认识的后缀,于是继续向左识别,当识别到.php时,发现该后缀可识别,于是启动php处理器处理。
但是,php处理器只识别最后一个后缀名,而a.php.xx它是不认识的,所以php处理器不会解析该文件,因此直接返回纯文本内容。

3.2.Apache解析漏洞的产生

Apache文件解析漏洞的是由于用户在配置服务器时,配置不当导致,导致本来非php文件也会被认为php文件处理。
情况1:添加AddHandler,使得任何文件只要包含.php后缀名的文件都会被当作php文件解析
为了使php文件可以被解析,用户自己添加了AddHandler:“AddHandler application/x-httpd-php .php”
Apache与文件解析漏洞详解_第8张图片
AddHandler的作用是,在apache识别到php文件时,将文件交给php处理器处理时,php处理器不再根据正则表达式去匹配文件后缀,只要文件后缀中包含.php后缀,php处理器都会将该文件作为php文件解析。
举个例子:
正常情况下,php处理器只识别最后一个后缀名,所以php处理器是无法识别11.php.xx(a.php.jpg)文件,浏览器请求该文件,服务器会返回纯文本。但添加该handler后,浏览器请求该文件时,文件可正常被解析。
Apache与文件解析漏洞详解_第9张图片
Apache与文件解析漏洞详解_第10张图片
情况2:添加 AddType application/x-httpd-php .jpg,使得.jpg文件被当作php文件解析(此处以.jpg为例,其他后缀文件类似,只要把.jpg修改即可)
在apache配置文件httpd.conf添加配置AddType application/x-httpd-php .jpg,此时,及时文件是.jpg文件,也同样会被当做php文件解析
Apache与文件解析漏洞详解_第11张图片
Apache与文件解析漏洞详解_第12张图片
Apache与文件解析漏洞详解_第13张图片

3.3.Apache文件解析漏洞的防御

  • apache配置文件中,禁止”.php.”类似的文件执行,即配置文件httpd.conf不使用AddHandler,而在php.conf中写好正则表达式
    Apache与文件解析漏洞详解_第14张图片

  • 当然了,也禁止添加 类似于“AddType application/x-httpd-php .jpg”的配置。

3.4.Apache文件解析漏洞的危害

介绍了那么多,那么apache文件解析的危害具体体现在哪儿呢?当网站上传页面使用了php文件黑名单时,就可以伪造类似于a.php.jpg文件,绕过文件黑名单上传文件了。
如上传一句话木马,再使用工具连接,就可以对网站目录乃至服务器进行操作了。

你可能感兴趣的:(Apache与文件解析漏洞详解)