Nginx漏洞解析及复现

Nginx漏洞

Nginx能做到正向代理、反向代理、负载均衡、HTTP服务器等,强大的功能不言而喻,但也伴随着使用 上的风险,深入理解Nginx的漏洞有助于创建安全的业务系统。

Nginx解析漏洞

漏洞原理

Nginx的解析漏洞的出现和Nginx的版本没有关系,漏洞的产生是由于php配置问题导致的。 影响的范围:全版本 Nginx拿到文件路径(URI)/test.jpg/shell.php后,一看后缀是.php,便认为该文件是php文件,转交给 php去处理。php一看/test.jpg/shell.php不存在,便删去最后的/shell.php,又看/test.jpg存在,便 把/test.jpg当成要执行的文件了.

相关的配置:

# php.ini
cgi.fix_pathinfo=https://img-home.csdnimg.cn/images/20230724024https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL59.png?origin_url=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL&pos_id=7fnvOTFL
# php-fpm.conf
security.limit_extensions = .php .jpg

cgi.fix_pathinfo=https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL

开启这一选项有什么用呢?看名字就知道是对文件路径进行“修理”。何谓“修理”?举个例子,当php遇到 文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的 “/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件 “/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。

security.limit_extensions = .php .jpg

可执行的后缀,通常是因为需要PHP去执行一些静态文件,才会这样做配置,但是这样做了之后,就危险了。

漏洞复现

这里还是利用vulhub来进行复现,进入目录:vulhub/nginx/nginx_parsing_vulnerability

执行:

docker-compose up -d

访问浏览器:

默认情况下在上传文件目录下有一个图片码,我们可以访问来试试:

根据上面的介绍,我们可以在后面加上一个php后缀:

说明这个地方是存在漏洞的。

接下来直接上传一句话木马试一试:

没法上传,查看源码:

<?php
if (!empty($_FILES)):
// Check for errors
if($_FILES['file_upload']['error'] > 0){
    die('An error ocurred when uploading.');
}
if(!getimagesize($_FILES['file_upload']['tmp_name'])){
    die('Please ensure you are uploading an image.');
}
// Check filetype
if(stripos($_FILES['file_upload']['type'], 'image/') !== 0){
    die('Unsupported filetype uploaded.');
}
// Check filesize
if($_FILES['file_upload']['size'] > 500000){
    die('File uploaded exceeds maximum upload size.');
}
// Check filesize
if(!is_uploaded_file($_FILES['file_upload']['tmp_name'])) {
    die('File is not uploaded file');
}
$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, ['gif', 'png', 'jpg', 'jpeg'])) {
    die('Unsupported filetype uploaded.');
}
$new_name = __DIR__ . '/uploadfiles/' . md5($_FILES['file_upload']['name']) 
. ".{$ext}";
if(!move_uploaded_file($_FILES['file_upload']['tmp_name'], $new_name)){
    die('Error uploading file - check destination is writeable.');
}
die('File uploaded successfully: ' . $new_name);

通过看源码,我们发现只能上传图片了,这个时候我们想到直接上传图片码:

漏洞防御

主要是两个配置文件中配置不当造成的。

https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL. 修改配置文件vim 对应php.ini

将cgi.fix_pathinfo=https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL,设置为0

2.修改配置文件vim 对应php-fpm.conf  

将security.limit_extensions=,设置为: security.limit_extensions=.php,只允许php文件解析

Nginx 文件名逻辑漏洞(CVE-20https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL3-4547)

漏洞原理

该漏洞影响版本:Nginx 0.8.4https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL ~ https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL.4.3 / https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL.5.0 ~ https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL.5.7

该漏洞利用了Nginx错误的解析了URL地址,导致可以绕过服务端限制,从而解析PHP文件,造成命令执 行的危害。根据nginx.conf文件中location中的定义,以.php结尾的文件都解析为php。

location ~ \.php$ {
    include        fastcgi_params;
    fastcgi_pass   https://img-home.csdnimg.cn/images/20230724024https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL59.png?origin_url=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL&pos_id=7fnvOTFL27.0.0.https://img-home.csdnimg.cn/images/20230724024https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL59.png?origin_url=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=1&pos_id=7fnvOTFL&pos_id=7fnvOTFL:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    fastcgi_param  DOCUMENT_ROOT /var/www/html;
}

若我们访问的文件名为shell.gif[0x20][0x00].php,该文件名以.php结尾可以被FastCGI接收,FastCGI在 读取文件名时被00截断,导致读取的文件名为shell.gif[0x20],配合security.limit_extensions为空即可 利用成功。

为什么security.limit_extensions需要为空?

这样就可以解析任意文件了。

漏洞复现

进入文件夹:vulhub/nginx/CVE-20https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL3-4547

执行:

docker-compose up -d

这个地方上传不了php后缀了,不用尝试了。

直接上传图片码:shell.gif,成功访问:

但是这个地方需要我们上传shell.gif[0x20] ,就是文件名后面需要加一个空额,不然后面找不到文件

windows不需要,因为windows会默认去除空格

放行即可。

现在想办法拿到shell,结合之前分析的,我们直接访问:

http://ip:8080/uploadfiles/shell.gifaa.php

然后抓包将两个a,一个修改为20,一个修改为00:

放到repeater模块进行测试:

发现可行,然后放包:

拿到探针:

这里解释一下为什么需要有空格:

经过查阅资料发现nginx在对url的解析过程中,当路径中存在’.’或url存在’\0’会有如下处理:

#!cpp
case sw_check_uri:      
   ……
       case '.': 
           r->complex_uri = https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL;  //此作为flag会判断使用
ngx_http_parse_complex_uri方法,对路径修复
           state = sw_uri; 
           break;    
casesw_check_uri:    
   ……
        case '\0':   //当遇到\0是,将会判断为非法字符
           return NGX_HTTP_PARSE_INVALID_REQUEST;
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

但如果nginx发现URI中存在空格会跳到如下代码:

上面代码执行完后state='sw_check_uri’然后继续处理URI中的剩余部分,这说明了如果空格和零截断符 相邻的话nginx就不会检测到零截断并放回错误了,这是一个逻辑漏洞,所以通过这种方式我们就可以在 URI中开心的使用零截断的,这就是CVE-20https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL3-4547

注意,[0x20]是空格,[0x00]是\0,这两个字符都不需要编码。

在这里我们需要思考一下:

真正的利用场景? 执行系统命令? 反弹shell?

漏洞防御

https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL.升级版本来的最直接

2.修改配置

Nginx 配置错误导致漏洞

漏洞原理

主要是配置不当造成的

影响范围:所有版本

漏洞复现

进入目录:vulhub/nginx/insecure-configuration

执行:

docker-compose up -d

运行成功后,Nginx将会监听8080/808https://img-home.csdnimg.cn/images/20230724024https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL59.png?origin_url=https%3A%2F%2Fimg-home.csdnimg.cn%2Fimages%2F20230724024159.png%3Forigin_url%3D1%26pos_id%3D7fnvOTFL&pos_id=7fnvOTFL/8082三个端口,分别对应三种漏洞。

CRLF注入漏洞

这个漏洞我没有想到好的利用方式,姑且认为这个地方确实存在这个漏洞吧。 Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

然后直接访问:http://ip:8080/%0a%0dSet-Cookie:%20name=hsj

也可以注入xss:http://ip:8080/%0d%0aSet-Cookie:%20age=18%0d%0a%0d%0a

οnerrοr=alert(/xss/)>

只是这个要看浏览器。Chrome就不行。

目录穿越漏洞

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。 错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

直接访问:

相当于直接穿越出了根目录。

add_header被覆盖

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

/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效。 我们访问根:

我们看到在test2中引入了app.js

访问:

漏洞防御

注意配置即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C-数据结构-树状存储基本概念

‘’’ 树状存储基本概念 深度&#xff08;层数&#xff09; 度&#xff08;子树个数&#xff09; 叶子 孩子 兄弟 堂兄弟 二叉树&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 存储&#xff1a;顺序&#xff0c;链式 树的遍历&#xff1a;按层遍历&#xff0…

Angular封装高德地图组件实现输入框搜索,地图点击选地点

Angular封装高德地图组件实现输入框搜索,地图点击选地点(Angular17版本) 话不多说直接上代码 创建一个独立组件 html代码: <div style"position: relative;"><input #searchInput nz-input placeholder"请输入地址"/><div #mapContaine…

MarianMT进行文本数据增强

B战学习视频&#xff1a;使用MarianMT进行文本数据增强 pip install transformers4.1.1 sentencepiece0.1.94 pip install mosestokenizer1.1.0from transformers import MarianMTModel,MarianTokenizer初始化模型&#xff0c;将英语翻译成罗曼语, target_model_nameHelsink…

力扣爆刷第148天之贪心算法五连刷(区间合并)

力扣爆刷第148天之贪心算法五连刷&#xff08;区间合并&#xff09; 文章目录 力扣爆刷第148天之贪心算法五连刷&#xff08;区间合并&#xff09;一、406. 根据身高重建队列二、452. 用最少数量的箭引爆气球三、435. 无重叠区间四、763. 划分字母区间五、56. 合并区间六、738.…

Android开机动画压缩包zip,自制开机动画(基于Android10.0.0-r41)

文章目录 Android开机动画压缩包zip&#xff0c;自制开机动画1.Android加载压缩包原理2.自制开机动画 Android开机动画压缩包zip&#xff0c;自制开机动画 1.Android加载压缩包原理 这里有个md文件我们看下 核心部分, 首先要创建一个文件叫做desc.txt&#xff0c;这是规定的…

Facebook开户|Facebook广告设计与测试优化

早上好家人们~今天Zoey给大家伙带来的是Facebook广告设计与测试优化&#xff0c;需要的家人们看过来啦&#xff01; 一、避免复杂用图和过多的文字 根据Facebook的数据显示&#xff0c;用户平均浏览一个贴文的时间在手机上仅花1.7秒、在电脑上则为2.5秒。因此&#xff0c;广告…

Dockershim 与 Containerd:两种容器运行时的故事

在不断发展的容器化世界中&#xff0c;两个关键组件经常被混淆&#xff1a;Dockershim 和 containerd。虽然它们在管理容器方面都发挥着重要作用&#xff0c;但它们的用途却截然不同。本文深入探讨了它们的功能&#xff0c;深入探讨了 Dockershim 和 containerd 之间的区别。 揭…

亚马逊运营黑科技,自养号测评技术打造产品权重

关于亚马逊运营&#xff0c;常规运营投入的成本过于高&#xff0c;而且广告投入效果也微乎其微&#xff0c;这也是为什么大多数卖家选择自养号测评的最主要原因。自养号测评技术&#xff0c;是一种用于提升产品权重和知名度的策略。以下是对该技术的详细解析&#xff1a; 一、…

CSS 常用的三种居中定位布局

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“”。 一、三种常用布局 1.子绝父相 margin 居中 注意&#xff1a;父级相对定位&#xff0c;子级绝对定位&#xff0c;并且子级margin-left&#xff0c;margin-top是负值&#xff0c;为宽度、高度的一半。 /** …

Java 中的 Map 集合:入门篇

在 Java 编程中&#xff0c;Map 是用于存储键值对。它提供了快速的查找和检索功能&#xff0c;是处理大量数据的理想选择。 本文将深入介绍 Java 中的 Map 集合&#xff0c;包括其基本概念、常见实现类、典型用法以及一些常见问题的解决方案。 1. Map 的基本概念 Map 是一种键…

电脑响度均衡是什么?它如何开启?

什么是响度均衡 响度均衡&#xff08;Loudness Equalization&#xff09;是一种音频处理技术&#xff0c;旨在平衡音频信号的响度水平&#xff0c;使得不同音源在播放时具有相似的响度感受。简单来说&#xff0c;它可以让用户在播放不同音轨或音频内容时&#xff0c;不需要频繁…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动 2024/6/6 9:48 【原文是在RK3328的Android7.1下写的。我将它升级成为RK3588的Android12了】 RK平台主要采用 FB 和 DRM 两种显示框架。与此相对应&#xff0c; HDMI 也有两套驱动。 FB&#xff1a; LINUX 3.10…

分表策略,你真的分对了?

垂直分表方案 表的记录并不多&#xff0c;但是字段却很长&#xff0c;表占用空间很大&#xff0c;检索表的时候需要执行大量的IO&#xff0c;严重降低了性能。这时需要把大的字段拆分到另一个表&#xff0c;并且该表与原表是一对一的关系。 为什么垂直拆分之后查询性能就变快…

Django里的Form组件

Form组件提供 自动生成HTML标签和半自动读取关联数据 (“半自动”是指还得需要自己手写输入数据进来)表单验证和错误提示 要想创建并使用该组件&#xff0c;操作步骤如下&#xff1a; 在 views.py 里创建类 # 在 views.py 文件里from django import formsclass AssetForm(fo…

HDFS文件块损坏处理方案

1、问题概述 flume采集文本文件存储到hdfs中hive的ods层目录,并在hive中通过msck repair table刷新元数据,加载文本文件。报错如下: 2、问题分析 文件块BP-531411289-172.31.57.12-1539657748238出现了未知异常,导致namenode不能获取该文件块的信息,该文件块是由flume采…

JeecgBoot/SpringBoot升级Nacos(2.0.4到2.2.3)启动报错

错误如下&#xff1a; 报这种错误基本就很头大了&#xff0c;是框架不兼容的问题&#xff0c;自己找很难找到解决方法。 解决方案是把SpringBoot框架版本调高。 修改前&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId&g…

如何在 Mac 上玩 Windows 游戏:Parallels Desktop 玩转秘籍

引言 作为一名热爱游戏的 Mac 用户&#xff0c;你可能曾为 Mac 系统的有限游戏选择感到困扰。然而&#xff0c;通过 Parallels Desktop 虚拟机软件&#xff0c;你可以在 Mac 上轻松畅玩多款 Windows 游戏&#xff0c;尽情体验游戏的乐趣。 为什么选择 Parallels Desktop&…

刷机维修进阶教程-----魅族18系列 魅族21系列机型修复基带 改写参数等 通用新机型操作 步骤解析

在前面几期博文中解析了一些老款机型修复基带 修复各项参数以及改写参数的步骤解析。通常这些步骤可以用于各种问题导致的基带丢失 串码丢失以及有些参数修复或者一些特殊场合需要改写参数的需求。今天对于一些新机型操作以上需求做一些步骤解析,明白其操作原理。可以通用于一…

LeetCode 26删除有序数组中的重复项

去重题&#xff0c;双指针&#xff0c;&#xff0c;因为题干说原地删除&#xff0c;且nums其余元素不重要。一个cur记录当前不重复的数应该插在第几位了&#xff0c;for循环里的i相当于是第二个指针&#xff08;右指针&#xff09;&#xff0c;遍历数组来找不重复的元素 class …