热门标签 | 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点在看



推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 本文介绍了两种方法,用于检测 Android 设备是否开启了开发者模式。第一种方法通过检查 USB 调试模式的状态,第二种方法则直接判断开发者选项是否启用。这两种方法均提供了代码示例和详细解释。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • Python入门:第一天准备与安装
    本文详细介绍了Python编程语言的基础知识和安装步骤,帮助初学者快速上手。涵盖Python的特点、应用场景以及Windows环境下Python和PyCharm的安装方法。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
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社区 版权所有