Nginx 配置错误导致的漏洞

目录

1. CRLF注入漏洞

 Bottle HTTP头注入漏洞

2.目录穿越漏洞

3. http add_header被覆盖


本篇要复现的漏洞实验有一个网站直接为我们提供了Docker的环境,我们只需要下载下来就可以使用:

Docker环境的安装可以参考:Docker安装

漏洞环境的搭建具体步骤如下:
(1)首先我们需要下载环境的源码:

https://github.com/vulhub/vulhub/archive/master.zip

(2)将下载的源码上传到centos环境中

(3)然后进入/root/vulhub-master/nginx目录中,这就是该文件为我们提供的有关nginx的一些漏洞环境

(4)然后我们就可以移动到对应的环境中使用一下命令来拉取环境

docker compose up -d

然后就可以正常使用了 

1. CRLF注入漏洞

CRLF注入漏洞,也叫做HTTP头部注入漏洞

在HTTP头部每一行的结尾都会有一个 \r \n

下面两种情景十分常见:

用户访问http://example.com/aabbcc,自动跳转到https://example.com/aabbcc (自动将http->https)

用户访问http://example.com/aabbcc,自动跳转到http://www.example.com/aabbcc(自动增加一级域名)

第二个场景主要是为了统一用户访问的域名,更加有益于SEO优化。

在跳转的过程中,我们需要保证用户访问的页面不变,所以需要从Nginx获取用户请求的文件路径。

查看Nginx文档,可以发现有三个表示uri的变量:

$uri

$document_uri

$request_uri

1和2表示的是解码以后的请求路径,不带参数;3表示的是完整的URI(没有解码)。

错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

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

#因为$uri是解码以后的请求路径,所以就会包含换行符,就有可能造成CRLF漏洞 这个CRLF注入漏洞,导致固定漏洞、设置cookie引发的csrf漏洞或者xss漏洞,其中,我们可以注入两个\r \n即可控制HTTP体进行xss,但是因为浏览器会认为这是一个300跳转,所以并不会显示我们注入的内容

Payload: http://your-ip:8080/%0d%0aSet-Cookie:%20a=1,可注入Set-Cookie头。

这种情况下,我们可以使用一些技巧:比如使用CSP头来ifame的地址,这样浏览器并不会跳转,进而执行我们插入的HTML

下面我简单的使用这个漏洞环境中的/root/vulhub-master/nginx/insecure-configuration环境来演示一下CRLF漏洞

(1)首先我们移动到对应的环境下

(2)使用docker compose up -d来拉取环境

[root@centos111 insecure-configuration]# docker compose up -d
[+] Running 1/1✔ Container insecure-configuration-nginx-1  Started 

注:拉取环境的前提是我们安装了Docker

(3)可以使用dokcer ps 来查看一下容器是否运行:

可以看到正常的运行了 

(4)现在可以做一个简单的测试,在shell中使用curl来尝试在头部增加一个%0d%0d,也就是\r\n,然后插入一条语句

curl -I http://127.0.0.1:8080/%0d%0aSet-cookie:%20a=1
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.13.0
Date: Fri, 24 Nov 2023 01:25:36 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://127.0.0.1:8080/
Set-cookie: a=1

可以看到我们利用%0d%0a成功的在头部增加了一行Set-cookie:a=1 

(5)那么我们现在就可以使用Burpsuite来抓一个这个网页的包,尝试使用CRLF注入

在本机上打开BP软件,开启代理,然后打开本机的代理

我们可以构造一个反弹性xss的脚本插入到头部中:

<script>alert(1)</script> 

可以看到我们成功的利用%0d%0a在头部插入了script弹窗代码,使用两个%0d%0a的原因是因为第一个是让我们来到新的一行,第二个换行是为了与头部分割一行,否则就无法正常插入

下面用这样一个案例来举例Python中的一个CRLF漏洞

 Bottle HTTP头注入漏洞

这时我们要运行的bottle_demo.py代码

import bottle
from bottle import route,run, template,request,response
@route('/')
def index():path = request.query.set('path','http://www.xianoupeng.com')return bottle.redirect(path)if __name__ == '__main__':bottle.debug(True)run(host='localhost', port=8081)

 因为redirect函数是向response中插入一个HTTP头,也就是Location: xxx,所以存在头注入。

(1)我们运行这个python脚本,然后尝试使用\r\n的方式进行弹窗

 但实际测试的过程中遇到了一个有趣的问题,看看redirect函数的实现:

def redirect(url, code=None):""" Aborts execution and causes a 303 or 302 redirect, depending onthe HTTP protocol version. """if not code:code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302res = response.copy(cls=HTTPResponse)res.status = coderes.body = ""res.set_header('Location', urljoin(request.url, url))raise res</pre>

其中使用了一个urljoin,将当前url和我传入的path进行了一次"join",经过这个操作事情就变得很微妙了:Location头一定有一个值。这种情况下,浏览器就不会渲染页面,会直接跳转到Location头指向的地址。也就是说,如果我要利用CRLF构造XSS的话,这里是不会触发的。

回想上面提到过的新浪的那个CRLF,那个漏洞的Location是可以为空的,如果浏览器发现Location为空就不会进行跳转,进而渲染了后面注入的HTML,造成XSS。

(2)可以使用一下两种方式来解决这个问题

方法1:将跳转的url端口设为<80

http://localhost:8081/?path=www.oupeng.com:0%0d%0aX-XSS-Protection:0%0d%0a%0d%0a%3Cscript%3Ealert(location.href)%3C/script%3E

python中确实收到了请求 

但是页面还是告诉我们无法访问 

注:这种方法在现在的浏览器中无法正常实现,如果需要复现,需要降低浏览器的版本

方法2:使用CSP禁止iframe的跳转

可以在运行Python脚本的前提下去在本地新建一个web.php代码,通过访问php文件使用iframe将httpL//localhost:8081页面嵌入,从而实现弹窗。

php代码:

<?php
header("Content-Security-Policy: frame-src http://localhost:8081/"); //这里设置了CSP
?>
<iframe src="http://localhost:8081/?path=http://www.baidu.com/%0a%0dX-XSS-Protection:0%0a%0d%0a%0d<script>alert(location.href)</script>"></iframe>

 通过尝试发现Firefox可以弹窗,但是Chrome不能。

如果python代码是这样的则上面的两种方式均可以实现

import bottle
from bottle import route,run, template,request,response@route('/')
def index():server = bottle.request.query.get('server')  # 接收Server参数bottle.response.add_header('Server', server)return bottle.responseif __name__ == '__main__':bottle.debug(True)bottle.run(host='localhost', port=8081)

总结一下,安全的做法应该为:

不安全:
location / {return 302 https://$host$uri; 
}
安全
location / {return 302 https://$host$request_uri;  //Request不会对%0d%0a解码,所以无法换行
}

2.目录穿越漏洞

这个常见于nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态的文件需要nginx来处理。

假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名:

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。

错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

location /files { #这里没有 /alias /home/; #因为真正的文件在/home下,所以这里设置了别名/home/
}

此时我们的dokcer环境中的文件配置就是这样的:

server {listen 8081;root /usr/share/nginx/html;index index.html;server_name _;autoindex on;location /files {alias /home/;}
}

此时访问192.168.159.200:8081,就可以获取到/files/help.txt文件

 但是我们注意到,url上/files没有加后缀/ ,而alias设置的/home/是有后缀/ 的,这个 / 就导致我们可以从 /home/ 目录穿越到它的上层目录:

Payload: http://your-ip:8081/files../ 

此时我们就可以看到我们可以移动到/目录下,这时就会出现任意文件下载的危险漏洞

解决方案:必须保证location和alias的值都有后缀/ 或者都没有这个后缀

我们修改配置文件为:

server {listen 8081;root /usr/share/nginx/html;index index.html;server_name _;autoindex on;location /files/ {alias /home/;}
}

重启docker:

docker restart 你的镜像编号

 然后再次尝试路径穿越访问:

可以看到已经无法完成路径穿越了。

3. http add_header被覆盖

CSP:(Content-Security-Policy) 可以防御xss注入

Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。

如下列代码,整站(父块中)添加了CSP头:

server{
add_header Content-Security-Policy "default-src 'self'"; #default-src用来设置上面各个选项的默认值。
#上面代码限制所有的外部资源,都只能从当前域名加载。
​
add_header X-Frame-Options DENY;
//这里会覆盖父类的CSP,CSP就失效了
location = /test1 {rewrite ^(.*)$ /xss.html break;
}
​
​
location = /test2 {add_header X-Content-Type-Options nosniff;rewrite ^(.*)$ /xss.html break;
}
#这里的location会将前面的location覆盖
}

/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效,

所以XSS可以被触发:

可以看到我输入的js代码中的标签被浏览器转义,这里并没有成功,那么可以尝试在低版本的浏览器中测试一下:

可以看到,在低版本中我们是可以利用这个错误配置正常弹窗的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

展现天津援疆工作成果 “团结村里看振兴”媒体采风团走进和田

央广网天津11月19日消息(记者周思杨)11月18日&#xff0c;由媒体记者、书法和摄影家、旅行社企业代表等40余人组成的“团结村里看振兴”媒体采风团走进新疆和田。在接下来的一周时间里&#xff0c;采风团将走访天津援疆和田地区策勒县、于田县、民丰县乡村振兴示范村&#xff0…

HTML CSS登录网页设计

一、效果图: 二、HTML代码: <!DOCTYPE html> <!-- 定义HTML5文档 --> <html lang="en"> …

在全球碳市场中崭露头角的中碳CCNG

在全球气候治理的大背景下&#xff0c;中国碳中和发展集团有限公司&#xff08;简称中国碳中和&#xff09;正在成为全球碳交易市场的一个重要参与者。随着国际社会对碳排放的日益关注&#xff0c;中国碳中和凭借其在碳资产开发、咨询与管理等领域的深厚积累&#xff0c;正成为…

视频剪辑新招:批量随机分割,分享精彩瞬间

随着社交媒体的普及&#xff0c;短视频已经成为分享生活、交流信息的重要方式。为制作出吸引的短视频&#xff0c;许多创作者都投入了大量的时间和精力进行剪辑。然而&#xff0c;对于一些没有剪辑经验的新手来说&#xff0c;这个过程可能会非常繁琐。现在一起来看云炫AI智剪批…

杨传辉:从一体化架构,到一体化产品,为关键业务负载打造一体化数据库

在刚刚结束的年度发布会上&#xff0c;OceanBase正式推出一体化数据库的首个长期支持版本 4.2.1 LTS&#xff0c;这是面向 OLTP 核心场景的全功能里程碑版本&#xff0c;相比上一个 3.2.4 LTS 版本&#xff0c;新版本能力全面提升&#xff0c;适应场景更加丰富&#xff0c;有更…

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

CentOS7安装Docker运行环境

1 引言 Docker 是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助 Docker&#xff0c;您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付&#xff0c;…

在新疆乌鲁木齐的汽车托运

在新疆乌鲁木齐要托运的宝! 看过来了 找汽车托运公司了 连夜吐血给你们整理了攻略!! ⬇️以下&#xff1a; 1 网上搜索 可以在搜索引擎或专业的货运平台上搜索相关的汽车托运公司信息。在网站上可以了解到公司的服务范围、托运价格、运输时效等信息&#xff0c;也可以参考其他车…

2024年的云趋势:云计算的前景如何?

本文讨论了2024年云计算的发展趋势。 适应复杂的生态系统、提供实时功能、优先考虑安全性和确保可持续性的需求正在引领云计算之船。多样化的工作负载允许探索通用的公共云基础设施范例之外的选项。由于需要降低成本、提高灵活性和降低风险&#xff0c;混合云和多云系统越来越受…

RabbitMQ 消息队列编程

安装与配置 安装 RabbitMQ 读者可以在 RabbitMQ 官方文档中找到完整的安装教程&#xff1a;Downloading and Installing RabbitMQ — RabbitMQ 本文使用 Docker 的方式部署。 RabbitMQ 社区镜像列表&#xff1a;https://hub.docker.com/_/rabbitmq 创建目录用于映射存储卷…

YOLOv5 分类模型 预处理 OpenCV实现

YOLOv5 分类模型 预处理 OpenCV实现 flyfish YOLOv5 分类模型 预处理 PIL 实现 YOLOv5 分类模型 OpenCV和PIL两者实现预处理的差异 YOLOv5 分类模型 数据集加载 1 样本处理 YOLOv5 分类模型 数据集加载 2 切片处理 YOLOv5 分类模型 数据集加载 3 自定义类别 YOLOv5 分类模型…

关于python 语音转字幕,字幕转语音大杂烩

文字转语音 Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)_python_脚本之家 代码示例 from gtts import gTTStts gTTS(你好你在哪儿&#xff01;,langzh-CN)tts.save(hello.mp3)import pyttsx3engine pyttsx3.init() #创建对象"""语速"…

目前比较好用的护眼台灯,小学生适合的护眼台灯推荐

随着技术的发展&#xff0c;灯光早已成为每家每户都需要的东西。但是灯光不好可能会对眼睛造成伤害是很多人没有注意到的。现在随着护眼灯产品越来越多&#xff0c;市场上台灯的选择越来越多样化&#xff0c;如何选择一个对眼睛无伤害、无辐射的台灯成为许多家长首先要考虑的问…

【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】三、类和对象 &#xff08;面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针&#xff09; -CSDN博客 引入&#xff1a;类的六个默认成员函数…

如何使用springboot服务端接口公网远程调试——实现HTTP服务监听

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 二. 内网穿透2.1 安装…

ATA-2042高压放大器在细胞的剪切应力传感器研究中的应用

微流控技术是一种通过微小的通道和微型装置对流体进行精确操控和分析的技术。它是现代医学技术发展过程中的一种重要的生物医学工程技术&#xff0c;具有广泛的应用前景和重要性。它在高通量分析、个性化医疗、细胞筛选等方面有着巨大的潜力&#xff0c;Aigtek安泰电子今天就将…

HR8833 双通道H桥电机驱动芯片

HR8833为玩具、打印机和其它电机一T化应用提供一种双通道电机驱动方案。HR8833提供两种封装&#xff0c;一种是带有L露焊盘的TSSOP-16封装&#xff0c;能改进散热性能&#xff0c;且是无铅产品&#xff0c;引脚框采用100&#xff05;无锡电镀。另一种封装为SOP16&#xff0c;不…

智驾芯片全矩阵「曝光」,这家企业的车载品牌正式官宣

随着汽车智能化加速&#xff0c;智能驾驶芯片格局逐渐清晰。 针对L0-L2&#xff0c;业内基本采用智能前视一体机方案&#xff1b;要实现高速NOA、城市NOA等更为高阶的智驾功能等&#xff0c;则基本采用域控制器方案。从前视一体机至域控&#xff0c;再逐步演进到舱驾一体、中央…

python基于DETR(DEtection TRansformer)开发构建钢铁产业产品智能自动化检测识别系统

在前文中我们基于经典的YOLOv5开发构建了钢铁产业产品智能自动化检测识别系统&#xff0c;这里本文的主要目的是想要实践应用DETR这一端到端的检测模型来开发构建钢铁产业产品智能自动化检测识别系统。 DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检…

【Django使用】10大章31模块md文档,第5篇:Django模板和数据库使用

当你考虑开发现代化、高效且可扩展的网站和Web应用时&#xff0c;Django是一个强大的选择。Django是一个流行的开源Python Web框架&#xff0c;它提供了一个坚实的基础&#xff0c;帮助开发者快速构建功能丰富且高度定制的Web应用 全套Django笔记直接地址&#xff1a; 请移步这…