利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
时间:2022-07-26
本文章向大家介绍利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我在代码审计知识星球里提到了Apache最新的一个解析漏洞(CVE-2017-15715):
除了帖子中说到的利用方法,我们还可以利用这个漏洞来绕过上传黑名单限制。
目标环境
比如,目标存在一个上传的逻辑:
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}
可见,这里用到了黑名单,如果发现后缀在黑名单中,则进行拦截。
然后,我们用docker启动一个默认的Apache PHP(Apache版本在2.4.0到2.4.29即可):
docker run -d -p 8080:80 --name apache php:5.5-apache
将上述代码放置在容器内的/var/www/html
目录下,设置好写权限,即可进行测试。
绕过黑名单getshell
正常上传php文件,被拦截:
可以上传1.php.xxx,但是不解析,说明老的Apache解析漏洞不存在:
我们利用CVE-2017-15715,上传一个包含换行符的文件。注意,只能是x0A
,不能是x0Dx0A
,所以我们用hex功能在1.php后面添加一个x0A
:
然后访问/1.php%0A
,即可发现已经成功getshell:
总结
研究这个漏洞的过程中遇到几个问题:
- 获取文件名时不能用
$_FILES['file']['name']
,因为他会自动把换行去掉,这一点有点鸡肋 - 默认的Apache配置即可利用,因为默认Apache配置就使用了
<FileMatch>
:
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>
所以理论上,只要用正则来匹配后缀进行php解析的Apache就有这个问题。而这个做法刚好是为了解决Apache老的解析漏洞而做的,可谓非此即彼,必然存在一种解析漏洞。
延伸一下,其他环境是不是可能出现同样的问题?比如nginx + php,我进行了测试,发现结果却有些区别:
如上图,成功上传后,访问却出现Access denied
错误。
这也是我预想的结果,因为我在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写》已经提到过,fpm存在一个security.limit_extensions
配置,默认只解析php后缀的文件,多一个换行也不行。
漏洞本身其实没啥意思,但是$
这个原理,以后应该还会有更多用处。
- nginx通过https方式反向代理多实例tomcat
- Linux系统下yum镜像源环境部署记录
- 特斯拉vs凯迪拉克vs奔驰:三大汽车自动驾驶系统比拼
- Centos下添加静态路由(临时和永久有效)的操作记录
- python如何保证输入键入数字
- 微信小程序自定义数据分析试水
- 挂载银行前置机Ukey到windows server2012虚拟机的操作记录
- 文件上传速度查询方法
- “AS3.0高级动画编程”学习:第三章等角投影(上)
- su: 无法设置用户ID: 资源暂时不可用
- NumPY学习笔记
- LVS负载均衡下session共享的实现方式-持久化连接
- Centos6.9下RabbitMQ集群部署记录
- “AS3.0高级动画编程”学习:第三章等角投影(下)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7下搭建Jellyfin个人流媒体服务器
- CentOS8下yum源配置及nmcli命令简单介绍
- Day62:二叉搜索树的第k个结点
- CentOS7下利用SRS搭建直播流媒体服务器
- 第9天:NLP补充——需要的基本知识
- 6.AVCodecContext和AVCodec
- WebAssembly之使用JS调用C/C++接口
- WebAssembly之emcc编译命令
- 食堂店小二儿教你学会栈
- Istio流量管理实现机制深度解析-基于1.4.0更新
- Istio 运维实战系列(1):应用容器对 Envoy Sidecar 的启动依赖问题
- R语言基于Reactome数据库的富集分析
- WiredTiger存储引擎之五:与事务相关的数据结构以及并发控制机制
- Tomcat NIO(8)-Poller线程的阻塞与唤醒
- 你的第一个React App (一 ) - 项目初始化