前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx/OpenResty内存泄露及目录穿越漏洞复现

Nginx/OpenResty内存泄露及目录穿越漏洞复现

作者头像
李俊鹏
发布2020-06-15 16:29:11
9.1K0
发布2020-06-15 16:29:11
举报
文章被收录于专栏:运维研习社

最近HackerOne公布的Nginx内存内容泄露问题以及目录穿越漏洞,复现看下具体情况

按照公布的消息,这次的漏洞主要是存在于两种情况下

  • nginx下主要是空字节在rewrite的时候未处理,在内部rewrite的时候,如果response的location部分内容超过实际的长度,结尾部分就会读取到内存里面的内容
  • openresty下面是在rewrite的时候,使用set_uri进行重写处理的时候,没有处理空字节,导致内存内容泄露,以及在rewrite的时候,如果rewrite目标地址,用变量获取的方式,会导致目录遍历

目前受影响的版本:

nginx <= v1.17.7

openresty <= v1.15.8.2

复现过程:

先来看下openresty,这里安装了1.15.8.2的版本,并且开启了lua模块

按照公示的案例配置

接着,通过curl发起post请求

response中的Location部分的结尾部分就是返回的内存中的部分内容,接着把post参数的数据增加,看下效果

可以获取到的内存内容部分增加

接着看下openresty目录遍历的情况

构造目录穿越访问

对于nginx中,按照公布的消息称nginx小于1.17.7的版本,都有内存内容泄露的漏洞,但是我在本地测试的过程中,测试了nginx1.16.1、nginx1.8.0,都没有复现,测试过程如下:

配置nginx的rewrite,重写为带有空字节的地址

接着通过curl请求,查看结果

复现目录遍历

在nginx中只复现成功目录遍历漏洞,内存内容泄露没有复现成功

按照nginx的rewrite规则,regex部分为正则,匹配之后按照replacement字符串中的指定进行重写,后面可以跟flag,包括last、break、redirect、permanent

如上面测试,根据debug日志查看如下

是将replacement部分匹配到之后,在root目录下查找对应文件,不存在,返回404,按照Hackerone中披露的细节看,是在301/302中Location中存在内存内容泄露,按照nginx的rewrite配置,在redirect或permanent下面才会进行跳转,所以设置之后,再进行测试如下

仍然无法复现

按照rewrite规则来看,当replacement是字符串时,会被当做目录来解析,所以会拼接完整的文件路径,所以这也是为什么目录穿越可以执行,但是内存泄露无法复现的原因

上面两个漏洞被定位低危和中危漏洞,主要是这种配置方式是比较少见的,检查下配置即可,如果有条件的话,建议更新到最新版本

不得不说,空字节导致的漏洞在nginx不是第一次出现了,在之前就出现过%00空字节导致非php文件中嵌入php代码,通过访问url+%00.php的方式执行php代码,所以,在开发过程中空字节的过滤是必须要考虑的,必要的时候可以在waf中进行过滤

openresty3月20号已经发布了1.15.8.3版本,修复了这个漏洞,nginx可以更新到1.17.8以上版本

如果有大佬复现了nginx下内容内存泄露漏洞,不吝赐教

harkerone细节:https://hackerone.com/reports/513236

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档