nginx安全总结

Nginx 入门

介绍

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器).

环境配置

ubuntu14 + nginx/1.13.3 + php5

1
2
3
apt-get install nginx # 安装nginx
service nginx start # 启动nginx服务
apt-get install php5-fpm # 安装php5-fpm

使nginx支持php的解析,

编辑/etc/nginx/sites-available/default,

1
2
3
4
5
6
7
8
9
10
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

这里nginx有两种启动方式,tcp和socket.如果使用tcp方式启动,php-fpm将会本地监听9000端口.

常用路径,

1
2
3
4
5
/usr/share/nginx/html # 默认web目录
/etc/nginx/ # 配置文件目录
/etc/php5/fpm # php配置文件目录
/var/log/nginx/access.log # 访问日志
/var/log/nginx/error.log # 错误日志

Nginx处理php流程

浏览器请求普通文件,例如html时,nginx直接把静态数据分发给浏览器;

浏览器请求php文件时,nginx会把请求交给php解释器,包括url,post数据,http头等数据.

CGI就是nginx和php解释器之间传数据的一种协议.

nginx收到/index.php请求后,启动对应的CGI程序,也就是PHP解释器,解释完后再把结果回传给nginx,最终发给浏览器.

fast-cgi是提高了CGI性能的一种协议.

php-cgi是php自带的fast-cgi管理器.

php-fpm是只能用于php的fast-cgi管理器,集成在php内核中,用来管理php-cgi进程.

目录遍历

配置别名时,如果目录结尾没有加/,并且开启autoindex的话,会造成目录遍历.

/etc/nginx/sites-available/default进行如下配置,

autoindex on;
location /admin {
    alias /web_admin/;
}

原本的目的是为了把admin目录文件单独存放,让访问/admin的请求路由到/web_admin目录下,但这会造成一个目录遍历.

http://127.0.0.1/admin../

CRLF注入

如果我想让http请求都重定向到https上,可能会这样配置,

1
2
3
location / {
return 302 https://$host$uri;
}

这样,当我们请求时http://192.168.1.119/fake就会跳转到https://192.168.1.119/fake,

服务器会根据传入的URL来设置响应头中的Location字段,但问题是,Nginx会先将$uri解码,所以我们可以通过注入CR-LF来任意控制响应包,最终造成会话固定,XSS等

1
/fake%0d%0aSet-Cookie:%20user=1

headder覆盖

Nginx的配置文件块Server、Location、If之间存在包含关系,如果父块中添加了HTTP头,子块中又添加了HTTP头,那么父块中的add_header不会被继承,造成安全隐患.

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options DENY;
location / {
try_files $uri $uri/ =404;
}
location /test {
add_header X-Content-Type-Options nosniff;
try_files $uri $uri/ =404;
}
}

在Server下设置了CSP防御XSS,而location节点下又有add_header,那么server的add_header不会被继承.

根目录下有CSP,

test目录下没有CSP,

解析漏洞

Nginx下,请求文件/shell.gif时在后面加个*.php,即/shell.gif/1.php,可能会被当作PHP代码执行.

这个问题不是Nginx的漏洞,而是由于两处配置造成的.

首先,需要/etc/php5/fpm/php.ini中cgi.fix_pathinfo的值为1(默认),

1
2
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1

其次,还需要/etc/php5/fpm/pool.d/www.conf中security.limit_extensions允许解析其他格式文件为PHP,(默认只有.php,也就是说默认不会有这个解析漏洞)

1
2
; Default Value: .php
;security.limit_extensions = .php .php3 .php4 .php5

这个参数用于设置FPM允许解析的文件的后缀,在默认值情况下,是不会有解析漏洞的,因为文件名不是”.php”后缀,所以会被禁止执行.

如果把limit_extensions设为空,

1
security.limit_extensions =

然后重启fpm,killall php5-fpm

加固

  1. 防止解析漏洞

    cgi.fix_pathinfo设为0

  2. 正确配置别名,防止目录遍历

    1
    2
    3
    4
    autoindex off;
    location /admin/ {
    alias /web_admin/;
    }
  3. 防止CRLF注入

    1
    2
    3
    location / {
    return 302 https://$host$request_uri;
    }
  4. 禁止某些目录执行脚本

    1
    2
    3
    location ~ /(images|upload)/.*\.ph(p|p3|ph4|p5|t|tml)$ {
    deny all;
    }
  5. 隐藏显示版本信息

    nginx.conf:

    1
    server_tokens off;
  6. 限制访问IP

    1
    2
    3
    4
    5
    location/ {
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    deny all;
    }
  7. 禁止访问敏感文件

    1
    2
    3
    4
    location ~* \.(bak|save|sql|swp|svn|git|php~)$ {
    root /usr/local/nginx/html;
    deny all;
    }s

总结

虽然有些问题没有太大的实际利用价值,但却揭露了发现这一类”由于配置错误”而引发的安全漏洞的挖掘思路:仔细阅读官方文档.

例如,CRLF注入问题,在Nginx文档中对$uri有这样的描述:

对于normalized,是这样定义的,

明确的指出了会进行URL解码,因此才会有CRLF注入的问题.

也有人写了一款Nginx配置文件检测工具:https://github.com/yandex/gixy,专门用来发现配置错误.

Refer:

http://nginx.org/en/docs/

http://www.laruence.com/2010/05/20/1495.html

http://www.nowamagic.net/librarys/veda/detail/1319/

https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html

https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html

https://github.com/phith0n/vulhub/tree/master/nginx/insecure-configuration