AqYoung

分享渗透知识与技巧

0%

中间件漏洞之Nginx

中间件nginx常见漏洞记录

Nginx简介

Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器

由于Nginx免费开源,并且在稳定性方面做得比较好,所以目前大部分Web服务器使用Nginx,所以我就把Nginx常见的漏洞再做一次复现与整理。


Nginx常见漏洞:

Nginx 配置错误导致漏洞:

影响版本:与版本无关只和配置有关。

解析漏洞

漏洞配置:配置nginx下的*.conf

server {
    location ~ \.php$ {
        root           /work/www/test;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass   unix:/tmp/php-fpm.sock;
    }
}


1、当我们输入test.png/xx.php 的时候nginx看到.php结尾的话会传给php fastcgi处理 -->
2、php根据url映射寻找xx.php,发现不存在 -->
3、由于cgi.fix_pathinfo是开启的,所以php会继续在路径中寻找文件,之后找到test.png以php形式来处理,至于/xx.php会被存储到PATH_INFO后丢弃。

1.上传一个名为1.png的图片,图片中带有phpinfo(),可以看到response返回了图片地址。

2.访问图片地址,加上/xx.php

CRLF注入

查看nginx的文档,表示uri的有三个参数。

其中$uri和$document_uri表示URL解码后的请求路径;$request_uri不解码。

于是当传入%0a%0d的时候nginx会将$url和$document_uri进行解码,引入换行符,造成CRLF注入漏洞

错误配置:(nginx.conf)

server {
        location / {
        return 302 https://$host$uri;    #原本目的:让http请求跳转到https上。
    }
}

利用过程:

1.设置:burp拦截response包,当request被拦截的时候,也拦截response。

2.访问payload

#payload:
http://192.168.11.11:8080/%0aX-XSS-Protection:%200%0a%0d%0a%0d%3Cimg%20src=1%20onerror=alert(/xss/)%3E

2.1 修改response包的Location端口号<80

成功弹出xss:

2.2 使用CSP禁止iframe的跳转

具体参考:P牛的文章。

目录穿越

错误配置:

#在给nginx配置别名的时候/files映射到了/home/,那么如果在files加上../就相当于:/home/../于是就到了上一层目录
location /files {
        alias /home/;
    }

利用过程:

修复方案:

location /files/ {
        alias /home/;
    }

add_header被覆盖

错误配置:

# 在添加add_header的时候覆盖了父块HTTP头
add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options DENY;

location = /test1 {
            rewrite ^(.*)$ /xss.html break;
    }

location = /test2 {
    add_header X-Content-Type-Options nosniff;
    rewrite ^(.*)$ /xss.html break;
}

利用过程:

test1使用默认头

test2添加X-Content-Type-Options头,导致add_header失效


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

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

漏洞配置:

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;
}

由于空格的原因,让nginx错误的解析文件名,传递给fastcgi解析成php。是一个URI解析错误和错误获取文件名导致的漏洞

复现过程:

上传一个带有文件名带有空格的phpinfo.jpg

上传成功,返回地址

更改文件名

把..改为20 00成功解析phpinfo

越界读取缓存漏洞(CVE-2017-7529)

影响版本:Nginx 0.5.6 - 1.13.2

POC:CVE-2017-7529

结果读取到缓存头文件,HTTP返回包等信息

参考:(更多具体参考)

https://paper.seebug.org/353/

空字节任意代码执行漏洞

影响版本:nginx <=0.8.37

在Fast-CGI关闭的状态下,文件路径 /xxx.jpg%00.php 会解析成PHP文件

尾巴:

在复现nginx的过程中,不光光是复现这个漏洞这么简单,在复现的时候搭建环境的过程中,也更加对nginx一些配置有更深入的了解,整体来说这段时间收获还是蛮多的。(加油!)


声明:

  • 笔者初衷用于分享与交流网络知识,若读者因此作出任何危害网络安全行为后果自负,与作者无关!

  • 本文属于@ayoung博客,未经许可禁止转载: