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 on
        the HTTP protocol version. """
    if not code:
        code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302
    res = response.copy(cls=HTTPResponse)
    res.status = code
    res.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.response

if __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代码中的标签被浏览器转义,这里并没有成功,那么可以尝试在低版本的浏览器中测试一下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记(十五):JetPack Compose的附带效应(二)-produceState和derivedStateOf

在本笔记中&#xff0c;将结合实例介绍produceState和derivedStateOf两个可组合函数。它们分别实现状态的转换。 &#xff08;1&#xff09;produceState将非Compose状态转换虫Compose状态 &#xff08;2&#xff09;derivedStateOf将多个状态转换成其他状态。 一、produceSta…

NFC技术简介

NFC简介 NFC(近场通信&#xff0c;Near Field Communication&#xff09;是一种短距高频的无线电技术&#xff0c;由非接触式射频识别(RFID)演变而来。 NFC工作频率为13.56Hz&#xff0c;通常只有在距离不超过4厘米时才能启动连接&#xff0c;其传输速度有106 Kbit/秒、212 Kb…

「Whale 帷幄」连续入选科技榜单,AGI 冲击波正在加速行业洗牌

以 AGI 为底座&#xff0c;品牌 MarTech 正在经历一场前所未有的深度变革。 近日&#xff0c;弯弓研究院发布「中国 MarTech 500 强榜单」&#xff0c;以 2023 中国营销技术&#xff08;MarTech&#xff09;生态为研究对象&#xff0c;洞察行业现象与未来趋势。作为品牌数字化…

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

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

AI制作的《大多数普通女孩的一生》——公开教程和工作流

内容来源&#xff1a;JiamigouCn ​这周由AI制作的《大多数普通女孩的一生》&#xff0c;在抖音爆火&#xff0c;获得新华网转发。到目前为止&#xff0c;全网还没有公开教程和工作流&#xff0c;需要花费800-2000购买。 本着AI社区共享原则&#xff0c;我委托公众号“楚思智能…

Debian12试用报告

环境: win11vbox 虚拟机 网络: host-only访问局域网 nat 访问外网, 配置为dhcp动态获取ip 遇到的问题: 偶尔卡死: nat每次开机都不生效, 外网无法访问; 开机后 重启网络可解决 sudo /etc/init.d/networking restart host-only倒是没问题, 内网正常访问 vim9还是用不习…

ubuntu22.04 arrch64版在线安装java环境

脚本 #安装java#!/bin/bashif type -p java; thenecho "Java has been installed."else#2.Installed Java , must install wgetwget -c https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-arm64-vfp-hflt.tar.gz;tar -zxvf ./jdk-8u151-linux-arm6…

【Spring集成MyBatis】核心配置文件

文章目录 1. typeHandlers标签2. plugins标签通过PageHelper的API获取分页的信息 1. typeHandlers标签 可以重写类型处理器&#xff0c;或创建类型处理器来处理不支持/非标准的类型。选择性地将它映射到一个JDBC类型&#xff1a;如Java中的Date类型&#xff0c;将其存放到数据…

“土味出海”,屡试不爽!短剧出海引来新一轮爆发?

土味和“钱途”并存的短剧不仅在国内迅猛爆发&#xff0c;今年下半年以来海外市场多部爆火短剧出现&#xff0c;“短剧出海”的话题热度不断攀升&#xff0c;丝毫不差2021年网文出海的盛况。 “霸总的爱&#xff0c;日入千万刀”&#xff0c;是真实存在的&#xff01; 据统计…

快手ConnectionError

因为运行的程序被中断导致 top然后查看站用处内存高的accelerate kill进程号 9回车

概要设计文档案例分享

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计 6.1运行模块…

图像标记上线,描点信息尽在掌握丨三叠云

图像标记 路径 表单设计 >> 组件 >> 增强组件 功能简介 「图像标记」字段是「增强字段」类型字段。用户通过上传图片的方式构建一个背景图片&#xff0c;并在构建的图片背景上添加描点信息。搭配「仪表盘」中的「图像轨迹」&#xff0c;可绘制出相应的数据轨迹…

MySQL数据库入门到大牛_基础_14_视图及基本操作

本章开始将会介绍表之外的数据库对象。 文章目录 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图&#xff1f;2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改…

马斯克星链与芯事:30亿美元炸出卫星互联网革命,GPU算力创无限可能

★卫星互联网&#xff1b;算力&#xff1b;卫星通信&#xff1b;互联网&#xff1b;低轨卫星互联网&#xff1b;5G基础设施&#xff1b;GPT-4 Turbo&#xff1b;算力&#xff1b;地面通信&#xff1b;液冷&#xff1b;水冷&#xff1b;AI服务器&#xff1b;东数西算&#xff1b…

收藏这几个开源库,写css你会笑出声

你是否遇到过写css没灵感&#xff0c;写不出酷炫的效果&#xff0c;那这篇文章你一定要看完。知道这几个开源库&#xff0c;它能让你写出炸天的效果并且有效地增加你的摸鱼时长。 1.CSS Inspiration 网址&#xff1a;https://chokcoco.github.io/CSS-Inspiration/#/ CSS Insp…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列&#xff0c;例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息&#xff0c;以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

[Android]使用Retrofit进行网络请求

以下是使用 Retrofit 发送 POST 请求获取分页城市列表的 Kotlin 代码示例 1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依赖 dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2…

在Linux服务器部署爬虫程序?大佬只需七步!

之前在某乎上看见一篇关于《为什么很多程序员都建议使用 Linux》的文章&#xff0c;结合我自身关于Linux的使用经验。心血来潮得写了一段关于我在Linux系统部署爬虫程序的心得&#xff0c;希望结识更多的爬虫技术大佬&#xff0c;一起游弋在代码世界中。 根据我多年在Linux上部…

基于C#实现Dijkstra算法

或许在生活中&#xff0c;经常会碰到针对某一个问题&#xff0c;在众多的限制条件下&#xff0c;如何去寻找一个最优解&#xff1f;可能大家想到了很多诸如“线性规划”&#xff0c;“动态规划”这些经典策略&#xff0c;当然有的问题我们可以用贪心来寻求整体最优解&#xff0…

vue3.0使用leaflet

1、获取天地图密钥; 访问:https://www.tianditu.gov.cn/ 注册并登录,访问开发资源 =》地图API =》 地图服务=》申请key 应用管理=》创建新应用=》获取到对应天地图key 2、引入leaflet组件 参考资料:https://leafletjs.com/reference.html#path npm install leaflet …