Nginx 配置错误导致漏洞

文章目录

  • Nginx 配置错误导致漏洞
    • 1. 环境启动
    • 2. CRLF注入漏洞
      • 2.1 漏洞描述
      • 2.2 漏洞原理
      • 2.3 漏洞利用
      • 2.4 修复建议
    • 3. 目录穿越漏洞
      • 3.1 漏洞描述
      • 3.2 漏洞原理
      • 3.3 漏洞利用
      • 3.4 修复建议
    • 4. add_header被覆盖
      • 4.1 漏洞描述
      • 4.2 漏洞原理
      • 4.3 漏洞利用
      • 4.4 修复建议

Nginx 配置错误导致漏洞

链接地址:Vulhub - Docker-Compose file for vulnerability environment。

1. 环境启动

image-20230909105734130

运行成功后,Nginx将会监听8080/8081/8082三个端口,分别对应三种漏洞。

2. CRLF注入漏洞

2.1 漏洞描述

说明内容
漏洞编号
漏洞名称Nginx 配置错误导致CRLF注入漏洞
漏洞评级高危
影响范围
漏洞描述CRLF是”回车+换行”(\r\n)的简称,其十六进制编码分别为0x0d和0x0a(URL编码则是%0d,%0a)
在HTTP协议中,HTTP header是用一个CRLF分隔的,HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP内容并显示出来。一旦我们能够控制HTTP消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码。
修复方案输入验证和过滤
输出编码和过滤
HTTP 响应头部处理
更新和升级软件

2.2 漏洞原理

nginx的错误配置如下,该配置的用意是让http请求跳转到https请求。其中$uri就是我们的访问的地址,该变量是可控的。其中https://$host$uri会出现在http响应报文中,这样就可以通过改变$uri来控制http的响应报文。

location / {return 302 https://$host$uri;
}

2.3 漏洞利用

正常访问http://192.168.188.185:8080的时候,nginx重定向后,会出现在http响应头中出现Location字段,如下图所示:

image-20230909110431404

当访问http://192.168.188.185:8080/%0d%0awuhu时,响应头如下图所示。 %0d%0a\r\n,也就是换行符,所以在url中加入一个换行符即可将恶意数据写入http响应头。

image-20230909110634556

添加两个换行符可以将数据写入响应体,例如访问 /%0d%0a%0d%0a<script>alert(wuhu)</script>,通过这种注入可实现xss攻击

image-20230909111451941

2.4 修复建议

  1. 输入验证和过滤: 对于用户提供的输入,包括表单提交、URL 参数和 Cookie 值等,进行适当的输入验证和过滤。确保输入不包含任何回车符或换行符,或者对其进行转义或剥离。这样可以防止攻击者在输入中注入 CRLF 字符。
  2. 输出编码和过滤: 在生成 HTTP 响应时,确保对输出进行适当的编码和过滤。避免直接将用户提供的内容插入到响应头部中,以防止 CRLF 注入。建议使用合适的编码函数或库来处理输出,确保其中不包含任何特殊字符。
  3. 更新和升级软件: 确保您的 Web 服务器软件(如 Nginx)以及相关的组件和库已经升级到最新版本。软件更新通常包括修复安全漏洞的补丁,有助于防止 CRLF 注入漏洞的利用。
  4. HTTP 响应头部处理: 在配置服务器时,务必谨慎处理 HTTP 响应头部。确保所有响应头部都是由服务器生成,并且不受用户输入的影响。避免将用户提供的内容作为响应头部的一部分。

3. 目录穿越漏洞

3.1 漏洞描述

当攻击者能够控制 Nginx 服务器的一个参数(例如 HTTP 请求中的某个参数),并且使用该参数从服务器获取一个文件时,如果未对该参数进行适当的过滤或校验,则攻击者可以通过构造指向其他路径的符号链接或特殊字符序列,来访问服务器上不应被访问的文件或目录。

3.2 漏洞原理

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。在下面配置中/files在匹配字符串的时候可以匹配到 /files..,而 /files..转化成别名时就会变成 /home/..,这样就可以访问到home目录的上一级目录。

location /files {alias /home/;
}

/files改成 /files/即可修改该漏洞。

3.3 漏洞利用

访问http://192.168.188.185:8081/files../

image-20230909114610988

3.4 修复建议

  • 审查和更新 Nginx 配置:仔细审查 Nginx 的配置文件,特别关注代理和重定向规则,确保没有任何配置错误。确保将请求 URL 和路径正确传递给后端服务器,避免可能导致目录穿越的配置错误。
  • 输入验证和过滤:对收到的所有用户输入进行严格的验证和过滤,特别是涉及到文件路径、URL 参数等与文件系统相关的输入。验证用户输入是否符合预期的格式和范围,排除任何可能的恶意输入。
  • 规范化路径:在处理用户输入之前,对路径进行规范化处理,以确保路径格式的一致性,并移除任何冗余或不必要的字符。使用可靠的路径规范化函数或库,避免路径解析中的任何安全漏洞。
  • 限制访问权限:确保服务器上的文件和目录设置了正确的访问权限。对于敏感文件和目录,只授予必要的最小权限,并限制对它们的访问。这样即使目录穿越成功,攻击者也无法获取敏感信息。

4. add_header被覆盖

4.1 漏洞描述

在 Nginx 配置中,add_header 指令用于添加响应头信息。该指令的作用是在响应中添加自定义的 HTTP 头部,以便向客户端传递特定的信息。然而,如果在配置中存在错误或竞争条件,攻击者可能会利用这种情况来覆盖或篡改 add_header 指令的内容。

4.2 漏洞原理

Nginx的配置文件分为Server、Location、If等一些配置块,并且存在包含关系,和编程语言比较类似。如果在外层配置的一些选项,是可以被继承到内层的。

但这里的继承也有一些特性,比如add_header,子块中配置后将会覆盖父块中的add_header添加的所有HTTP头,造成一些安全隐患。

如下列代码,整站(父块中)添加了CSP头:

add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options DENY;location = /test1 {rewrite ^(.*)$ /xss.html break;
}location = /test2 {add_header X-Content-Type-Options nosniff;rewrite ^(.*)$ /xss.html break;
}

补充:

  • CSP(Content Security Policy)头是一种 HTTP 响应头部,用于指定浏览器加载和执行网页内容时的安全策略。它提供了一种机制,让网站管理员能够控制网页中可执行的内容来源以及允许的操作。

  • CSP 头通过定义一系列的策略指令来限制浏览器执行的特定操作,包括脚本执行、CSS 样式应用、字体加载、图片显示等。这些策略指令可以防止跨站点脚本攻击(XSS)、点击劫持、数据泄露等安全威胁。

  • default-src:指定默认情况下允许加载内容的来源。

4.3 漏洞利用

image-20230909115920732

test1

image-20230909120017210

/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效,/test2将Content-Security-Policy(内容安全策略)头覆盖。

image-20230909120253429

此时,test2的csp就完全失效了,成功触发XSS:

http://192.168.188.185:8082/test2#<img src=1 onerror=alert(wuhu)>

在IE浏览器中测试

image-20230909121103420

test1也可以

image-20230909121028430

但是在火狐浏览器,Edge浏览器,谷歌浏览器中都无法触发XSS。

image-20230909120823321

4.4 修复建议

  • 检查配置文件:仔细检查 Nginx 的配置文件,特别是涉及到 add_header 指令的部分。确保没有重复的 add_header 指令或者其他指令导致 add_header 被覆盖。

  • 使用 always 参数:在 add_header 指令中使用 always 参数,例如 add_header X-Frame-Options "SAMEORIGIN" always;。这样可以确保在所有情况下都会发送相应的头部,包括错误页面和重定向。

  • 使用不同的名字:将 add_header 指令的名称更改为独特的名称,以避免与其他指令冲突。例如,将其命名为 my_add_header。

  • 块顺序:确保 Nginx 配置文件中加载模块的顺序正确。有些模块可能会修改或覆盖其他模块设置的头部值。将具有更高优先级的模块指令放在较低优先级模块指令之前,以确保正确的设置。

  • 使用 location 块:将 add_header 指令放置在适当的 location 块中。根据需要,选择合适的 location 来添加头部,以确保正确地应用到特定的请求或响应。

  • 配置测试:在修改配置文件后,重新加载 Nginx 服务,并进行测试以确保修复生效。可以通过发送请求并检查响应头部来验证 add_header 是否正确设置。

  • 使用 location 块:将 add_header 指令放置在适当的 location 块中。根据需要,选择合适的 location 来添加头部,以确保正确地应用到特定的请求或响应。

  • 配置测试:在修改配置文件后,重新加载 Nginx 服务,并进行测试以确保修复生效。可以通过发送请求并检查响应头部来验证 add_header 是否正确设置。

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

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

相关文章

YOLO的基本原理详解

YOLO介绍 YOLO是一种新的目标检测方法。以前的目标检测方法通过重新利用分类器来执行检测。与先前的方案不同&#xff0c;将目标检测看作回归问题从空间上定位边界框&#xff08;bounding box&#xff09;并预测该框的类别概率。使用单个神经网络&#xff0c;在一次评估中直接…

C#winform导出DataGridView数据到Excel表

前提&#xff1a;NuGet安装EPPlus&#xff0c;选择合适的能兼容当前.net framwork的版本 主要代码&#xff1a; private void btn_export_Click(object sender, EventArgs e) {SaveFileDialog saveFileDialog new SaveFileDialog();saveFileDialog.Filter "Excel Files…

Mysql基于成本选择索引

本篇文章介绍mysql基于成本选择索引的行为&#xff0c;解释为什么有时候明明可以走索引&#xff0c;但mysql却没有走索引的原因 mysql索引失效的场景大致有几种 不符合最左前缀原则在索引列上使用函数或隐式类型转换使用like查询&#xff0c;如 %xxx回表代价太大索引列区分度过…

ElMessageBox.prompt 点击确认校验成功后关闭

ElMessageBox.prompt(, 验证取货码, {inputPattern: /^.{1,20}$/,inputErrorMessage: 请输入取货码,inputPlaceholder: 请输入取货码,beforeClose: (action, instance, done) > {if (action confirm) {if (instance.inputValue) {let flag false;if (flag) {done()} else …

pandas(四十三)Pandas实现复杂Excel的转置合并

一、Pandas实现复杂Excel的转置合并 读取并筛选第一张表 df1 pd.read_excel("第一个表.xlsx") df1# 删除无用列 df1 df1[[股票代码, 高数, 实际2]].copy() df1df1.dtypes股票代码 int64 高数 float64 实际2 int64 dtype: object读取并处理第二张表…

jmeter 数据库连接配置 JDBC Connection Configuration

jmeter 从数据库获取变量信息 官方文档参考&#xff1a; [jmeter安装路径]/printable_docs/usermanual/component_reference.html#JDBC_Connection_Configuration 引入数据库连接&#xff1a; 将MySQLjar包存放至jemter指定目录&#xff08;/apache-jmeter-3.3/lib&#xff09…

buuctf web 前5题

目录 一、[极客大挑战 2019]EasySQL 总结&#xff1a; 二、[极客大挑战 2019]Havefun 总结&#xff1a; 三、[HCTF 2018]WarmUp 总论&#xff1a; 四、[ACTF2020 新生赛]Include 总结&#xff1a; 五、[ACTF2020 新生赛]Exec 总结&#xff1a; 一、[极客大挑战 2019]…

有哪些适合初学者的编程语言?

C语言 那为什么我还要教你C语言呢&#xff1f;因为我想要让你成为一个更好、更强大的程序员。如果你要变得更好&#xff0c;C语言是一个极佳的选择&#xff0c;其原因有二。首先&#xff0c;C语言缺乏任何现代的安全功能&#xff0c;这意味着你必须更为警惕&#xff0c;时刻了…

Json“牵手”易贝商品详情数据方法,易贝商品详情API接口,易贝API申请指南

易贝是一个可让全球民众在网上买卖物品的线上拍卖及购物网站&#xff0c;易贝&#xff08;EBAY&#xff09;于1995年9月4日由Pierre Omidyar以Auctionweb的名称创立于加利福尼亚州圣荷塞。人们可以在易贝上通过网络出售商品。2014年2月20日&#xff0c;易贝宣布收购3D虚拟试衣公…

SpringMVC的简介及工作流程

一.简介 Spring MVC是一个基于Java的开发框架&#xff0c;用于构建灵活且功能强大的Web应用程序。它是Spring Framework的一部分&#xff0c;提供了一种模型-视图-控制器&#xff08;Model-View-Controller&#xff0c;MVC&#xff09;的设计模式&#xff0c;用于组织和管理Web…

MATLAB中isoutlier函数用法

目录 语法 说明 示例 检测向量中的离群值 使用均值检测方法 使用移窗检测法 检测矩阵中的离群值 可视化离群值阈值 isoutlier函数的功能是查找数据中的离群值 语法 TF isoutlier(A) TF isoutlier(A,method) TF isoutlier(A,"percentiles",threshold) TF…

controller接口上带@PreAuthorize的注解如何访问 (postman请求示例)

1. 访问接口 /*** 查询时段列表*/RateLimiter(time 10,count 10)ApiOperation("查询时段列表")PreAuthorize("ss.hasPermi(ls/sy:time:list)")GetMapping("/list")public TableDataInfo list(LsTime lsTime){startPage();List<LsTime> l…

01 PHP基础知识讲解

一 php基础知识 PHP文件的默认拓展名是“php”。 PHP文件中包含HTML标记、PHP标记、PHP代码以及空格和注释。 PHP标记&#xff1a;开始标记<?php 结束标记 ?> 中间内容是PHP代码。 PHP代码&#xff1a;学习第一个指令 echo 功能是用于输出字符串 。 语句结束符&a…

Kotlin+MVVM 构建todo App 应用

作者&#xff1a;易科 项目介绍 使用KotlinMVVM实现的todo app&#xff0c;功能界面参考微软的Todo软件&#xff08;只实现了核心功能&#xff0c;部分功能未实现&#xff09;。 功能模块介绍 项目模块&#xff1a;添加/删除项目&#xff0c;项目负责管理todo任务任务模块&a…

时序分解 | MATLAB实现MVMD多元变分模态分解信号分量可视化

时序分解 | MATLAB实现MVMD多元变分模态分解信号分量可视化 目录 时序分解 | MATLAB实现MVMD多元变分模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MVMD多元变分模态分解 可直接替换Excel运行包含频谱相关系数图 Matlab语言 1.算法新颖小众&…

Matlab之数组字符串函数汇总

一、前言 在MATLAB中&#xff0c;数组字符串是指由字符组成的一维数组。字符串可以包含字母、数字、标点符号和空格等字符。MATLAB提供了一些函数和操作符来创建、访问和操作字符串数组。 二、字符串数组具体怎么使用&#xff1f; 1、使用单引号或双引号括起来的字符序列 例…

数据结构 - 双向链表

文章目录 目录 文章目录 前言 一、什么是双向链表? 双向链表有什么优势? 二、双向链表的设计和实现 1.设计思想 尾增 : 在链表的末尾添加新的元素 头插 : 在链表头部插入节点 删除 : 根据val的值删除节点 查找 : 根据索引的值查找并返回节点 总结 前言 大家好,今天给…

Linux TCP和UDP协议

目录 TCP协议TCP协议的面向连接1.三次握手2.四次挥手 TCP协议的可靠性1.TCP状态转移——TIME_WAIT 状态TIME_WAIT 状态存在的意义&#xff1a;&#xff08;1&#xff09;可靠的终止TCP连接。&#xff08;2&#xff09;让迟来的TCP报文有足够的时间被识别并被丢弃。 2.应答确认、…

Google Chrome 浏览器以全屏模式打开

目录 前言以全屏模式打开禁止弹出无法更新的提示窗禁止翻译网页Chrome设置禁止翻译网页可能1可能2可能3 网页添加指令禁止Chrome翻译网页 禁用脚本气泡浏览器解决办法html解决办法方法1&#xff1a;鼠标滑过超链接时&#xff0c;使状态栏不出现超链接方法2&#xff1a;方法3&am…

微服务06-Dockerfile自定义镜像+DockerCompose部署多个镜像

常见的镜像在DockerHub能找到&#xff0c;但是我们自己写项目得自己构造镜像 1 镜像结构 作用&#xff1a;提高复用性&#xff0c;当应用需要更新时&#xff0c;不再是整个系统重装进行更新 &#xff0c;而是对需要更新的部分进行更新&#xff0c;其他地方不动——>这就是分…