Nginx配置不当
0x00 前言
这段时间做了好几道Nginx
配置不当的题目,集中学习一下这方面的知识。
0x01 基础
Nginx
的主配置文件为nginx.conf
,在任何情况下Nginx
都会加载该文件。nginx.conf
文件结构分明,由多个模块构成,如下:
用代码表示如下:
1 | ... #全局块 -->main |
解析
Nginx
层级分明,每个层级都有自己的指令。子块会继承父块的配置,如果二者配置的指令不同,则子块会覆盖父块的配置。指令格式如下:
1 | 指令名 参数1 参数2 参数3; |
在nginx.conf
还可以引入其他的配置文件,如include /etc/nginx/mime.types;
就包含了各种支持的Content-type。另外,开发者不可能把服务都写在nginx.conf
里,对应的.conf
文件也会被包含。
一个server块表示一个host,可以在server
块中添加或者更改nginx
服务监听的端口、存放网页文件的位置、以及虚拟主机配置(开反向代理)。
一个location块代表一个路由映射规则。
0x02 alias配置不当 · 目录穿越
条件其一
在nginx.conf
文件的server块中加入:autoindex on;
,可以添加目录浏览功能,但是也会产生安全问题,如本节的alias
配置不当引起的一系列漏洞。具体配置如下:
1 | server { |
在该代码块的基础上会导致目录遍历,可以访问设置的根目录下的文件。
条件其二
在nginx做反向代理的时候,我们通常会把动态部分传递给后方解析的服务器,由nginx来处理静态文件
当使用alias来对文件路径进行配置时,有可能会造成目录穿越漏洞
正常配置
1 | location /files/ { |
正常访问http://your_ip/files/pax.txt
,便会读取/etc/nginx/txtpath/pax.txt
文件。
配置不当
1 | ocation /files { |
/files/变成了/files,第二个斜杠没有了,那么攻击者就可以读取正常文件夹之外的文件。
当访问http://your_ip/files../pax.txt
,便会读取/etc/nginx/pax.txt
文件。
同时满足
条件一允许我们读取该目录下的所有目录及文件;条件二允许我们返回到上级目录。若同时满足这两个条件,我们便可以读取该目录的上级目录下的所有目录和文件。
当alias
指定的目录足够上层(到根目录的下级目录),我们就可以穿梭到根目录。
对应题目:CTFHub->历年真题->web->afr-2
0x03 反代配置不当 · SSRF
Nginx经常拿来做反向代理服务器。反向代理服务器其实就是一台负责转发的代理服务器,实现了转发的作用,然后从真正的服务器获取数据并转发给客户端。
正常配置
1 | server { |
配置不当
1 | location /([a-zA-Z0-9.:%]+) { |
分析
$1:正则匹配的第一个括号的内容。
如果访问的url
是服务端的内网,因为$1
等于url
,所以Nginx
会代理到服务端的内网,实现SSRF
。
防御思路
- 输入验证:确保只允许合法的外部地址。
- 白名单:限制可访问的
IP
地址。 - 监控日志:及时发现异常请求。
0x04 重定向配置不当 · CRLF
当一个网站使用https协议的时候,很多站点会强制用户使用https进行访问。当用户访问http的时候会
302
跳转到https页面。
配置不当:
1 | location /302 { |
Nginx
中 ,$uri
指的是请求的文件和路径,不包含后面请求的数据(即?和#后面的数据),Nginx
服务器会对$uri
进行解码。当$uri
后面添加%0d%0a
,便可以污染HTTP
头的数据。
比如,访问http://your_ip/302/pax.php
会302跳转到https://your_ip/302/pax.php
,这是正常的302跳转。但是如果访问http://your_ip/302/pax.php%0d%0a%0d%0aman=1
,302跳转会指向https://your_ip/302/pax.php
并且POST一个参数 man=1
,比如下图例子:
如此便达成了CRLF
。
0x05 子块覆盖父块不当
在nginx配置文件中子块是可以继承父块的配置的。但是当我们在父块中设置了
add_header
头,然后再在子块中设置另一个add_header头时,子块会覆盖掉父块中的add_header头的设置。
假如配置如下:
1 | server { |
须知:
add_header
是Nginx
配置指令,用于向 HTTP 响应中添加自定义 HTTP 头部。X-Frame-Options DENY
和Content-Security-Policy "default-src 'self'"
用来抵御一般的XSS攻击。X-Content-Type-Options
是一个 HTTP 响应头,用于防止浏览器对内容类型进行嗅探。其常见的值是nosniff
如果访问http://your_ip/safe
,采用父块的add_header
,不会触发XSS
。
但是如果访问http://your_ip/dangerous
,子块的add_header
覆盖了父块的add_header
,对xss
的防御不再生效,成功触发xss
。