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”
- 登陆数据库,跳过密码登陆: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与文件解析漏洞详解相关推荐
- 89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解实战示例]
我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.文件包含漏洞详解 1.文件包含漏洞相关概念 2.PHP文件包含漏洞相关概念 3.PHP文件包含漏洞利用:`构 ...
- Pikachu靶场之文件包含漏洞详解
Pikachu靶场之文件包含漏洞详解 前言 文件包含漏洞简述 1.漏洞描述 2.漏洞原因 3.漏洞危害 4.如何防御 第一关 File Inclusion(local) 1.尝试读取"隐藏& ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(一)
Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...
- 加载vue文件步骤_vue中.vue文件解析步骤详解
这次给大家带来vue中.vue文件解析步骤详解,vue中.vue文件解析的注意事项有哪些,下面就是实战案例,一起来看一下. 我们平时写的 .vue 文件称为 SFC(Single File Compo ...
- 中间件的解析漏洞详解及演示
本文转自行云博客https://www.xy586.top/ 文章目录 IIS5.x-6.x解析漏洞 Apache IIS 7.0/IIS 7.5/nginx 0.8.3解析漏洞 Nginx < ...
- 本地文件包含漏洞详解
0x00:漏洞定义 在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露.恶意代码的注入等. 文件包含分为两种,一种为本地文件包含,一种为 ...
最新文章
- Safari回传值给应用程序
- 单调递增最长子序列(南阳理工ACM)
- Android中实现滑动翻页—使用ViewFlipper
- Smart-Forms套打和不套打
- Python字符串拼接的十种方式
- 7年老Android一次操蛋的面试经历,深度好文
- numpy 高阶函数 —— np.histogram
- 计算机网络实验【利用wireshark抓包工具抓包】
- 【ECG理论篇】(2)AI实现心律失常判别:心电数据预处理
- TCP/UDP的区别
- GLSL 创建自己的着色器
- 主页被修改成httpwww.yy4000.cn等类似首页,无法更改,怎么办?
- Gitbub 常用命令
- springboot实现统一日志管理
- python处理颜色rgb_python – 根据RGB值更改图像的颜色
- Unity创建 .asset配置文件的方式
- python文件名和类名需要一致吗_Python:类名与文件/模块名相同会导致继承问题?...
- 运用Python+Pygame开发坦克大战游戏_版本V1.01
- 莫比乌斯函数(Mobius)的求法 每日一遍,算法再见!
- 嵌入式linux开发,openssl-0.9.8d移植
热门文章
- apache 安装与修改端口,修改默认页面,配置虚拟主机
- 目标检测FPN(Feature Pyramid Networks)的使用
- 第13章 Kotlin 集成 SpringBoot 服务端开发(2)
- shell的logo含义_45个富有深意的巧妙logo设计
- 第1章第8节:如何删除、复制和隐藏幻灯片 [PowerPoint精美幻灯片实战教程]
- JavaScript 制作12小时进制的时钟特效
- MBA-day30 算术 绝对值题型
- 传统商道谋定重整电商奇迹-经信研究:李玉庭谈红孩子模式
- 使用CVX进行Matlab仿真时出现的一些问题
- IDEA中实现用户信息修改功能