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实现,所以会引起很多安全的漏洞。
 

相关内容

热门资讯

当我们讨论“抗衰”时,究竟在讨... 本文作者:中科创星没有人能抵抗“长生”的诱惑,但要说有什么比“长生”更让人神往,那一定是“不老”。希...
紧跟医药新零售, 药师帮抢先布... 6月3日,药师帮(09885)与越疆(02432)达成战略合作,双方将围绕协作机器人及AI产品在医药...
两任银监局局长落马,川系城商行... 出品|达摩财经6月6日,国家金融监督管理总局发布消息称,原四川银监局党委书记、局长王筠权涉嫌严重违纪...
这次大放水,无人察觉…… 史无... 一个月前,金融市场发生了一件事情——新台币大幅度升值。2025年5月1日,新台币兑美元的汇率还在32...
国内算力产业最大吸并案敲定 海... 新京报贝壳财经讯(记者陈维城)6月9日晚间,海光信息(688041.SH)和中科曙光(603019....
离谱!高考生OPPO手机闹钟没... 高考当天闹钟没响是什么体验?一位OPPO手机用户就感受了一把!OPPO手机高考闹钟失灵多名网友表示遇...
海默科技:筹划公司控制权变更,... 新京报贝壳财经讯 6月9日,海默科技公告,公司控股股东山东新征程及实际控制人苏占才正在筹划股权转让及...
万安科技:控股股东质押4500... 新京报贝壳财经讯 6月9日,万安科技公告,控股股东万安集团拟以所持有的公司部分A股股票为标的非公开发...
中美经贸磋商机制首次会议举行,... 北京时间6月9日晚,美股三大指数开盘涨跌不一,道指微跌0.05%,纳指上涨0.14%,标普500指数...
贝达药业:2024年年度分红派... 新京报贝壳财经讯 6月9日,贝达药业公告,公司于2025年5月8日召开的2024年度股东大会审议通过...
第114期:61.25 第11... 2025年6月6日更新:【#大V综合信号#】61.25买入(上期64.50)
国家选的幸运儿,白给3600 ... 图:Yoo Subin 活久见,万万没想到,我们国家有一个小众直给的羊毛。 国家统计局的记账羊毛。 ...
V观财报|派林生物实际控制人拟...   中新经纬6月9日电 派斯双林生物制药股份有限公司(下称“派林生物”或“公司”)9日发布公告称,公...
佳能科技:已离职监事现身员工持... 《金证研》北方资本中心 贰捌*DL/作者 夕山 映蔚/风控作为服务创新型中小企业的主阵地,北交所截至...
亿纬锂能:筹划发行H股;华升股... 今日焦点亿纬锂能:筹划发行H股股票并在香港联交所上市亿纬锂能公告称,为进一步提高资本实力和综合竞争力...
年轻人热捧的"音乐神... 这是新消费智库第2649期文章新消费导读这个新物种能否撕下"电子废物"的标签?作者:果子编辑:竺天审...
滚动更新丨美股三大指数小幅高开... (更新中)21:31 纳斯达克中国金龙指数开盘涨1.5%。21:31 美股开盘丨三大指数小幅高开 C...
降息驱动无风险利率下行 银行股... 此次存款利率下调与LPR调降呈同步性,银行负债成本下调空间打开同时缓解了息差压力。受资金成本降低的影...
关店百家,“民营超市第一股”将... 作 者丨杨坪编 辑丨孙超逸视频编辑丨柳润瑛【编者按】被称为“民营超市第一股”的人人乐宣布退市,这一“...
理性应对特朗普2.0经济政策 ... 特朗普的经济政策重塑全球贸易,也对中国增长造成挑战,中国的应对策略可以从立足内循环、强化自主性、多元...