Nginx脆弱性利用一览
[TOC]
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
CVE-2017-7529 (溢出漏洞)
描述: Nginx range 过滤器整形溢出漏洞 漏洞信息: 当使用nginx标准模块时,攻击者可以通过发送包含恶意构造 range 域的 header 请求,来获取响应中的缓存文件头部信息。在某些配置中缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。 漏洞影响: 当Nginx服务器使用代理缓存的情况下攻击者通过利用该漏洞可以拿到服务器的后端真实IP或其他敏感信息;通过我们的分析判定该漏洞利用难度低可以归属于low-hanging-fruit的漏洞在真实网络攻击中也有一定利用价值。 影响版本: Nginx version 0.5.6 - 1.13.2 漏洞利用:
#访问缓存文件拿到 Content-Length,以 /proxy/demo.png 为例:
$ curl -I http://127.0.0.1:8000/proxy/demo.png
Content-Length: 16585
#找个比 Content-Length: 16585 这个数大的值
#例如 17208, 第二个 range 值为 0x8000000000000000-17208, 也就是 9223372036854758600
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
WeiyiGeek.
Nginx文件类型错误解析漏洞
描述:Nginx漏洞分析实例,在2010年的时候国内安全组织80Sec发现了一个Nginx文件类型解析漏洞,但实际上这个并非Nginx本身的漏洞,而是由于配置导致的安全问题。 漏洞危害:利用该漏洞,攻击者可以将任意文件类型作为PHP文件解析。 漏洞分析:Nginx默认是以CGI的方式支持PHP的解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。 配置文件中会有类似如下内容:
#location ~ .php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
# index index.php
#}
问题产生: location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME
, 然后是由Nginx生成的$fastcgi_script_name
来决定的;通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的这里就是产生问题的点;
当访问 http://192.168.1.103/phpinfo.jpg/1.php这个URL时 $fastcgi_script_name会被设置为“phpinfo.jpg/1.php “ ,然后构造成SCRIPT_FILENAME传递给PHP CGI;
但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?
#由于php.ini文件中的cgi参数
cgi.fix_pathinfo=1
#如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:
到这里PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。
漏洞利用:假设某一服务器存在该漏洞,攻击者可以通过上传一张包含PHP后门代码的图片来获取WebShell,这是一种常见的攻击方式。 POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:
#访问http://www.80sec.com/robots.txt
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain #关键点
#访问http://www.80sec.com/robots.txt/80sec.php
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html #关键点
#其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。
解决办法:
#方式1:
php.ini文件将 cgi.fix_pathinfo 的值设置为0
#方式2:
if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}
Nginx配置错误而导致目录遍历漏洞
#在Nginx的配置文件中如果开启了autoindex选项,并采用类似下面的配置时会造成目录遍历漏洞。
location /test {
alias html/test/;
autoindex on;
}
- 微信公众平台增加批量获取用户基本信息接口
- 谈网络适配器
- 【框架】为降低机器学习开发者门槛,苹果发布了Turi Create框架
- 新闻数据库分表案例
- 建立智能的解决方案:将TensorFlow用于声音分类
- Plugin Hook 设计与实现
- 数据与应用程序间通信·UDP Socket
- Java 数据类型转换
- Spring boot with Scheduling
- Spring Properties 文件读取
- 【学术】你真的知道什么是随机森林吗?本文是关于随机森林的直观解读
- Spring boot 将 Session 放入 Redis
- 【教程】估算一个最佳学习速率,以更好地训练深度神经网络
- SNS 数据库设计
- 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 数组属性和方法
- 开源、强大的Linux服务器集群管理工具,比宝塔好用!
- 组合数学-抽屉原理
- 利用 Harbor 搭建企业级私有镜像仓库
- Redis-Java项目应用(Jedis、SpringBoot整合、工具类模板)
- 微软被指剽窃他人开源作品!作者被迫终止该项目
- 秋招系列 | 推荐岗史上最强面经来袭(上)
- 一个Tomcat 如何部署多个项目?附多种解决方案及详细步骤!
- 初识SpringCloud
- .NET程序设计复习总结
- Ribbon讲解与应用
- break, continue 和 return 的用法及区别
- JavaWeb 图书管理系统
- 深度学习-多分类问题
- umi项目中dva effects异常处理
- Eureka应用