热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hystrix页面_原创|JavaWeb中常见的信息泄漏—Hystrix面板

点击上方“蓝字”关注我们了解更多精彩关于Hystrix在微服务的应用场景中,通常会有很多层的服务调用。应用程序有数十个依赖关系,每个依赖关系在某些时候不
69a3b3bdf57c1379708a0d65956f5f77.png点击上方“蓝字”关注我们了解更多精彩关于Hystrix

在微服务的应用场景中,通常会有很多层的服务调用。应用程序有数十个依赖关系,每个依赖关系在某些时候不可避免的会出现问题(例如调用响应时间过长或不可用)。

如果一个底层服务出现问题,由于服务与服务之间的依赖性,故障会被向上传播给用户。那么就需要一种机制,当底层服务不可用时,可以阻断故障的传播。
在SpringCloud中提供这个机制的组件就是断路器Hystrix。大致的工作流程如下图:

c6a43c7f92a6cf3b69074fadd5ac22a9.png

在微服务架构下,通常会有多个层次的服务调用。上图是微服架构下, 浏览器端通过API访问后台微服务的一个示意图,服务B因为某些原因失败,变得不可用,所有对服务B的调用都会超时。
当对B的调用失败达到一个特定的阀值(5秒之内发生20次失败是Hystrix定义的缺省值), 链路就会被处于open状态,之后所有所有对服务B的调用都不会被执行,取而代之的是由断路器提供的一个表示链路open的Fallback消息。
Hystrix提供了相应机制,可以让开发者定义这个Fallbak消息。Fallback可以是另一个由Hystrix保护的服务调用,也可以是固定的值。Fallback也可以设计成链式调用,先执行某些逻辑,再返回Fallback。
简单来说类似电闸,当电路中出现过载时就会断电保证安全。Hystrix可以检测到服务的可用性,但是不够直观。使用HystrixDashboard会提供一个监控平台,方便查看服务的可用性。

90b4c9b89b194ea9589f1682026c0dba.png

具体实现

Dashboard是一个统一的断路器监控平台,一般会新建一个项目,引入相关依赖:

org.springframework.cloudgroupId> spring-cloud-starter-hystrix-dashboardartifactId>dependency>然后用@EnableHystrixDashboard注解Spingboot启动类,开启hystrixDashboard:

@SpringBootApplication@EnableHystrixDashboardpublic class EurekaHystrixMonitorApplication { public static void main(String[] args) { SpringApplication.run(EurekaHystrixMonitorApplication.class, args); } }

启动项目后访问/hystrix即可访问Hystrix Dashboard:

afeff7446d92724a422bcbb8fac630e0.png

Hystrix Dashboard共支持三种不同的监控方式:1.默认的集群监控:通过URL:
turbine-hostname:port/turbine.stream开启,实现对默认集群的监控。2.指定的集群监控:通过URL:
turbine-hostname:port/turbine.stream?cluster=[clusterName]开启,实现对clusterName集群的监控。3.单体应用的监控:通过URL
/hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控。(从springboot2开始,actuator都是要在请求路径加上/actuator,也就是hystrix-app:port/actuator/hystrix.stream)。利用思路不考虑Hystrix的底层实现以及数据生成,HystrixDashboard实际上是通过一系列的js解析实现的。首先是可以通过监控面板去查看一些敏感信息的,再者可以进行ssrf的利用:
可以通过相关接口配置监控:

/hystrix/monitor?stream=/proxy.stream?origin=填入被监控的服务地址(这里是dnslog地址),填写title,点击Monitor Stream进行监控:

ebe19ef27c42239b9f6326316c537862.png

可以看到成功在dnslog接收到相关请求:

bcf13d0710c2ba494b70646ea82c58f9.png

简单查看下相关的源代码,点击MonitorStream按钮后触发的是如下的js function:

9f66a70e981ad9971bb66231920ab2d0.png

获取用户输入的内容#stream后进行相关的URI编码,然后通过location.href进行跳转,跳转到/hystrix/monitor页面。查看相关源代码,这里重新对用户的输入stream进行了组装,将其作为/proxy.stream接口的origin参数的值,也就是说,访问/hystrix/monitor?stream=接口实际上最终调度的是/proxy.stream?origin=接口:

fc51c521afff4d69f3d1f0cea0a5b133.png

在一系列的非空判断后,使用EventSource对象来实现服务器的推送:

1ffcbc5bd03c84b5a19ac1ee89a8634e.png

因为在使用EventSource对象实现服务器推送时,服务器端响应的类型为 text/event-stream 类型,那么也就是说正常访问/proxy.stream?origin=结果应该返回如下:

2d94b75823a52b1c192277c541fb673c.png

proxy.stream接口其实是一个简单的servlet实现,origin参数就是前面我们输入的dnslog地址,相关的web.xml配置:

ProxyStreamServletservlet-name> /proxy.streamurl-pattern>servlet-mapping>

查看相关的Java代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String origin = request.getParameter("origin"); String authorization = request.getParameter("authorization"); if (origin == null) { response.setStatus(500); response.getWriter().println("Required parameter 'origin' missing. Example: 107.20.175.135:7001"); return; } origin = origin.trim(); HttpGet httpget = null; InputStream is = null; boolean hasFirstParameter = false; StringBuilder url = new StringBuilder(); if (!origin.startsWith("http")) { url.append("http://"); } url.append(origin); if (origin.contains("?")) { hasFirstParameter = true; } @SuppressWarnings("unchecked") Mapparams = request.getParameterMap(); for (String key : params.keySet()) { if (!key.equals("origin") && !key.equals("authorization")) { String[] values = params.get(key); String value = values[0].trim(); if (hasFirstParameter) { url.append("&"); } else { url.append("?"); hasFirstParameter = true; } url.append(key).append("=").append(value); } } String proxyUrl = url.toString(); logger.info("\n\nProxy opening connection to: {}\n\n", proxyUrl); try { httpget = new HttpGet(proxyUrl); if (authorization != null) { httpget.addHeader("Authorization", authorization); } HttpClient client = ProxyConnectionManager.httpClient; HttpResponse httpResponse = client.execute(httpget); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) {......简单的对origin进行校验,例如不允许为空,且仅允许http/https协议等,最后EventSource根据HttpClient发起的请求返回的内容进行渲染,完成监控页面的展示。
因为整个过程是通过HttpClient发起HTTP请求的,同时也缺少进一步的安全限制。也就是说可以简单的进行ssrf攻击,但没有相应的返回,为blindssrf。例如尝试监控本地不存在的端口1234,返回Unable to connect to Command Metric Stream:

21ded5732937d3914dd61f2194759bf5.png

尝试监控存在的端口9999,会返回相关的监控面板:

cb77a1dae0c43fc897766642243ec3ec.png

这里就可以简单的利用ssrf枚举出当前localhost的端口开放情况了。那么也就是说在满足Hystrix面板自身监控任务的同时,类似访问控制等安全措施就显得十分必要了。参考资料https://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_dashboard613f2c7357ad78379431adadbac42946.gif613f2c7357ad78379431adadbac42946.gif1e917a0444ebe371d5af5189cd559fe7.png76389074429562229f4820044404371a.gif点分享52ecef64d985154582480b74f8a6a004.gif点点赞96eb93002e45594a913f421f95e4bcda.gif点在看



推荐阅读
  • Spring Boot 入门指南
    本文介绍了Spring Boot的基本概念及其在现代Java应用程序开发中的作用。Spring Boot旨在简化Spring应用的初始设置和开发过程,通过自动配置和约定优于配置的原则,帮助开发者快速构建基于Spring框架的应用。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 本文作为SpringCloud Alibaba系列教程的第一部分,主要介绍如何搭建SpringCloud Alibaba的开发环境,帮助初学者快速入门。SpringCloud Alibaba是由阿里巴巴团队开源的一套微服务工具集,旨在简化分布式系统的构建过程。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • SpringCloud电商平台开发指南:实战案例解析
    本文详细介绍了基于SpringCloud构建的电商平台项目,涵盖了从技术选型到项目部署的全流程,旨在帮助开发者快速掌握电商平台的开发技巧。 ... [详细]
author-avatar
没有结果的爱请你收好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有