Nginx 配置错误导致的漏洞

news2024/11/16 10:25:45

目录

1. CRLF注入漏洞

 Bottle HTTP头注入漏洞

2.目录穿越漏洞

3. http add_header被覆盖


本篇要复现的漏洞实验有一个网站直接为我们提供了Docker的环境,我们只需要下载下来就可以使用:

Docker环境的安装可以参考:Docker安装

漏洞环境的搭建具体步骤如下:
(1)首先我们需要下载环境的源码:

https://github.com/vulhub/vulhub/archive/master.zip

(2)将下载的源码上传到centos环境中

(3)然后进入/root/vulhub-master/nginx目录中,这就是该文件为我们提供的有关nginx的一些漏洞环境

(4)然后我们就可以移动到对应的环境中使用一下命令来拉取环境

docker compose up -d

然后就可以正常使用了 

1. CRLF注入漏洞

CRLF注入漏洞,也叫做HTTP头部注入漏洞

在HTTP头部每一行的结尾都会有一个 \r \n

下面两种情景十分常见:

用户访问http://example.com/aabbcc,自动跳转到https://example.com/aabbcc (自动将http->https)

用户访问http://example.com/aabbcc,自动跳转到http://www.example.com/aabbcc(自动增加一级域名)

第二个场景主要是为了统一用户访问的域名,更加有益于SEO优化。

在跳转的过程中,我们需要保证用户访问的页面不变,所以需要从Nginx获取用户请求的文件路径。

查看Nginx文档,可以发现有三个表示uri的变量:

$uri

$document_uri

$request_uri

1和2表示的是解码以后的请求路径,不带参数;3表示的是完整的URI(没有解码)。

错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

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

#因为$uri是解码以后的请求路径,所以就会包含换行符,就有可能造成CRLF漏洞 这个CRLF注入漏洞,导致固定漏洞、设置cookie引发的csrf漏洞或者xss漏洞,其中,我们可以注入两个\r \n即可控制HTTP体进行xss,但是因为浏览器会认为这是一个300跳转,所以并不会显示我们注入的内容

Payload: http://your-ip:8080/%0d%0aSet-Cookie:%20a=1,可注入Set-Cookie头。

这种情况下,我们可以使用一些技巧:比如使用CSP头来ifame的地址,这样浏览器并不会跳转,进而执行我们插入的HTML

下面我简单的使用这个漏洞环境中的/root/vulhub-master/nginx/insecure-configuration环境来演示一下CRLF漏洞

(1)首先我们移动到对应的环境下

(2)使用docker compose up -d来拉取环境

[root@centos111 insecure-configuration]# docker compose up -d
[+] Running 1/1
 ✔ Container insecure-configuration-nginx-1  Started 

注:拉取环境的前提是我们安装了Docker

(3)可以使用dokcer ps 来查看一下容器是否运行:

可以看到正常的运行了 

(4)现在可以做一个简单的测试,在shell中使用curl来尝试在头部增加一个%0d%0d,也就是\r\n,然后插入一条语句

curl -I http://127.0.0.1:8080/%0d%0aSet-cookie:%20a=1
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.13.0
Date: Fri, 24 Nov 2023 01:25:36 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://127.0.0.1:8080/
Set-cookie: a=1

可以看到我们利用%0d%0a成功的在头部增加了一行Set-cookie:a=1 

(5)那么我们现在就可以使用Burpsuite来抓一个这个网页的包,尝试使用CRLF注入

在本机上打开BP软件,开启代理,然后打开本机的代理

我们可以构造一个反弹性xss的脚本插入到头部中:

<script>alert(1)</script> 

可以看到我们成功的利用%0d%0a在头部插入了script弹窗代码,使用两个%0d%0a的原因是因为第一个是让我们来到新的一行,第二个换行是为了与头部分割一行,否则就无法正常插入

下面用这样一个案例来举例Python中的一个CRLF漏洞

 Bottle HTTP头注入漏洞

这时我们要运行的bottle_demo.py代码

import bottle
from bottle import route,run, template,request,response
@route('/')
def index():
    path = request.query.set('path','http://www.xianoupeng.com')
    return bottle.redirect(path)

if __name__ == '__main__':
    bottle.debug(True)
    run(host='localhost', port=8081)

 因为redirect函数是向response中插入一个HTTP头,也就是Location: xxx,所以存在头注入。

(1)我们运行这个python脚本,然后尝试使用\r\n的方式进行弹窗

 但实际测试的过程中遇到了一个有趣的问题,看看redirect函数的实现:

def redirect(url, code=None):
    """ Aborts execution and causes a 303 or 302 redirect, depending on
        the HTTP protocol version. """
    if not code:
        code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302
    res = response.copy(cls=HTTPResponse)
    res.status = code
    res.body = ""
    res.set_header('Location', urljoin(request.url, url))
    raise res</pre>

其中使用了一个urljoin,将当前url和我传入的path进行了一次"join",经过这个操作事情就变得很微妙了:Location头一定有一个值。这种情况下,浏览器就不会渲染页面,会直接跳转到Location头指向的地址。也就是说,如果我要利用CRLF构造XSS的话,这里是不会触发的。

回想上面提到过的新浪的那个CRLF,那个漏洞的Location是可以为空的,如果浏览器发现Location为空就不会进行跳转,进而渲染了后面注入的HTML,造成XSS。

(2)可以使用一下两种方式来解决这个问题

方法1:将跳转的url端口设为<80

http://localhost:8081/?path=www.oupeng.com:0%0d%0aX-XSS-Protection:0%0d%0a%0d%0a%3Cscript%3Ealert(location.href)%3C/script%3E

python中确实收到了请求 

但是页面还是告诉我们无法访问 

注:这种方法在现在的浏览器中无法正常实现,如果需要复现,需要降低浏览器的版本

方法2:使用CSP禁止iframe的跳转

可以在运行Python脚本的前提下去在本地新建一个web.php代码,通过访问php文件使用iframe将httpL//localhost:8081页面嵌入,从而实现弹窗。

php代码:

<?php
header("Content-Security-Policy: frame-src http://localhost:8081/"); //这里设置了CSP
?>
<iframe src="http://localhost:8081/?path=http://www.baidu.com/%0a%0dX-XSS-Protection:0%0a%0d%0a%0d<script>alert(location.href)</script>"></iframe>

 通过尝试发现Firefox可以弹窗,但是Chrome不能。

如果python代码是这样的则上面的两种方式均可以实现

import bottle
from bottle import route,run, template,request,response


@route('/')
def index():
    server = bottle.request.query.get('server')  # 接收Server参数
    bottle.response.add_header('Server', server)
    return bottle.response

if __name__ == '__main__':
    bottle.debug(True)
    bottle.run(host='localhost', port=8081)

总结一下,安全的做法应该为:

不安全:
location / {
    return 302 https://$host$uri; 
}
安全
location / {
    return 302 https://$host$request_uri;  //Request不会对%0d%0a解码,所以无法换行
}

2.目录穿越漏洞

这个常见于nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态的文件需要nginx来处理。

假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名:

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。

错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

location /files { #这里没有 /
    alias /home/; #因为真正的文件在/home下,所以这里设置了别名/home/
}

此时我们的dokcer环境中的文件配置就是这样的:

server {
	listen 8081;

	root /usr/share/nginx/html;

	index index.html;

	server_name _;

    autoindex on;

	location /files {
        alias /home/;
    }
}

此时访问192.168.159.200:8081,就可以获取到/files/help.txt文件

 但是我们注意到,url上/files没有加后缀/ ,而alias设置的/home/是有后缀/ 的,这个 / 就导致我们可以从 /home/ 目录穿越到它的上层目录:

Payload: http://your-ip:8081/files../ 

此时我们就可以看到我们可以移动到/目录下,这时就会出现任意文件下载的危险漏洞

解决方案:必须保证location和alias的值都有后缀/ 或者都没有这个后缀

我们修改配置文件为:

server {
	listen 8081;

	root /usr/share/nginx/html;

	index index.html;

	server_name _;

    autoindex on;

	location /files/ {
        alias /home/;
    }
}

重启docker:

docker restart 你的镜像编号

 然后再次尝试路径穿越访问:

可以看到已经无法完成路径穿越了。

3. http add_header被覆盖

CSP:(Content-Security-Policy) 可以防御xss注入

Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。

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

server{
add_header Content-Security-Policy "default-src 'self'"; 
 #default-src用来设置上面各个选项的默认值。
#上面代码限制所有的外部资源,都只能从当前域名加载。
​
add_header X-Frame-Options DENY;
//这里会覆盖父类的CSP,CSP就失效了
location = /test1 {
    rewrite ^(.*)$ /xss.html break;
}
​
​
location = /test2 {
    add_header X-Content-Type-Options nosniff;
    rewrite ^(.*)$ /xss.html break;
}
#这里的location会将前面的location覆盖
}

/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效,

所以XSS可以被触发:

可以看到我输入的js代码中的标签被浏览器转义,这里并没有成功,那么可以尝试在低版本的浏览器中测试一下:

可以看到,在低版本中我们是可以利用这个错误配置正常弹窗的。

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

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

相关文章

Sublime Text 4168最新代码编辑

Sublime Text是一款功能强大的文本编辑器&#xff0c;具有以下主要功能&#xff1a; 支持多种编程语言的语法高亮和代码自动完成功能&#xff0c;包括Python、JavaScript、HTML、CSS等。提供代码片段&#xff08;Snippet&#xff09;功能&#xff0c;可以将常用的代码片段保存…

vite项目配置vite.config.ts在打包过程中去除日志

在生产环境上&#xff0c;务必要将日志清除干净&#xff0c;其因有二&#xff0c;在webgis系统中&#xff0c;有很多几何数据&#xff0c;体积大、数量多&#xff0c;很容易引起系统卡顿&#xff1b;清除log后&#xff0c;系统看着舒服&#xff0c;协同开发有很多无聊的日志&am…

展现天津援疆工作成果 “团结村里看振兴”媒体采风团走进和田

央广网天津11月19日消息(记者周思杨)11月18日&#xff0c;由媒体记者、书法和摄影家、旅行社企业代表等40余人组成的“团结村里看振兴”媒体采风团走进新疆和田。在接下来的一周时间里&#xff0c;采风团将走访天津援疆和田地区策勒县、于田县、民丰县乡村振兴示范村&#xff0…

FL Studio21.2.0中文语言包编曲软件入门讲解

FL Studio常称水果&#xff0c;是一款功能强大的编曲软件&#xff0c;集编曲&#xff0c;录音&#xff0c;剪辑&#xff0c;混音于一身&#xff0c;简单易上手&#xff0c;灵活性高&#xff0c;强大到突破想象。 FL Studio&#xff0c;当前版本 FL Studio21&#xff0c;百分之…

PyQt基础_004_ 按钮类控件QPushButton以及自定义按钮控件

Qpushbutton基本操作 1.热键 2.按钮加图标 3.按钮事件等 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class Form(QDialog):def __init__(self, parentNone):super(Form, self).__init__(parent)layout QVBoxLayout()se…

基于Vue+SpringBoot的个人健康管理系统

项目编号&#xff1a; S 040 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S040&#xff0c;文末获取源码。} 项目编号&#xff1a;S040&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健…

Linux 6.7全面改进x86 CPU微码加载方式

导读最近&#xff0c;社区在清理 Linux 上的 Intel/AMD x86 CPU 微代码加载方面做了大量的工作&#xff0c;这些工作现已合并到 Linux 6.7 中。 由于在启动时加载 CPU 微代码对于减少不断出现的新 CPU 安全漏洞以及有时解决功能问题非常重要&#xff0c;Thomas Gleixner 最近开…

什么是 TLS/SSL 握手

TLS/SSL 握手是一个加密过程&#xff0c;每当客户端&#xff08;如浏览器&#xff09;与服务器建立连接时&#xff0c;都会在后台进行&#xff0c;此握手协议有助于客户端和服务器之间的安全连接&#xff0c;从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…

【开源】基于Vue.js的数据可视化的智慧河南大屏

项目编号&#xff1a; S 059 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S059&#xff0c;文末获取源码。} 项目编号&#xff1a;S059&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 …

前端技术探秘-Nodejs的CommonJS规范实现原理 | 京东物流技术团队

了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node中增添了很…

idea 问题合集

调试按钮失效&#xff1a; 依次点击&#xff1a;Modules-web-src-Sources&#xff0c;重启IDEA即可&#xff08;网上看到的方法&#xff0c;原因呢未明&#xff09;

了解冶金行业MES系统的重要性与优势

冶金行业生产工艺极为复杂&#xff0c;冶金行业生产的产品种类多而繁复&#xff0c;并且每种企业生产的产品差异性极大&#xff0c;加上该行业生产需要各种大型生产设备&#xff0c;导致其工艺流程繁琐复杂&#xff0c;也因此在其生产过程中存在许多不安全的因素&#xff0c;若…

ros2 mqtt-client 安装并测试

mqtt_client包提供了 ROS Nodelet 或 ROS 2组件节点&#xff0c;使连接的基于 ROS 的设备或机器人能够使用MQTT协议通过 MQTT 代理交换 ROS 消息。这通常适用于任意 ROS 消息类型。mqtt_client还可以与在不基于 ROS 的设备上运行的 MQTT 客户端交换原始消息。 源码地址&#xf…

系列五、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…

什么是高防CDN?CDN的设计原理及应用场景是什么?

随着互联网的快速发展&#xff0c;人们对网络的速度和稳定性要求也越来越高。CDN技术作为网络优化的重要手段&#xff0c;被越来越多的企业和网站所采用。现在我为大家介绍一下CDN的设计原理以及应用场景。 一.高防CDN技术概述 高防CDN是一种应用了高级防御技术的内容分发网络…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现&#xff1a;思路&#xff1a; 将text标签换为rich-text&#xff0c;并给rich-text增加换行的样式class类名解决&#xff1a;

C语言--不创建第三个变量,实现对两个数字的交换

我们先来看一下&#xff0c;创建第三个变量交换两个数字。 #include<stdio.h> {int a2;int b3;int tmp0;tmpa;ab;btmp;return 0; } 再看一下不创建的方法 法一&#xff1a; //加减法 缺点可能会溢出 int main() {int a3;int b5;printf("before:a%d b%d\n"…

PSNR计算

1.比较不同图像预处理方式对PSNR的影响 下面的代码是将单张图片喂入JSCC&#xff0c;计算PSNR。实验目的是&#xff1a;比较不同图像预处理方式对PSNR的影响。 PSNR定义如下 from torch.nn import MSELoss from PIL import Image img_PIL Image.open("/home/xxx/xxx/da…

HandBrake 1.7 近日发布

导读HandBrake 1.7 近日发布&#xff0c;作为这个开源、免费和跨平台视频转码器应用程序的重大更新&#xff0c;适用于 GNU/Linux、macOS 和 Windows 系统。 在 HandBrake 1.6 发布近一年后&#xff0c;HandBrake 1.7 版本为 Linux 用户提供了许多好处&#xff0c;包括视频摘要…

优思学院|质量工程师在汽车行业待遇好吗?

优思学院认为质量工程师在汽车行业的待遇有可能相对较好的。随着中国汽车品牌在国内市场的崛起&#xff0c;特别是在电动汽车领域的增长&#xff0c;质量工程师在保障产品质量和安全性方面变得非常重要。由于中国汽车制造商对产品质量的高度重视&#xff0c;质量工程师在制定和…