时间:2021-05-19
背景
全链路追踪中,针对部分特殊的流量,希望将它引导到特定服务上(这个特定服务不在正常请求的链路上)——问题可以被抽象为解决进程间通信过程中目标进程的选择。
进程间通信方式很多,本篇只关注 Java 进程间套接字通信下 HTTP 形式的请求劫持,引导特定流量到特定进程。
解决方案
可行的处理方案繁多。自顶向下从应用、框架、JVM、Container Runtime、System Call、网络协议栈等级别,均可着手解决。侵入性最强的操作就是要求所有业务应用都主动实现 HTTP 请求分流逻辑;次一级是提供二方库供业务应用主动集成;或者从系统层面进行改造,基于改写系统调用对请求进行劫持。
回顾两年前的所学,JVM TI 为劫持 HTTP 请求提供了一个全新的解决思路。通过 Agent 改写应用启动时加载的类的字节码,劫持类的实例并完成目标功能。
由于 Java 项目间调用大量的使用了 Apache 的 http-client 库,改写变得相当简单。识别流量,并对特定流量改写请求的 Host 即可。
Demo
由于 http-client 对所有请求目标都统一由 org.apache.http.HttpHost 维护,控制变得极为简单。只需在 HttpHost 实例化时,改写类的构造方法,即完成了对目标的劫持工作(下例中强制将所有请求指向 163.com)
public class Agent implements ClassFileTransformer { public static void premain(String args, Instrumentation instrumentation) { instrumentation.addTransformer(new Agent()); } @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if ("org/apache/http/HttpHost".equals(className)) { ClassPool pool = ClassPool.getDefault(); try { CtClass httpHost = pool.get("org.apache.http.HttpHost"); CtClass string = pool.get("java.lang.String"); CtConstructor constructor = httpHost.getDeclaredConstructor(new CtClass[]{string, CtClass.intType, string}); constructor.insertBefore("hostname = \"pileException | IOException e){ e.printStackTrace(); } } return classfileBuffer; }}将整个项目打包为 agent.jar 的过程不做太多介绍,详见 ffutop/http-client-plugin
针对需要劫持的项目,在启动参数中增加 -javaagent:${PATH_TO}/http-client-plugin.jar
以上就是如何劫持Java应用的HTTP请求的详细内容,更多关于劫持Java应用的HTTP请求的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。Java有原生的API可用于发送HTTP请求,即java.net.U
一、前言如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。Java有原生的API可用于发送HTTP请求,即java.n
json劫持json劫持攻击又为”JSONHijacking”,攻击过程有点类似于csrf,只不过csrf只管发送http请求,但是json-hijack的目的
DNS劫持、HTTP劫持。那么DNS劫持和HTTP劫持有哪些区别?这里为大家解答下。 DNS劫持 DNS是DomainNameSystem的简写,即域名系统
DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其