Nginx配置不当可能导致的安全问题
Nginx配置不当可能导致的安全问题
Auther: Spark1e
目前很多网站使用了nginx或者tenginx(淘宝基于Nginx研发的web服务器)来做反向代理和静态服务器,ningx的配置文件nginx.conf的一些错误配置可能引发一些安全问题。要了解这些问题,我们先简单了解一下Nginx的配置文件
0x00 Nginx的配置文件的格式
Nginx的主配置文件非常简短,是由一些模块构成的。在任何情况下Nginx都会加载其主配置文件。
一个主配置文件nginx.conf的结构如下:
... #全局块 -->main
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN] #另一个location块
{
...
}
}
}
Nginx是分层级组织的,每个层级可以有自己的指令,并且子块会继承父块的配置,但是如果子块配置了与父块不同的指令,则会覆盖掉父块的配置。指令的格式是:指令名 参数1 参数2 参数3;
也可以在配置文件中包含其他配置文件。如include /etc/nginx/mime.types;
就包含了各种支持的Content-type.
一个server块表示一个host,可以在server块中添加或者更改nginx服务监听的端口、存放网页文件的位置、以及虚拟主机配置(开反向代理)
一个location块代表一个路由映射规则
0x01 反向代理配置不当导致的ssrf漏洞
Nginx经常拿来做反向代理服务器。反向代理服务器其实就是一台负责转发的代理服务器,实现了转发的作用,然后从真正的服务器获取数据并转发给客户端。
比如,我们让nginx监听一个端口(假设我们监听了80端口),然后我们通过配置反向代理转发给另一个应用端口或者服务器,由它来执行真正的请求。请求处理完成后数据会交给nginx,然后由nginx来返回给客户端。假如我们要将本机的80端口转发给192.168.1.2
上的8080端口时,我们可以这样配置:
server {
listen 80;
server_name 192.168.1.2:8080;
location / {
proxy_pass http://192.168.1.2:8080;
}
#......
}
SSRF漏洞通常出现在不正确的反向代理配置中
如果nginx.conf进行了如下配置
location /([a-zA-Z0-9.:%]+) {
proxy_pass http://$1;
}
此时url是可控的。如果攻击者修改url, 将其修改成内网IP即可导致SSRF漏洞
0x02 alias导致的目录遍历/目录穿越/部分文件下载漏洞
修改nginx.conf文件,在server块加入autoindex on;
可以添加目录浏览功能,但是也会导致安全问题
server {
autoindex on;
...
}
即可达成目录遍历
在nginx做反向代理的时候,我们通常会把动态部分传递给后方解析的服务器,由nginx来处理静态文件
当使用alias来对文件路径进行配置时,有可能会造成目录穿越漏洞
假设配置文件中的配置如下:
location /files/ {
alias /etc/nginx/txtpath/;
}
正常用户访问http://your_ip/files/1.txt
时,就可以读取/etc/nginx/txtpath/1.txt
这个文件
但是如果配置错误,files后面没有/
,如下
location /files {
alias /etc/nginx/txtpath/;
}
那么攻击者有可能读到目标文件夹之外的文件。
但是因为在/files
后面没有/
,当我们访问http://your_ip/files../nginx.conf
,会返回/etc/nginx/nginx.conf
导致我们可以通过对目录进行爆破扫描等方法,获取到指定文件夹之外的文件
当我们能同时达成以上两个漏洞的条件时,我们就能够读取到部分文件。
当alias
指定的文件目录足够上层(例如在/home,/usr等)时,我们就可以穿梭到根目录,读取到所有文件。因为配置错误而导致了任意文件读取漏洞
0x03 uri导致的CRLF注入漏洞
当一个网站使用https协议的时候,很多站点会强制用户使用https进行访问。当用户访问http的时候会302
跳转到https页面。
如果使用了 \$uri来进行配置,可能会导致CRLF注入漏洞
location /302 {
return 302 https://$host$uri;
}
nginx中 \$uri指的是请求的文件和路径,不会包含后面请求的数据(即?和#后面的数据)
nginx服务器会对$uri进行解码。当我们在传入的参数后面加入urlencode之后的换行符%0d%0a
,我们就可以污染HTTP头的数据
例如,访问http://your_ip/302/123
会302跳转到https://your_ip/302/123
。这是正常的跳转。
但是由于配置文件里面使用的是$uri,会对我们传入的参数进行转码,当我们访问http://your_ip/302/123%0d%0a%0d%0atest=1
时,302跳转会指向https://your_ip/302/123
并且POST一个参数 test=1
导致了CSRF注入漏洞
0x04 子块覆盖父块HTTP头
在nginx配置文件中子块是可以继承父块的配置的。但是当我们在父块中设置了add_header
头,然后再在子块中设置另一个add_header头时,子块会覆盖掉父块中的add_header头的设置。
假如配置文件是这么设置的
server {
...
add_header X-Frame-Options DENY;
add_header Content-Security-Policy "default-src 'self'";
location = /safe {
return /xss.html;
}
location = /dangerous {
add_header X-Content-Type-Options nosniff;
return /xss.html;
}
}
其中X-Frame-Options DENY
和Content-Security-Policy "default-src 'self'"
是用来抵御一般的XSS攻击的。
当我们访问http://your_ip/safe
时,因为我们设置了这两个文件头,所以并不会触发xss。
但是当我们访问http://your_ip/dangerous
时,因为我们在子模块添加了add_header X-Content-Type-Options nosniff
,父级的模块add_header
的被子级的覆盖了,导致对xss的防御不再生效,成功触发xss。
Reference
https://iprog-programmer.chinaobd2.com/
https://www.chinaobd2.com/wholesale/iprog-programmer-5412.html
Nginx配置不当可能导致的安全问题的更多相关文章
- nginx配置不当容易产生的安全问题
nginx一般用于做外网代理,配置也比较方便,但是配置不当的时候会产生一些安全问题.其中包括各个大厂也都出现过. intra server -> proxy -> nginx 一般正常的 ...
- 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...
- Redis配置不当可导致服务器被控制,已有多个网站受到影响 #通用程序安全预警#
文章出自:http://news.wooyun.org/6e6c384f2f613661377257644b346c6f75446f4c77413d3d 符合预警中“Redis服务配置不当”条件的服务 ...
- nginx配置不当导致的目录遍历下载漏洞-“百度杯”CTF比赛 2017 二月场
题目:http://98fe42cede6c4f1c9ec3f55c0f542d06b680d580b5bf41d4.game.ichunqiu.com/login.php 题目内容: 网站要上线了, ...
- nginx 配置不当导致目录遍历下载漏洞
今天做百度杯的时候发现一个题很有意思. 点进题目,发现了一个js重定向到login.php,抓包发现请求的header中cookie=0,做过这种类似的题目,o==false,在请求头里面将cooki ...
- Nginx配置不当(CRLF注入 、目录穿越)
基于vulhub漏洞环境 环境搭建参考:https://blog.csdn.net/qq_36374896/article/details/84102101 1.漏洞名称 CRLF注入 2.漏洞原理 ...
- redis配置不当可导致服务器被控制
服务器配置不当包括三个部分:1.Redis服务使用ROOT账号启动2.Redis服务无密码认证或者使用的是弱口令进行认证3.服务器开放了SSH服务,而且允许使用密钥登录 简单的写下过程 测试环境vic ...
- nginx配置不当引起的错误
1.CRLF注入 1.1环境配置 apt install nginx vi /etc/nginx/sites-available/default location / { return 302 htt ...
- 新手学分布式-动态修改Nginx配置的一些想法
本人是分布式的新手,在实际工作中遇到了需要动态修改nginx的需求,因此写下实现过程中的想法.Nginx功能强大且灵活,所以这些权当抛砖引玉,希望可以得到大家的讨论和指点.(具体代码在 https:/ ...
随机推荐
- 20165328 实验四《Andriid应用开发》实验报告
一.实验一:Andriod Stuidio的安装测试: 实验要求: 参考 ...
- Postman 安装及使用入门教程(我主要使用接口测试)
1.Postman 安装及使用入门教程(我主要使用接口测试)Postman的English官网:https://www.getpostman.com/chrome插件整理的Postman中文使用教程( ...
- Sqlserver 锁(转)
转载 http://www.cnblogs.com/zhouqianhua/archive/2011/04/15/2017049.html 总结: 锁的种类: 共享锁\排它锁\更新锁\意向锁\计 ...
- Ubuntu16.04 安装NVIDIA显卡驱动
1. 禁用系统默认的集成驱动 Ubuntu系统集成的显卡驱动程序是nouveau,它是第三方为NVIDIA开发的开源驱动,我们需要先将其屏蔽才能安装NVIDIA官方驱动.将驱动添加到黑名单blackl ...
- EF执行SQL返回动态类型
using System; using System.Data.Common; using System.Data.Entity.Core.Objects; using System.Data.Ent ...
- NEERC-2017
A. Archery Tournament 用线段树套set维护横坐标区间内的所有圆,查询时在$O(\log n)$个set中二分查找即可. 时间复杂度$O(n\log^2n)$. #include& ...
- Jmeter学习系列----3 配置元件之计数器
在做测试时,会遇到一种需求:在大量数据的情况下,数据不能重复或者需要自增,基于这种形式,我们可以考虑使用计数器. 计数器(counter): 计数器配置允许用户配置起始点,最大值和增量. 计数器将从开 ...
- __x__(6)0905第二天__标签属性=“值”
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- __x__(37)0909第五天__背景图按钮
link,hover,active三种按键状态,存放三张图片 缺点: 资源只有在被使用时,才会被加载. 页面第一次加载时,会出现短暂的延迟闪烁,造成一次不佳的用户体验. 图片整合技术 CSS-Spri ...
- 2018-2019-1 20189210 《LInux内核原理与分析》第九周作业
进程的切换和系统的一般执行过程 (1)进程调度的时机 1.schedule是一个内核函数,不是一个系统调用,进程的调度只发生在内核中,进程调度函数schedule()只能在内核中被调用,用户进程无法调 ...