URLConnection/JNI
创始人
2025-05-30 08:35:35
0

目录

URLConnection

SSRF

JNI安全基础

构建动态链接库供Java调用

JNI-定义native方法

JNI-生成类头文件

JNI-编写C/C++本地命令执行实现

主函数调用 

URLConnection

在java中,java抽象出来了一个URLConnection类,它用来表示应用程序以及与URL建立通信连接的所有类的超类,通过URL类中的 openConnection 方法获取到URLConnection的类对象。

Java中URLConnection支持的协议可以在sun.net.www.protocol看到。

gopher协议在jdk1.8+就被禁止了

package com.cxk.url;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class urlconnection {public static void main(String[] args) throws IOException {URL url = new URL("file:///E://123.txt");//打开和url之间的连接URLConnection connection = url.openConnection();//设置请求参数connection.setRequestProperty("user-agent","javasec");connection.setConnectTimeout(1000);connection.setReadTimeout(1000);//创建实际连接connection.connect();//获取响应头字段信息列表connection.getHeaderFields();//获取URL响应connection.getInputStream();StringBuilder response = new StringBuilder();//可变字符串BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine())!=null){response.append("/n").append(line);}System.out.println(response.toString());}
}

 大概流程就是通过URL建立一个对象,然后建立连接,设置一些配置,最后获得相应流,这里的StringBuilder和StringBuffer差不多,两者都可以进行多次修改,并且不产生新的使用对象。StringBuilder类相较于StringBuffer有速度优势。但在要求线程安全的情况下,必须使用StringBuffer。  如果用String的话太繁琐,因为String不可变。

SSRF

SSRF(Server-side Request Forge, 服务端请求伪造)。 由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。

简述就是,执行者通过服务器发现可以访问一些敏感的数据。

比如上面的new URL() 中我们可以控制就可以读取/etc/passwd配置信息等。

JNI安全基础

java是基于c语言实现的,也就是底层是C的原理毕竟java在c后产生的,Java底层的很多API都是通过JNI(Java Native Interface)来实现的。通过JNI接口C/C++Java可以互相调用(存在跨平台问题),这和前面的命令执行也是用了Native也就是c实现的呗。

构建动态链接库供Java调用

JNI-定义native方法

首先java中如果想要调用native方法需要在类中定义一个native方法。 

这点和java中的接口差不多,都需要一个其他的类来实现这个接口。

package com.cxk.Jni;public class JNITest {public native void sayHello();}

这里定义了native  void就是没参数,因为只是为了简单的看出功能,sayHello方法需要c来实现。

JNI-生成类头文件

这个就可以理解为java和c之间连接的桥梁不能缺少。

完整的步骤如下:

  1. 生成一个class ,javac JNITest 
  2. java com.cxk.Jni.JNITest 命令,这里不能在包内因为里面有引用路径。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_cxk_Jni_JNITest */#ifndef _Included_com_cxk_Jni_JNITest
#define _Included_com_cxk_Jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_cxk_Jni_JNITest* Method:    sayHello* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_cxk_Jni_JNITest_sayHello(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

 这个文件一定不要修改,

JNIEXPORT void JNICALL Java_com_cxk_Jni_JNITest_sayHello

                   无参  JNICALL想到与引用后面的,java 包.文件.方法

 (JNIEnv *, jobject);这里需要注意java中的类型和c中的不同,所以需要转换JNI安全基础_「Java Web安全」 - 网安 参考连接

JNI-编写C/C++本地命令执行实现

如上,我们已经生成好了头文件,接下来我们需要使用C/C++编写函数的最终实现代码。

com_cxk.Jni.JNITest.cpp示例:

#include 
#include 
#include 
#include 
#include"com_cxk_Jni_JNITest.h"
using namespace std;JNIEXPORT void JNICALL Java_com_cxk_Jni_JNITest_sayHello(JNIEnv *env, jobject obj)
{cout<<"hello world!"<

这里仅仅是一个输出的功能。

后使用g++命令编译成动态链接库,前提是您需要提前装好编译环境如:gcc/g++

x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o cmd.dll com_cxk_Jni_JNITest.cpp

这样就生成了一个cmd.dll文件,cmd随机的

还有关键的一步,把cmd.dll文件放到system32中,这样电脑才能找到

C:\Windows\system32

主函数调用 

package com.cxk.Jni;public class JNITest {public native void sayHello();public static void main(String[] args) {System.load( "E:\\2022java-servlet\\11\\javassist-learn\\src\\main\\java\\cmd.dll" );System.loadLibrary("cmd");JNITest tNative = new JNITest();tNative.sayHello();}
}

 总结:JNI可以实现对操作系统底层的调用,JNI可以用来提高调用的速度,它是直接和操作系统的内存进行交互,而省去了JVM和操作系统进行内存交换的步骤;JNI的另一个使用场景就是某些核心类库的实现可能需要跨包调用或者需要绕过其他Java安全性检查,如Java中的sun.misc.Unsaef实现,所以会引起很多安全的漏洞。
 

相关内容

热门资讯

长春市经济纠纷律师选择需要关注... 本地经济类法律事务的需求背景 近年来随着国内商贸活动的活跃度持续提升,长春本地的市场主体数量逐年增长...
蒋方舟回应清华教授对其“论文造... “蒋方舟的跋涉”微信公号 青年作家蒋方舟7月4日在其个人社交平台发文,题目为《请清华教授停止对我的网...
女子自费6.8万元装爬楼机,供... 近日,上海浦东新区鑫源物业小区六楼住户巢女士反映,78岁的母亲常来家中照看外孙,几年前因车祸患上腿疾...
年内最大降幅!今晚,油价下调 记者从国家发展改革委获悉,今日24时国内成品油调价窗口将开启。据国家发展改革委价格监测中心监测,本轮...
成都一公共卫生间内发现偷拍设备... 央广网成都7月4日消息(记者 昌思荣 王颖 唐诗敏)7月3日,有群众报警称,四川成都市锦江区水津街一...
叙利亚首都发生恐怖爆炸袭击 死... 叙利亚首都大马士革市中心司法宫附近一家咖啡馆2日下午发生爆炸。据叙过渡政府卫生部最新消息,此次袭击已...
江波龙:预计上半年净利润92亿... 江波龙公告称,预计2026年半年度归属于上市公司股东的净利润为92.00亿元-110.00亿元,同比...
茉莉奶白四叶花LOGO惹怒LV... 中新网北京7月3日电(左雨晴) 茉莉奶白被国际奢侈品品牌路易威登马利蒂(Louis Vuitton ...
今年2000亿元设备更新资金已... 央视网消息(新闻联播):记者7月3日从国家发展改革委了解到,今年第三批设备更新项目清单和资金安排已下...
王健林,再卖一座万达广场 万达商业推进资产处置工作,有了新进展。 近日,湛江开发区万达广场投资有限公司发生工商变更。天眼查AP...