【Web实战】浅谈reactor netty httpclient请求解析过程

目录

0x00 前言

0x01 "畸形scheme"HTTP请求

0x02 其他


0x00 前言

Reactor Netty HttpClient 是 Reactor Netty 框架提供的一个用于进行异步 HTTP 请求的客户端库。它基于 Reactor 框架,采用响应式编程模型,允许以非阻塞的方式执行 HTTP 请求和处理响应。

image.png

通过引入对应的依赖,即可通过使用Reactor Netty从HttpClient获取目标的响应报文:

image.png

下面是一个具体的例子,首先创建了一个 HttpClient 对象,通过Reactor Netty 的链式调用 API 来构建我们的请求,发起了一个 GET 请求访问了target并打印对应响应的内容,完成了整个请求与响应处理过程:

HttpClient httpClient = HttpClient.create().wiretap(true);
httpClient.get().uri(target).responseContent().aggregate().asString().doOnSuccess(s -> {System.out.println("s1=" + s);
}).block();

上述代码串联了多个Reactor Netty的方法,下面是简单的说明:

  • httpClient.get().uri(target):通过httpClient创建了一个HTTP GET请求,并指定了请访问的目标URL。
  • .responseContent():调用.responseContent()方法,会获取到一个表示HTTP响应内容(响应体)的Flux\<ByteBuf>,其中Flux是Reactor中的一种反应式数据类型,表示异步流。异步处理响应体的数据信息。
  • .aggregate():因为HTTP响应的内容通常会被分成多个字节块,该方法用于将它们进行整合。
  • .asString():调用该方法将ByteBuf内容解码为字符串方便后续的处理。
  • doOnSuccess(s -> { System.out.println("s1=" + s);}):使用.doOnSuccess()方法注册一个回调函数,当HTTP响应成功完成时,执行这个函数将HTTP响应的内容打印到控制台中。
  • .block():阻塞当前线程以等待HTTP响应的完成。.block()方法会触发实际的HTTP请求发送和响应处理,然后等待直到HTTP请求完成,并且只有在响应成功时才会解除阻塞。

当然除了block以外,还可以通过类似subscribe获取响应报文。

0x01 "畸形scheme"HTTP请求

以GET请求为例,下面对reactor netty httpclient请求解析过程进行简单的分析:

在 Reactor Netty 框架中,MonoHttpConnect是一个用于表示 HTTP 连接的 Mono 类型。它代表了一个异步的 HTTP 请求,并返回一个 Mono 类型的结果。通过调用 subscribe 方法,可以触发实际的 HTTP 请求,并通过订阅者来处理响应结果:

image.png

首先这里会实例化HttpClientConnect,这里会调用uriEndpointFactory.createUriEndpoint创建 UriEndpoint,UriEndpoint是一个用于表示网络请求的目标地址的类。它封装了 URI 的相关信息,包括协议、主机名、端口号、路径等。reactor.netty.http.client.UriEndpointFactory#createUriEndpoint方法根据传入的参数,创建一个 UriEndpoint 对象,并返回该对象:

image.png

可以看到,在createUriEndpoint方法中,主要是通过正则匹配的方式获取URI 的相关信息:

image.png

创建完HttpClientHandler后,会通过配置对象(_config)来设置一些参数:

image.png

这里会调用resolverInternal方法用于获取地址解析器组。它负责将主机名解析为一个或多个 IP 地址,以便 HttpClient 可以与目标服务器建立连接:

image.png

实际调用的是其父类ClientTransportConfig的方法:

image.png

这里会create一系列的组件:

image.png

例如创建ConnectionProvider用来管理连接池,Builer这里硬编码传入对应的name为http,后续会创建一组连接并存储在连接池中。 当需要进行网络通信时,可以从连接池中获取一个连接并使用它来发送请求:

image.png

又例如PooledConnectionProvider,这个在后面会用到:

image.png

调用完后,此时会调用_config.httpConnectionProvider().acquire从 HTTP 连接提供者中获取一个可用的连接。以便进行 HTTP 请求:

image.png

查看具体的过程,这里最终会调用PooledConnectionProvider的acquire方法:

image.png

image.png

reactor.netty.resources.PooledConnectionProvider的作用是提供连接池管理功能。在使用 Reactor Netty 进行网络通信时,可以通过 PooledConnectionProvider 来管理和复用连接,以提高性能和资源利用率,这里会调用 acquire 方法获取一个可用的连接,以便进行网络通信。获取到的连接可以用于发送请求、接收响应等操作,如果连接池中没有可用的连接,它可能会创建一个新的连接:

image.png

从对应的调试信息可以知道,这里创建的是http client pool,结合前面解析请求target的过程,这里name的值并不是从请求target的schema获取的,是从前面Builer里硬编码获取的:

image.png

后面是HttpClientOperations的处理,也没有对schema进行相应检查操作,那么这里有没有可能reactor netty httpclient可以以任意符合正则匹配的schema进行请求呢?

image.png

验证下前面的猜想:

image.png

正常情况下,通过reactor netty httpclient请求http://127.0.0.1:8080/health正常返回:

image.png

将scheme替换成任意字符,可以发现依旧能正常请求并返回:

image.png

查看reactor netty httpclient的日志,确实没有考虑用户输入的协议,在PooledConnectionProvider创建了新的http client pool,同时也没有发现关于schema的检查:

image.png

image.png

结合前面请求target解析的正则:

image.png

image.png

scheme还支持下划线匹配,所以类似anyt____hing的schema同样能正常请求:

image.png

0x02 其他

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。 它的响应式编程的基于Reactor的。 WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。

通过引入如下依赖即可使用WebClient:

image.png

从依赖关系可以看到,实际上spring-boot-starter-webflux也是基于reactor-netty-http来发起相应的请求的:

image.png

下面的代码是一个简单的WebClient请求示例。可以通过WebClient.create()创建一个WebClient的实例,然后选择调用方式get,在uri()指定需要请求的路径,然后调用retrieve()发起请求并获得响应,bodyToMono(String.class)用来指定请求结果需要处理为String:

WebClient webClient = WebClient.builder().build();
String response = webClient.get().uri(url).retrieve().bodyToMono(String.class).block();
return response;

简单看下WebClient的处理过程,首先会在org.springframework.web.util.UriComponentsBuilder#fromUriString方法处理需要请求的目标:

image.png

可以看到这里也是通过正则的方式进行匹配:

image.png

若未匹配相关信息,会抛出throw new IllegalArgumentException("[" + uri + "] is not a valid URI");异常,否则进行进一步的封装,同时这里对scheme和host进行了一定的合法性检查:

image.png

但是并没有强制校验scheme是否是http/https,所以同样的当尝试请求anything://127.0.0.1:8080/health,WebClient同样也是能正常解析并正常返回:

image.png

可以看到结合reactor netty httpclient解析过程中的一些处理方式,可以构造类似上述任意协议的“畸形”的请求样式,在某种情况下可以绕过现有ssrf的一些安全防护措施。开发人员应该避免将不受信任且未经验证的数据从 HTTP 请求传递给reactor netty httpclient,避免不必要的绕过导致ssrf风险。

原文链接:https://forum.butian.net/share/2557

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

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

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

相关文章

如何通过RA过程识别Redcap UE?

以下是38.300中的描述 RedCap UE可以通过发送MSG3/MSGA的特定LCID识别&#xff0c;可选条件是通过MSGA/MSG1的PRACH occasion/PRACH preamble识别&#xff0c;根据这段描述&#xff0c;通过MSG3/MSGA的识别是必须项&#xff0c;而MSGA/MSG1的识别过程是可选项。如果通过MSGA/MS…

三极管基础知识

三极管 基本概念应用电路 基本概念 三极管 NPN 和PNP 电流方向 PNP是从e 流向 b c NPN是从 b c流向e 应用电路 箭头出发方向的电极比箭头指向方向的电极&#xff0c;高0.7v才导通。 NPN控制下游是否接到地&#xff0c;PNP控制上游的电源能否接过来。

笔试题之指针结合数组的精讲2

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】

MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql ​ input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…

webpack plugin

1、基本写法及使用 这里用到 emit 钩子 及make 钩子&#xff0c;前者是串行后者是并行 /*** 1.webpack加载webpack.config.js中所有配置&#xff0c;此时就会new TestPlugin()&#xff0c;执行插件的constructor2.webpack创建compiler对象3.遍历所有plugins中插件&#xff0…

灵活运用Vue 3中的setup函数—深入解析Composition API

新建项目&#xff0c;项目主入口为App.vue&#xff08;主组件&#xff09;&#xff0c;新建child.vue&#xff08;子组件&#xff09;。 1.1 setup 执行 时机问题 1.在主组件里引入子组件和ref&#xff1a; import {ref} from vue import child from ./components/child.vue2…

uni-app项目细节记录

js字符串插值 使用反引号,内容使用${参数} url:/pages/login/index?name${this.name}&passwd${this.passwd}

2024年企业软件定制开发必须了解的4大趋势

根据Statista的统计数据显示&#xff0c;全球企业级软件市场占据主导地位&#xff0c;预计到2028年市场规模将接近3760亿美元。企业应用软件市场持续稳健增长&#xff0c;即使在经济不景气时期也能够持续增长&#xff0c;彰显出软件解决方案对提高企业运营效率和盈利能力的重要…

HTML实现简易计算器

随便写的&#xff0c;可能有bug&#xff0c;可以在评论区指出哈。 HTML代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>AI简易计算器</title> </head> <body> <table id"c…

【剑指Offer】44.数字序列中某一位的数字

题目 数字以0123456789101112131415...的格式作为一个字符序列&#xff0c;在这个序列中第2位&#xff08;从下标0开始计算&#xff09;是2&#xff0c;第10位是1&#xff0c;第13位是1&#xff0c;以此类题&#xff0c;请你输出第n位对应的数字。 数据范围&#xff1a;0≤n≤…

【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析&#xff0c;这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来&#xff0c;Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…

Mysql中自增主键是如何工作的

自增主键的特点是当表中每新增一条记录时&#xff0c;主键值会根据自增步长自动叠加&#xff0c;通常会将自增步长设置1&#xff0c;也就是说自增主键值是连续的。那么MySQL自增主键值一定会连续吗&#xff1f;今天这篇文章就来说说这个问题&#xff0c;看看什么情况下自增主键…

第三阶段学习beiqi3

滑行回馈力矩给定修改力矩 if(1 Vehicle_cmd.cmdmode.data.slip_feedback_flag)//滑行回馈{motor_regen_power EV_MCU_Para.field.Motor_regen_power_slip_level;//滑行固定功率在 10kw *****11.22 这里除去2 5kw motor_regen_trq_lmt _IQmpyI32(motor_regen_power, 9550)…

postman设置接口关联这样做,薪资直接涨3k

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

kubernetes资源管理

kubernetes资源管理 文章目录 kubernetes资源管理1.资源管理介绍2.YAML语言介绍3.资源管理方式3.1 命令式对象管理3.2 命令式对象配置3.3 声明式对象配置扩展&#xff1a;kubectl在node节点上运行 1.资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0…

c语言编程(模考3)统计字符串中数字字符的个数

统计字符串中数字字符的个数 #include<stdio.h> int main(){char inputString[100];int digitCount 0;printf("请输入一个字符串&#xff1a;");scanf("%s",inputString);for(int i0;inputString[i]!\0;i){if (inputString[i]>0&&inpu…

jQuery的学习(一篇文章齐全)

目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1&#xff1a;绑定取消事件 案例2&#xff1a;模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本&#xff1a; 案例1&#xff1a; 案例2&#xff…

Thread的常用方法

一&#xff0c;常用方法 二&#xff0c;案例 父类&#xff1a; package ThreadLianXi;import ThreadLianXi.ZhiLeiA;public class Name {public static void main(String[] args)throws Exception{Thread t1 new ZhiLeiA("1号");//修改名字t1.setName("1号&quo…

中国最常用的制作报表的软件有哪些?

​随着信息化时代的浪潮席卷而来&#xff0c;报表制作软件已经成为了企业管理中的得力助手。在中国的大地上&#xff0c;有许多优秀的报表制作软件&#xff0c;而本文将为您揭示五位佼佼者&#xff0c;其中更以VeryReport报表软件为首选。 编辑搜图 请点击输入图片描述&#x…

华为昇腾开发板共享Windows网络上网的方法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 具体参考文章&#xff1a;linux(内网&#xff09;通过window 上网。具体是两步&#xff1a;一是在windows上设置internet连接共享。二是打开Atlas 200I D…