Nginx漏洞解析及复现

news2024/11/18 7:42:26

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

访问:

漏洞防御

注意配置即可。

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

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

相关文章

数据库(24)——外键约束

概念 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 具有外键的表称为子表&#xff0c;关联的表称为父表。 语法 添加外键 CREATE TABLE 表名( 字段名 数据类型, .. [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主…

升级HarmonyOS 4.2,开启健康生活篇章

夏日来临&#xff0c;华为智能手表携 HarmonyOS 4.2 版本邀您体验&#xff0c;它不仅可以作为时尚单品搭配夏日绚丽服饰&#xff0c;还能充当你的健康管家&#xff0c;从而更了解自己的身体&#xff0c;开启智能健康生活篇章。 高血糖风险评估优化&#xff0c;健康监测更精准 …

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

在 LLM 架构中应用多专家模型

本文转载自&#xff1a;在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…

Nginx源码编译安装

Nginx NginxNginx的特点Nginx的使用场景Nginx 有哪些进程root 和 alias 指定路径的区别root&#xff08;根目录&#xff09;alias&#xff08;别名目录、虚拟目录&#xff09; 使用源码编译安装Nginx准备工作安装依赖包编译安装Nginx检查、启动、重启、停止 nginx服务配置 Ngin…

【JavaEE】留言板与图书管理系统

目录 留言板1. 准备工作2. 约定前后端交互接口lombok3. 服务器代码4. 调整前端页面代码 图书管理系统1. 准备工作2. 约定前后端交互接口3. 服务器代码4. 调整前端页面代码 留言板 需求: 界⾯如下图所⽰ 输⼊留⾔信息, 点击提交. 后端把数据存储起来.⻚⾯展⽰输⼊的表⽩墙的信…

用单链表实现集合

一、实验题目 &#xff08;1&#xff09;实验题目 用单链表实现集合 &#xff08;2&#xff09;问题描述 用有序单链表实现集合的判等、交、并和差等基本运算。 二、实验内容 &#xff08;1&#xff09;采用有序单链表存储集合&#xff1b; &#xff08;2&#xff09;实现交…

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…

PVE安装虚拟主机

本文记录PVE安装其他虚拟主机的步骤&#xff0c;以安装win-server为例。裸机安装PVE则不是本文主题。 准备文件 获取Windows系统镜像 win server镜像可以从官网获取普通Windows镜像可从MSDN获取此外&#xff0c;安装Windows系统还需要从PVE下载特殊驱动 获取Windows必要驱动 …

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

【网络安全的神秘世界】web应用程序安全与风险

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 第一章&#xff1a;web应用程序安全与风险 web攻击基础知识 1、什么是web应用攻击 web攻击的本质&#xff0c;就是通过http协议篡改应用程序&#xff0…

手撸 串口交互命令行 及 AT应用层协议解析框架

在嵌入式系统开发中&#xff0c;命令行接口&#xff08;CLI&#xff09;和AT命令解析是常见的需求。CLI提供了方便的调试接口&#xff0c;而AT命令则常用于模块间的通信控制。本文将介绍如何手动实现一个串口交互的命令行及AT应用层协议解析框架&#xff0c;适用于FreeRTOS系统…

机器学习多场景实战

机器学习已不再局限于理论探讨&#xff0c;而是广泛渗透到我们生活的方方面面&#xff0c;成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品&#xff0c;到金融风控领域精准识别欺诈交易&#xff1b;每一个应用场景都是机器学习技…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

【数据结构】筛选法建堆

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Golang | Leetcode Golang题解之第134题加油站

题目&#xff1a; 题解&#xff1a; func canCompleteCircuit(gas []int, cost []int) int {for i, n : 0, len(gas); i < n; {sumOfGas, sumOfCost, cnt : 0, 0, 0for cnt < n {j : (i cnt) % nsumOfGas gas[j]sumOfCost cost[j]if sumOfCost > sumOfGas {break}…

Android 14.0 Settings主页面去掉自定义您的设备等菜单相关功能

1.前言 在14.0的系统rom产品定制化开发中,在系统Settings主页面的主菜单中,在测试某些功能的时候,比如开启护眼模式和改变系统密度会在主菜单第一项的网络菜单头部增加 自定义您的设备和设置护眼模式时间安排 等等相关的设置模块 这对于菜单布局显示相当不美观,所以根据系…

TSR,FSR,DLSS超级分辨率的原理分析

先了解一些时域抗锯齿的方法&#xff1a; TAA&#xff1a; 抖动 TAA 的主要原理是跨帧计算多个子像素样本&#xff0c;然后将它们组合成一个最终像素。最简单的方案是在像素内生成随机样本&#xff0c;但有更好的方法来生成固定序列的样本。选择一个好的序列以避免聚集非常重…

MacOS 安装C语言版TensorFlow

文章目录 安装C语言版TensorFlow解压归档环境变量c_api.hC语言示例 安装C语言版TensorFlow 官方文档&#xff1a;https://tensorflow.google.cn/install/lang_c?hlzh-cnTensorFlow 提供了一个 C API&#xff0c;该 API 可用于为其他语言构建绑定。该 API 在 c_api.h 中定义&a…

我有点想用JDK17了

大家好呀&#xff0c;我是summo&#xff0c;JDK版本升级的非常快&#xff0c;现在已经到JDK20了。JDK版本虽多&#xff0c;但应用最广泛的还得是JDK8&#xff0c;正所谓“他发任他发&#xff0c;我用Java8”。 其实我也不太想升级JDK版本&#xff0c;感觉投入高&#xff0c;收…