vlambda博客
学习文章列表

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


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


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

  • nginx下主要是空字节在rewrite的时候未处理,在内部rewrite的时候,如果response的location部分内容超过实际的长度,结尾部分就会读取到内存里面的内容



目前受影响的版本:

nginx <= v1.17.7

openresty <= v1.15.8.2


复现过程:


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

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

按照公示的案例配置Nginx/OpenResty内存泄露及目录穿越漏洞复现

接着,通过curl发起post请求

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

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

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

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


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

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


构造目录穿越访问

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


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


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

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

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


复现目录遍历

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


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

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

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


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

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

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

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

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

仍然无法复现


按照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


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




Nginx/OpenResty内存泄露及目录穿越漏洞复现
扫描二维码
关注我们吧