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”
  • 登陆数据库,跳过密码登陆: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 “<? php phpinfo(); ?> “ > /var/www/html/index.php
  • 使用浏览器访问http://ip/index.php看到php的安装信息

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

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

07 网站显示文件列表设置

  • 修改.htaccess文件,添加Options Indexes FollowSymLinks(去掉Indexes即不显示文件列表),且该文件需放在站点根目录下
  • 修改/etc/httpd/conf.d/welcome.conf文件如下:
  • 重新访问服务器,显示目录

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处理文件。

    例如:基于以上正则表达式,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”

AddHandler的作用是,在apache识别到php文件时,将文件交给php处理器处理时,php处理器不再根据正则表达式去匹配文件后缀,只要文件后缀中包含.php后缀,php处理器都会将该文件作为php文件解析。
举个例子:
正常情况下,php处理器只识别最后一个后缀名,所以php处理器是无法识别11.php.xx(a.php.jpg)文件,浏览器请求该文件,服务器会返回纯文本。但添加该handler后,浏览器请求该文件时,文件可正常被解析。


情况2:添加 AddType application/x-httpd-php .jpg,使得.jpg文件被当作php文件解析(此处以.jpg为例,其他后缀文件类似,只要把.jpg修改即可)
在apache配置文件httpd.conf添加配置AddType application/x-httpd-php .jpg,此时,及时文件是.jpg文件,也同样会被当做php文件解析


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

  • apache配置文件中,禁止”.php.”类似的文件执行,即配置文件httpd.conf不使用AddHandler,而在php.conf中写好正则表达式

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

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

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

Apache与文件解析漏洞详解相关推荐

  1. 89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解实战示例]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.文件包含漏洞详解 1.文件包含漏洞相关概念 2.PHP文件包含漏洞相关概念 3.PHP文件包含漏洞利用:`构 ...

  2. Pikachu靶场之文件包含漏洞详解

    Pikachu靶场之文件包含漏洞详解 前言 文件包含漏洞简述 1.漏洞描述 2.漏洞原因 3.漏洞危害 4.如何防御 第一关 File Inclusion(local) 1.尝试读取"隐藏& ...

  3. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  4. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  5. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  6. Android init.rc文件解析过程详解(一)

        Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...

  7. 加载vue文件步骤_vue中.vue文件解析步骤详解

    这次给大家带来vue中.vue文件解析步骤详解,vue中.vue文件解析的注意事项有哪些,下面就是实战案例,一起来看一下. 我们平时写的 .vue 文件称为 SFC(Single File Compo ...

  8. 中间件的解析漏洞详解及演示

    本文转自行云博客https://www.xy586.top/ 文章目录 IIS5.x-6.x解析漏洞 Apache IIS 7.0/IIS 7.5/nginx 0.8.3解析漏洞 Nginx < ...

  9. 本地文件包含漏洞详解

    0x00:漏洞定义 在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露.恶意代码的注入等. 文件包含分为两种,一种为本地文件包含,一种为 ...

最新文章

  1. Safari回传值给应用程序
  2. 单调递增最长子序列(南阳理工ACM)
  3. Android中实现滑动翻页—使用ViewFlipper
  4. Smart-Forms套打和不套打
  5. Python字符串拼接的十种方式
  6. 7年老Android一次操蛋的面试经历,深度好文
  7. numpy 高阶函数 —— np.histogram
  8. 计算机网络实验【利用wireshark抓包工具抓包】
  9. 【ECG理论篇】(2)AI实现心律失常判别:心电数据预处理
  10. TCP/UDP的区别
  11. GLSL 创建自己的着色器
  12. 主页被修改成httpwww.yy4000.cn等类似首页,无法更改,怎么办?
  13. Gitbub 常用命令
  14. springboot实现统一日志管理
  15. python处理颜色rgb_python – 根据RGB值更改图像的颜色
  16. Unity创建 .asset配置文件的方式
  17. python文件名和类名需要一致吗_Python:类名与文件/模块名相同会导致继承问题?...
  18. 运用Python+Pygame开发坦克大战游戏_版本V1.01
  19. 莫比乌斯函数(Mobius)的求法 每日一遍,算法再见!
  20. 嵌入式linux开发,openssl-0.9.8d移植

热门文章

  1. apache 安装与修改端口,修改默认页面,配置虚拟主机
  2. 目标检测FPN(Feature Pyramid Networks)的使用
  3. 第13章 Kotlin 集成 SpringBoot 服务端开发(2)
  4. shell的logo含义_45个富有深意的巧妙logo设计
  5. 第1章第8节:如何删除、复制和隐藏幻灯片 [PowerPoint精美幻灯片实战教程]
  6. JavaScript 制作12小时进制的时钟特效
  7. MBA-day30 算术 绝对值题型
  8. 传统商道谋定重整电商奇迹-经信研究:李玉庭谈红孩子模式
  9. 使用CVX进行Matlab仿真时出现的一些问题
  10. IDEA中实现用户信息修改功能