SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件

news2024/9/22 21:29:09

文章目录

  • 1.前置环境搭建
  • 2.测试SNI生效条件(时间)
  • 3. 证书对SNI的影响
    • 3.1 双方使用同一个证书:
    • 3.2 双方使用不同的证书与私钥
  • 4. 端口号区分测试
    • 4.1 端口号区分,证书区分:
    • 4.2 端口号区分,证书不区分:
  • 5.总结SNI运行机制
  • 6. SNI机制绕过host头探究
    • 6.1 端口相同的SSL虚拟主机
    • 6.2 端口不同的SSL虚拟主机
    • 6.3 小结

在先前的文章中,我们通过一些列分析,在一个LNMP架构下的站群系统中挖掘出了基于host字段进行注入的SQL注入漏洞。在解决HOST绕过问题时,我们给出了三种解决方案。冒号分割、双写host字段、利用SNI机制。

经过测试,冒号分割是可行的,双写host字段被高版本的nginx返回了400,无法使用。最后一个则是SNI机制。

SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

我们知道证书机制是为了加密通信流量,防止第三方窃听而存在的。而同一台主机配置多个网站时,会用到虚拟主机技术,每一个网站对应的证书也是不一样的。那么在用户与服务器第一次建立连接时,将使用哪一个证书进行通信呢?最初就是用的默认证书,而之后为了适应这样的需求,RFC推出了SNI机制,在TLS协议初期,即客户端发送自己的client hello报文时,就将host字段加入进去,以供服务器区分目的网站。选到对应的证书。

随后,证书就为客户端和服务器加密了通信内容,也就是说。后续的通信一旦发现是用某一个证书解密的。不需要再做判断,可以直接将数据报文交给对应的网站即可。也就是在建立了稳定的https通信之后,服务器中间件将不需要对host头进行解析,直接通过证书实现定向解析。

那么,我们会产生一系列思考。

第一:SNI机制会一直触发吗? 单https虚拟主机 —>多https虚拟主机

第二:控制证书为变量,测试证书对于流量解析的影响?—>证明是用证书私钥做流量区分的

第三:控制端口号为变量,测试端口号对于流量解析的影响?

1.前置环境搭建

既然如此我们就需要准备两套完整的nginx解析https虚拟主机进行测试。以及个服务器证书与私钥。

#1.双证书准备
#1.创建证书目录
[root@blackstone nginx]# mkdir certificate
[root@blackstone nginx]# cd certificate/

#2.生成私钥 - 要求你输入这个key文件的密码。给nginx使用。每次reload nginx配置时候都要验证这个PAM密码。
openssl genrsa -des3 -out ssl.key 4096
openssl genrsa -des3 -out sslb.key 4096
#3.生成CA证书文件 -- 此处为了区分证书,我们只好开两份CA证书相当于两个机构的认证
openssl req -new -key ssl.key -out aaa.csr
openssl req -new -key sslb.key -out bbb.csr

#4.利用CA证书签名生成服务器身份证书 - 证书签发有效期365天
openssl x509 -req -days 365 -in aaa.csr -signkey ssl.key -out aaa.crt
openssl x509 -req -days 365 -in bbb.csr -signkey sslb.key -out bbb.crt
#5.检查生成情况 - 此时包含我们自己的私钥,自己的证书.crt文件,以及csrCA证书
[root@blackstone certificate]# ll
total 32
-rw-r--r-- 1 root root 1895 Feb 10 23:34 aaa.crt
-rw-r--r-- 1 root root 1724 Feb 10 23:32 aaa.csr
-rw-r--r-- 1 root root 1907 Feb 11 00:52 bbb.crt
-rw-r--r-- 1 root root 1728 Feb 11 00:51 bbb.csr
-rw-r--r-- 1 root root 3311 Feb 11 00:50 sslb.key
-rw-r--r-- 1 root root 3311 Jan 11 21:24 ssl.key

网页部署

[root@blackstone www]# mkdir -p /var/www/aaa
[root@blackstone www]# mkdir -p /var/www/bbb
[root@blackstone www]# echo 'this is aaa.com' > /var/www/aaa/index.html
[root@blackstone www]# echo 'this is bbb.com' > /var/www/bbb/index.html

记得修改本机的host文件:C:\Windows\System32\drivers\etc

192.168.2.169 www.bbb.com 
192.168.2.169 www.aaa.com

2.测试SNI生效条件(时间)

1.单个https虚拟主机

 server {
        listen       443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

重启nginx,使用浏览器访问,进行抓包分析。

#后面的所有重启都建议直接把nginx关闭,彻底重启
[root@blackstone www]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
[root@blackstone www]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:

可以看到,确实在client hello报文内部,有这个主机名被发送给服务器了。
在这里插入图片描述
故,发送主机名是高版本浏览器的自发行为,不需要任何激发条件。浏览器会主动发送server name 以支持SNI机制。即SNI机制无需配置,只要服务器支持,就可以使用。

3. 证书对SNI的影响

3.1 双方使用同一个证书:

    server {
        listen       443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

    server {
        listen       443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }

测试访问情况:

在这里插入图片描述
在这里插入图片描述
可以实现分流。

3.2 双方使用不同的证书与私钥

这时,我们尝试进行证书与私钥的区分配置:

server {
        listen       443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }
    
server {
        listen       443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/bbb.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }
    }

再次测试访问效果:

[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:

在这里插入图片描述
在这里插入图片描述
各自可以收到各自的证书,建立各自的通信。

4. 端口号区分测试

4.1 端口号区分,证书区分:

server {
        listen       8443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/bbb.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }
  server {
        listen       8444 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


测试效果:

[root@blackstone certificate]# vim ../conf/nginx.conf
[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:

在这里插入图片描述

在这里插入图片描述
可以看到,证书已经分别发送给了两个虚拟主机客户端。实现流量区分

4.2 端口号区分,证书不区分:

server {
        listen       8443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }


    server {
        listen       8444 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }

中途效果不明显大家可以重启nginx服务,因为服务一直开着可能会有缓存文件。

[root@blackstone nginx]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
Enter PEM pass phrase:
[root@blackstone nginx]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:
Enter PEM pass phrase:

再次测试查看效果:

在这里插入图片描述
在这里插入图片描述
服务端两次传递同一个证书,实现通信。实现完整的虚拟主机分流访问。

5.总结SNI运行机制

通过以上种种测试,我们发现,无论使相同端口号,证书不同。达到证书区分传递的效果。还是证书不同,端口号也不同实现测试环境下的虚拟主机配置。SNI始终都可以准确的找到目标主机,即使是在我们的证书相同的情况下。

其实这一点也不费解,我们回顾一下之前学过的TSL通信过程:

第一次握手:客户端发送协议版本号,随机数,支持套件
第二次握手:服务端发送随机数,版本号,确认支持套件。同时发送服务端证书表明自己的身份(相当于发了个身份证过去)。
第三次握手:客户端收到证书,进行身份验证,验证完毕后利用从证书内部取出的公钥加密传输一串新的随机数pre_master给服务端。此时,客户端,服务端都共享了三个随机数,客户端随机数、服务端随机数、pre_master。于是根据三个随机数双方可以计算出共同的加密对称密钥进行通信。生成完会话密钥后,客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。再发一个「Encrypted Handshake Message(Finishd)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用和之前握手信息是否有被中途篡改过。
第四次握手:服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。
最后就是用会话密钥进行双方的通信

也就是说,客户端服务器通信过程中的密钥是新协商出来的。具有唯一标识性的这样一个密钥。那么通过SNI机制在第一次客户端发送client hello包时就发送的server name 确定到底访问的哪一个虚拟主机。后面的通信,自然可以通过解密密钥寻找到对应的虚拟主机。以此完成完整的SNI机制。

实现了可以为不同的虚拟主机配置这个不同的服务器证书。

6. SNI机制绕过host头探究

这样一个绕过出现的环境就很明显了,必须是配置了SSL的nginx服务器。

之前有同学提出过疑问,认为仅仅配置一个443端口的虚拟SSL主机。难以区分到底是由于我们的请求被转移到了默认的443端口处理虚拟主机上,还是说我们成功绕过了这样一个检测机制呢?接着3.2的环境,我们对其进行进一步的测试:

6.1 端口相同的SSL虚拟主机

#注意那个server在上面,在配置文件里就默认的是默认虚拟主机
    server {
        listen       443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }

 server {
        listen       443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

在这里插入图片描述
相同端口号,不同的证书条件下,修改了host文件后跳转到了默认的bbb.com虚拟主机上。绕过失效

6.2 端口不同的SSL虚拟主机

 server {
        listen       443 ssl;
        server_name  www.bbb.com;

        ssl_certificate      /usr/local/nginx/certificate/bbb.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/bbb;
            index  index.html index.htm;
        }


    }

 server {
        listen       8443 ssl;
        server_name  www.aaa.com;

        ssl_certificate      /usr/local/nginx/certificate/aaa.crt;
        ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /var/www/aaa;
            index  index.html index.htm;
        }


    }

访问效果:
在这里插入图片描述
在这里插入图片描述
再次进行测试:
在这里插入图片描述
这次没有在跳默认了,说明可行。

6.3 小结

SNI绕过host生效的条件其实就是单一端口下仅仅绑定一台SSL虚拟主机。因为我们在6.1中看到,端口相同时同一服务器绑定多台SSL主机时,所有的请求会交给默认页面。如果漏洞点在默认页面就好说,如果不在。就无法使用SNI进行绕过了。

但同时,如果服务器是单一的配置了一个443端口的ssl虚拟主机,那么将可以进行SNI机制的HOST头绕过。

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

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

相关文章

Docker-安装Jenkins-使用jenkins发版Java项目

文章目录0.前言环境背景1.操作流程1.1前期准备工作1.1.1环境变量的配置1.2使用流水线的方式进行发版1.2.1新建流水线任务1.2.2流水线操作工具tools步骤stages步骤1:拉取代码编译步骤2:发送文件并启动0.前言 学海无涯,旅“途”漫漫,“途”中小记&#xff…

从0到1一步一步玩转openEuler--12 openEuler用户管理

文章目录12.1 创建用户12.1.1 useradd命令12.1.2 用户信息文件12.1.3 创建用户实例12.2 修改用户账号12.2.1 修改密码12.2.2 修改用户shell设置12.2.3 修改主目录12.2.4 修改UID12.2.5 修改账号的有效期12.3 删除用户12.4 管理员账户授权在Linux中,每个普通用户都有…

【Java 面试合集】怎么声明一个类不会被继承,以及应用场景

怎么声明一个类不会被继承,以及应用场景1. 概述 今天的Java 面试合集又来了。今天我们复习的问题是:怎么声明一个类,不可以被继承 2. 验证 public final class TestMath { }通过上述截图 我们可以看到,被关键字final 修饰过的类,…

EOC第六章《块与中枢派发》

文章目录第37条:理解block这一概念第38条:为常用的块类型创建typedef第39条:用handler块降低代码分散程度第41条:多用派发队列,少用同步锁方案一:使用串行同步队列来将读写操作都安排到同一个队列里&#x…

02 OpenCV图像通道处理

1 通道提取与合并 在数字图像处理中,图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道,每个通道表示相应颜色的亮度。这种方式是最常…

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】1、概述2、实验环境3、参考资料-致谢4、自我提升实验效果5、代码练习-学习后拆解(1)头文件部分(2)绘制事件绘制表盘代码(3) 每一块部分绘制6、代码移植提升类…

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获&#…

nginx正向代理的配置和使用

nginx正向代理的配置和使用 nginx正向代理的配置和使用nginx正向代理的配置和使用安装包准备下载nginx安装包下载正向代理模块的包版本与模块对照表部署nginx服务上传nginx包和正向模块包解压,改名安装nginx配置正向代理创建nginx用户检查nginx配置并启动nginx服务所在服务器验…

微服务02 Docker

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0…

实战绕过WTS-WAF的SQL注入

实战绕过WTS-WAF的SQL注入1.前言2.测试流程2.1.发现漏洞2.1.1.正常页面2.1.2.WAF警告2.1.3.非正常页面2.2.判断字段数2.2.1.非正常页面2.2.2.正常页面2.3.判断回显位2.4.信息收集2.4.1.数据库版本2.4.2.数据库名2.5.判断数据库表2.5.1.WAF告警2.5.2.获取表2.5.3.burp suite测试…

龙曲良 Tensorflow —— tensorflow高级操作(自用)

目录 一、合并与分割 1.1 tf.concat (合并) 1.2 tf.stack (增加新维度) 1.3 tf.unstack (一个一个拆分) 1.4 tf.split (均分拆分) 二、数据统计 2.1 tf.norm(默认二范数) 2…

WebRTC(一):三种架构和基本原理

文章目录一、三种架构二、为什么SFU最为常用?一、三种架构 webrtc大致可以分为三种架构: MESH mesh架构需要所有参与连接的peer简历和所有其他peer的媒体的连接,如图一。 该架构需要n-1个上下行,以此带来的带宽消耗&#xff08…

家政服务小程序实战教程02-创建模型应用

我们在上一篇中介绍了数据源的设计及创建方法,本篇我们就根据我们创建好的数据源来设计功能。 按我们的需求分析,系统管理员来审核数据,要想审核数据需要给管理员提供一个管理后台。微搭中的管理后台是通过模型应用来解决的。 登录控制台&a…

我用python/C++调用ChatGPT自制了一个聊天机器人

目录1 ChatGPT完整版2 Python/C调用ChatGPT2.1 获取API秘钥2.2 测试API功能2.3 设计简单UI3 聊天问答1 ChatGPT完整版 2015年,OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等硅谷科技大亨创立,公…

chatGPT都可以干什么呢?来一睹风采 (送账号)

文章目录1. 写代码2. 写文案3. 写剧本4. 写歌诗5. 写报告6. 查公式7. 写对联8. 写文章9. 做表格10. 做计划11. 等等1. 写代码 2. 写文案 3. 写剧本 4. 写歌诗 5. 写报告 这妥妥的翻译文,数据完全不对。 6. 查公式 傅里叶变换的时域性质有如下几点: 对…

JAVA集合专题4 —— Map

目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点 Map与Collection并列存在,是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap),有些子实现存储数据是无…

【量化交易】 量化因子 动量类因子

量化因子 - 风险类因子计算 5日乖离率 BIAS5 (收盘价-收盘价的N日简单平均)/ 收盘价的N日简单平均*100,在此n取5 60日变动速率(Price Rate of Change) ROC60 ①AX今天的收盘价—20天前的收盘价 ②BX60天前的收盘价 ③…

React-Router

版本5安装:npmnpm install react-router-dom5 -Syarnyarn add react-router-dom5import ReactDOM from "react-dom/client";// react router适用于web和原生项目,我们在web项目中使用,所以需要引入的包是react-router-dom import {…

Idea 安装 Sonar 插件提升代码质量

目录 0. 环境说明 1. Sonar 简介 2. IDEA 配置 Sonar 0. 环境说明 Java 1.8IDEA 2022.3.1SonarLint 7.4.0 1. Sonar 简介 在多人协通的软件开发过程中,代码风格和代码质量对于软件的整体交付是十分关键的。这时我们可以利用 Sonar 插件,对代码进行扫描…

Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上

Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上引言RequestMappingHandlerAdapter方法参数解析器方法参数名解析器类型转换体系简单的使用演示数据绑定器工厂定制化修改DataBinder获取泛型参数ControllerAdvice与InitBinder注解控制器方法执行流程Controll…