Nginx常见的中间件漏洞

目录

1、Nginx文件名逻辑漏洞

2、Nginx解析漏洞

3、Nginx越权读取缓存漏洞


这里需要的漏洞环境可以看:Nginx 配置错误导致的漏洞-CSDN博客

1、Nginx文件名逻辑漏洞

该漏洞利用条件有两个:

  1. Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

  2. php-fpm.conf中的security.limit_extensions为空,也就是说任意后缀名都可以解析为PHP、

首先我们移动对对应的漏洞文件目录下:

cd  /root/vulhub-master/nginx/CVE-2013-4547

拉取环境:

docker-compose up -d

然后可以访问一下

 

可以看到这里是让我们上传一个文件的操作 

然后我们分析一下这个文件名解析漏洞:

这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的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;
}

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

而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则\.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20](这里就是因为\0截断问题),就设置其为SCRIPT_FILENAME的值发送给fastcgi。

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

(1)现在我们可以新建一个txt文本文件

(2)将一句话木马写入

<?php system($_GET['var']); ?>

 

(3)修改后缀为.jpg

(4)打开BP进行抓包

(5)上传刚才的一句话木马图片

然后可以看到成功的抓到了这个上传文件的数据包

(6)修改包

首先我们在这里插入了两个aa,用于后面替换\0截断字符

然后点击Hex中来进行修改

这里相当于已经插入了\0截断字符

(7)最后点击go进行访问

(8)最后访问这个文件

访问时再次使用BP抓到数据包

使用同样的访问进行将 61 61修改为 20 00

这里因为火绒浏览器一说报错说图片显示有问题,并且其他浏览器没有代理的原因,最后的访问没有成功!一直报错400,暂时没有成功,不过这里是可以正常解析php的

总结一下这一共利用了两个点:

  1. 利用\0会截断文件名的漏洞,上传将.php文件当做.jpg文件上传
  2. 利用将security.limit_extensions = 设置为空来可以以php的方式来解析.jpg文件

2、Nginx解析漏洞

首先进入到对应的目录:

/root/vulhub-master/nginx/nginx_parsing_vulnerability

拉取漏洞环境:

docker-compose up -d

注:如果这里拉取环境报错说443端口被占用,可以使用systemctrl来关闭nginx服务解决问题 

现在分析一下这个解析漏洞

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

利用条件

#这两个条件同时满足
# php.ini
cgi.fix_pathinfo=1
# php-fpm.conf
security.limit_extensions = .php .jpg

我们现在的环境满足这两个条件,那么现在可以尝试测试一下: 

首先先准备一个test.jpg内容为:

<?php phpinfo(); ?>

当访问http://127.0.0.1/test.jpg时显示图片解析错误,当访问http://127.0.0.1/test.jpg/test.php时结果显示Access denied,这个回显很奇怪,正常访问这个链接是不存在的,正常思维应该是404,这里就需要研究下Nginx的解析流程了:

Nginx在收到/test.jpg/test.php路径时,首先判断文件类型,发现后缀是.php,便交给php处理,但php想要解析该文件时,发现并不存在,便删除掉/test.php,去找test.jpg,此时test.jpg是存在的,便要尝试解析它,但无奈后缀是.jpg,不是php,便报错Access denied。

上面的流程中提到了一个点,就是删除/test.php,这是Nginx的“修理”机制,由参数cgi.fix_pathinfo决定,当值为1时,便进行“修理”。

例如,文件名为/aa.jpg/bb.png/cc.php,如果cc.php不存在就找/aa.jpg/bb.png,如果还不存在就找aa.jpg,如果存在将它视为php文件。 到目前为止我们并没有成功利用解析漏洞,因为php代码并没有执行。为什么呢?

因为在PHP的配置中没有定义降.jpg文件中的php代码也解析为php,这是在security.limit_extensions中定义的。由于security.limit_extensions的引入,漏洞难以利用。

利用效果:  

3、Nginx越权读取缓存漏洞

 首先进入到对应的目录:

/root/vulhub-master/nginx/CVE-2017-7529

拉取漏洞环境:

docker-compose up -d

下面就分析一下这个越权读取缓存漏洞: 

Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。

如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。

如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。

content-Range:内容的范围

range是什么?

存在于HTTP请求头中,表示请求目标资源的部分内容,例如请求一个图片的前半部分,单位是byte,原则上从0开始,但今天介绍的是可以设置为负数。 range的典型应用场景例如:断点续传、分批请求资源。

缓存是什么?

大多数的Web服务器都具有缓存的功能,解释起来比较麻烦,可以看下图:

分布式缓存介绍

当请求服务器的资源时,如果在缓存服务器中存在,则直接返回,不在访问应用服务器,可以降低应用服务器的负载。 例如网站的首页的缓存,nginx的默认缓存路径在/tmp/nginx下,例如:当请求服务器的资源时,如果在缓存服务器中存在,则直接返回,不在访问应用服务器,可以降低应用服务器的负载。

1、现在我要读取刚才讲到的缓存文件头,他的Content-Length时612,那么我读取正常缓存文件的range是设置为

Range: bytes=0-612

使用curl工具测试下,命令如下,执行后发现,返回的内容是正常的。

curl -i http://127.0.0.1:8080 -r 0-612

2、接下来要读取缓存头,读取前面600个字节,也就是

range=content_length + 偏移长度
即:
range = 612 + 600
取负值为-1212

此时知道range的start是-1212,那么end呢?nginx的源码在声明start,end时用的是64位有符号整型,所以最大可表示:

-2^63-2^63-1
也就是
-9223372036854775808 到 9223372036854775807

所以只要start+end为9223372036854775807即可,故:

end = 9223372036854775808 - 1212
取负
为-9223372036854774596

3、下面我们就尝试复现一下:

(1)在浏览器访问http://192.168.159.200:8080/

(2) python3 poc.py http://127.0.0.1:8080

poc.python:

#!/usr/bin/env python
import sys
import requestsif len(sys.argv) < 2:print("%s url" % (sys.argv[0]))print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))sys.exit()headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (n, 0x8000000000000000 - n)r = requests.get(url, headers=headers)

到这里常见的几种Nginx漏洞已经复现完毕,其他Nginx漏洞详见:Vulhub - Docker-Compose file for vulnerability environment

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

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

相关文章

探索深度学习:从理论到实践的全面指南

探索深度学习&#xff1a;从理论到实践的全面指南 摘要&#xff1a; 本文旨在提供一个关于深度学习的全面指南&#xff0c;带领读者从理论基础到实践应用全方位了解这一技术。我们将介绍深度学习的历史、基本原理、常用算法和应用场景&#xff0c;并通过Python代码示例和Tens…

Vscode工具使用指南

通用 快捷键文件 / 编辑查找 / 替换窗口插件主题 连接linux 快捷键 文件 / 编辑 新建文件&#xff1a;CtrlN放大或缩小&#xff1a;Ctrl /-代码行缩进&#xff0c;展开&#xff1a;Ctrl[ 和 Ctrl]在当前行下方插入一行&#xff1a;CtrlEnter在当前行上方插入一行&#xff1a;…

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好&#xff0c;我是水滴~~ 在进行数值计算时&#xff0c;浮点数的精度问题可能会导致结果的不准确性。为了…

python subprocess

查看python官方文档&#xff1a;最全 p subprocess.Popen([rpng2bdf.exe,[r-o .\tst\myfont.bdf -f myfont -e 65 tst\*.png]],stdoutsubprocess.PIPE,stderr subprocess.PIPE) out,err p.communicate() print(out) 注意&#xff0c;如何将shell命令分解为参数序列可能并…

Java基础之异常处理

Java基础之异常处理 一、Java异常处理二、捕捉异常三、常见异常四、自定义异常4.1、throw关键字注意事项&#xff1a; 4.2、throws关键字关键点&#xff1a;注意事项&#xff1a; 4.3、throw和throws的区别&#xff1a; 一、Java异常处理 异常机制可以使程序中的异常处理代码和…

AIGC|LangChain新手入门指南,5分钟速读版!

如果你用大语言模型来构建AI应用&#xff0c;那你一定不可能绕过LangChain,LangChain是现在最热门的AI应用框架之一&#xff0c;去年年底才刚刚发布&#xff0c;它在github上已经有了4.6万颗星的点赞了&#xff0c;在github社区上&#xff0c;每天都有众多大佬&#xff0c;用它…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化&#xff0c;其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读&#xff1a; 氢储一体化&#xff1a; 氢储存&#xff1a; 指的是氢气的存…

西门子PLC与组态王无线通讯中如何设置从站

本方案主要详述了在多台西门子300PLC与组态王之间Modbus无线通讯中如何设置从站。方案中所用到的无线通讯终端是DTD434MC——欧美系PLC专用无线通讯终端。 一、方案概述 无线Modbus网络组成如下&#xff1a; 二、测试背景 ● PC端组态软件版本&#xff1a;组态王6.55 ● 默…

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字&#xff1a; raster、point、PostGIS、等值线 环境准备 Postgresql版本&#xff1a;PostgreSQL 14.0, 64-bitPostGIS版本&#xff1a;POSTGIS"3.3.2"QGIS版本&#xff1a;3.28.3-Firenze&#xff08;验证用&…

express习惯养成小程序-计算机毕设 附源码 32209

习惯养成小程序的设计与实现 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;习惯养成小程序被用户普遍使…

全程云OA SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能&#xff0c;超过100多个子模块。为企业内部提供高效、畅通的信息渠道&#xff0c;同时也能大力推动公司信息系统发展&#xff0c;提高企业的办公自动化程度和综合…

声音响度、声压级计权(A B C)实现

声压 sound pressure 声压就是大气压受到声波扰动后产生的变化&#xff0c;即为大气压强的余压&#xff0c;它相当于在大气压强上的叠加一个声波扰动引起的压强变化。由于声压的测量比较容易实现&#xff0c;通过声压的测量也可以间接求得质点速度等其它物理量&#xff0c;所以…