小迪安全课程笔记-2024-十一-
小迪安全课程笔记 2024(十一)
P34:第34天:JavaEE应用&反射机制&攻击链&类对象&成员变量方法&构造方法 - 逆风微笑的代码狗 - BV1Mx4y1q7Ny
讲的都是和这个安全相关的,你今天讲的是这个java的反射的东西啊,这个反射的东西呢,为什么要讲他啊,说实话啊,这个东西呢,你要把那个反序列化的一些东西,和那个反虚化的利用呢,学完之后呢。
对这个反射就比较标记了,不过我们实在是先要把这个反射搞清楚,是怎么一个情况啊,他的一些代码实现,然后呢我们在配合这个反虚的话,那再去分析这个反射,可以说在这个java里面的这个安全的方面。
那这个反射的是很重要的一点啊,来这是他的几个截图,关于java的反射类的四个东西,我们待会会用这个相关的,它里面内置的一些函数啊,那些东西再去给他讲啊,然后呢这是网上找了一些文章啊,关于这个什么鬼。
java安全代码反射到命令执行,还有什么鬼。
这个java安全之反射,这都是关于这块知识点,也就是说他其实很重要,这网上说的是什么,反射是java程序的特征之一,它允许在java程序中对自身的进行检查或者自审,程序运行中呢,对任何一个类呢。
能知道这个类的所有属性和方法啊,对于这个对象呢能够调用它任何的方法和属性,然后这种方式呢我们称之为叫反射机制,其实简单的一句话来讲呢。
就说这个java反射呢就是官方的一个反射API啊,这里面呢有这个这个这个类库呢来组成的,然后里面包含有这个field m e t h o d和CONSOS,这几个Z,然后呢。
他对这个成员变量和成员方法和构造方法呢,信息进行编程的操作呢,我们就理解为叫反射机制,这是它的一个官方术语,也就是说我们知道什么是反射,是干嘛用的啊,就是对这些对象里面的变量和方法。
包括这个构造方法呢对它进行这个提取和操作,这个方式呢我们就称之为叫反射,那为什么用反射呢,写这句话是非常难理解的,但是你仔细想想啊,他有点绕,这个有点low啊,呃这里呢有一篇这个文章啊。
嗯这个文章的可以看一下啊,他说这个反射机制它的一个差异,一个叫静态编译,一个叫动态编译,java呢原生本身呢是一个静态编译,但是有那个反射之后呢,它变成了动态编译,这啥意思啊,这啥意思了。
来我们看一下啊,他说了,如果说在官方定义中能找到存在价值,然后呢动态的去创建和修改,调用或者获取其属性的话,而不需要事先知道任性的对象是谁,画重点在任性时,而不是变异时,不改变原有代码逻辑。
自行运行的时候,动态创建和编译即可,这是属于为什么要用到反射的一个概念,这句话的意思说大家听都听不懂,不知道是啥意思啊,完全不知道没学过的是完全不清楚是啥意思啊,好我们现在呢就给大家去说一下。
一个什么意思啊,其实呢它就是个动态的一个事情啊。
你比如说我们这里呢呃,在网上呢给大家看一下啊,来网上找个代码。
网上那是有这个图片的啊,然后我反思,我看那篇原文文章借不到,啊这也没有啊,啊这都是讲的是他的操作啊,并没有讲这个java的安全呃,这个方便的为什么要进行反射的一个操作,上面都没有。
这都是一些乱七八糟的一些操作啊,啊都没有讲这个为什么反射,其实他为什么反射的原因呢,就是刚才说的东台金台的这个差异,我看看能不能找到个类似的文章啊,都找不到。
你们在说哪里啊,什么内存嘛,怎么扯下来了呀。
我们讲的开发啥是跑内存嘛,那那边去了呀,搞错了啊,你搞错了地方啊,没说那什么啊,我们是说上节课那两个两个的那个叫什么呀,呃一个是那个监听器,还有个那个过滤器呀,那两个呢涉及到内存码的一些知识点啊。
老和他提了一嘴,但不是说我要讲内存嘛,你想啥呢啊,那个内存嘛又不是我们现在讲的事情,把这个和网站这操作都没搞清楚,咋讲的意思嘛,去了,是吧,我不是这个不是这个这个是我发上去的额,这句话怎么理解它啊。
这个为什么要进行这个反思啊,他是情况是什么意思呢,就是说你在这里呢,原本的话这个java呢你需要把它先编译,他的人形呢是先编译,这里有张图片啊,来大家可以看一下这个图片啊,先便秘一出来之后呢。
它成为一个class文件,就是它原本的代码文件呢是点java,就是我们这个IDE里面写代码都是点java,然后在上线到项目的时候呢,把编译成这个点class,也就是说你写好的。
像这里面不是还有一些变量吗,你看这里有这个string name是吧。
有些变量,还有些这个前面的这个是私有还是公有是吧,还是保护三种类型,然后呢他会把这些东西呢封装到这个class里面去,是吧啊,然后上线。
然后这个反射的会做出个什么事情呢,啊那有反射之后呢,他就能尝试性的在任性的时候呢。
把这些值呢给它改变,这就是那反射的存在意义啊,其实就是说在不修改原本代码的情况下,面对这里面的东西呢进行操作,这个就是反射就很简单,如果说我们邮传代码写到里面去之后。
我要对里面的这个变量的值和方法进行修改,改名字也好,或者说对值的内容进行修改也好,那么都需要到这个里面去改,而现在呢有这个反射之后呢,他就可以通过代码的这个在运行之后呢,对它实行更改。
而不需要说我就在你这个本身的源代码修改,然后你再上线就是个编译过程,所以这个反思呢就是不改变原有的代码逻辑啊,自行的去运行,然后呢他这个操作呢是在任性时,而不是在编译时,因为你如果在源代码中修改的话。
那么就是编译时啊,那么在另外一个文件里去调用的话,那么就是在运行的时候,那那个文件被调用呢,那表面代码那才会被修改,这句话完全有些人是完全不能理解的啊,我也不知道怎么讲这个东西,你才能理解嗯。
这是他的一个场景啊,为什么要学他场景,你只要记住把这个东西学会,在后面的时候呢,学会利用它就可以了,至于说这个东西为什么要这样去用啊,你不管他啊,这不是我们操心的事情,他的这个有两个场景。
开发场景呢我们就不写了,这是网上随便抄的资料,主要是这个安全场景,为什么要去讲这个反射,因为在这个反序列化里面,包括后面去利用这个漏洞,那个payload p o c的一些写的一些问题。
上面全部是和这个反射有关啊,全部是跟反射有关,那反射是干嘛的呢,就是对啊,原有类里面的变量方法和构造方法进行编程,就对里面的进行赋值或者是调用或者是查询,这所有的操作都属于叫反射,那么学习他的意思就是。
能够对其他类里面的东西来进行操作,从而那我就可以获取其他类的一些东西,来为我所用,他的一个利用呢啊这是他情况啊,我们这里那就直接开始讲了啊,直接开始讲了啊,然后我们在讲的同时呢就来看啊。
首先呢我们来把id打开啊。
卡的很,嗯这个咋回事啊。
这里怎么打不开呢。
结束一下。
先把代码搞清楚啊,后面呢再思考那些游资为业了,你没有做过开发,有东西那是没办法理解的啊,那是真没办法的。
我们新建个项目啊,名字呢我就叫这个叫R1,R1F1L对吧,这个呢就是我们说的那个房车那个那个名字嘛,是吧啊,然后呢这个那我随便选了这个,因为这个是纯教的啊,要不要他有这个呃这个啥这个这个这个代码呢。
web代码呢也无所谓,因为我们也用不着用,用不着它啊,用不着这个东西,要不要这个web的代码呢都行啊,好把这几个东西都给删掉,这什么MOVN的,这是那个MOVEN的那个仓库的东西,这个不重要。
我们把它删掉吧,大把他搞简洁一些,然后这个SRC里面的这个主程序这里啊是吧,这里有个这个hello,我尾巴删掉,因为要不要他的无所谓,我们主要是在这里操作啊,然后呢创建一个类啊。
这个类呢我们名字就叫做这个user,然后在这个里面呢我们定义一些常见的东西,就是这里是个类,这里面呢有很多数据和方法和构造方法啊,什么是成员变量,什么是成员方法和构造方法呢,我给他说一下啊。
首先呢我们先来说第一个啊,这个啊变量啊,你看这里有public是吧,变量string类型的,而name呢我们就把它是吧,写个叫小迪吧,对不对好,然后呢再搞这个变量是吧。
然后呢搞int类型的也是搞个public的啊,int类型的这个A级啊,呃年龄是吧,搞个31岁,对不对,然后呢,我们这里说一下啊,他这里面呢有几个这个有几个这个属性,大家要知道的啊。
这个public呢代表是公有属性,公公共属性,然后还有几个像这个什么PRN啊,这个是私有属性啊,我比如我这里呢再搞个是吧,GND啊,性别是吧,性别呢也是个string类型的,我大小写注意一下啊对吧。
string类型的,然后呢他等于什么呢是吧,有人肯定说他等于gay,他是个gay啊,那肯定呀他不是gay,他是个man是吧啊,这个男人对不对,你看啊这个地方呢我们写了三个属性,那有这个public。
有这个这个属性,对不对,你这里那还可以搞个属性,比如说我搞个保护属性,保护是保护属性的,对不对,也搞个string类型的啊,再搞个什么呢,性别年龄名字还有个什么鬼啊,还有个职业职业就搞个脚步吧。
工作好吧,就是这个SEC嘛是吧,10S好吧,这个ACC安全哎我的英文也不好啊,见谅啊,好然后呢这是他几个这个东西呢,我们就称之为这四个东西呢,我们就称之为叫成员是吧,成员这个变量啊。
还有一种呢就是成员方法啊,我们在生命中的public是不是public,比如说这个叫user info啊,嗯然后返回值选优质音符啊,历史啊,历史啊,这个脚步等于这里面的参数值,然后把这几个都写进去啊。
这个内蒙等于内蒙啊,等于内蒙,然后这个历史点GN那就等于这个GN了,都把写一下啊,把四个都写进去啊,这个代码呢其实就是说我们先把它模拟写一写,就这里搞一些成员在里面,然后这里传几个参数是吧。
有群内的参数仪,还有这个INT对吧,NT1的参数的嗯,A级还有string,真的这个,DN是吧,还有第四个参数分类型的嗯,这个就不把把都把它写上去啊,然后呢这个点那就无所谓的啦。
就等于这个值嘛是吧嗯这个值,还有一个啊,还有一个是这个年级意思点A几啊,等于A级好,这是一个公有的啊,公公有的好,我们这里呢再搞一个这个另外一个啊,这个是个那个啊,然后呢你看啊,我们还可以搞一个呢。
这个东西呢就自己去随机弄了啊,这个东西就无所谓的啦,啊这个就无所谓了啊,没意思,随便写了啊,也可以直接输啊,这个就搞个无参数的,就直接输出吧,你猜,好再搞一个啊,这个名字呢就叫和这个前面的这个名字呢。
是一对应上的啊,这个搞有参数的DOLM进去,然后呢这里呢就输出这个内幕输出name,啊这个呢就是有参数的,好老的,这里呢我们再写一个啊,还搞两个参数的一个string name,一个是年级INT的A级。
那么这里呢我们就输出一下name,并且呢再输出一下这个点几A几啊,好这个呢我就一个是搞成这个public,一个呢就搞成这个类型啊,pr这个啊有这几个东西之后呢,基本上啊我们就可以这个进行操作了啊。
我们就可以操作了,然后这里有个报错,哪里有个问题啊,少了个return噢,这里有个这个string类型啊,那这个不写它吧,不让他这个返回,CORD1档,嗯可以好,这个呢就写好了啊。
我们来给自己呢看一下啊,这个呢就是相当于是在一个类里面呢,啊这个类里面定义了一些这个什么名字呀,年级呀,性别呀,工作呀这些事情呀,然后里面有一些方法啊,刚才说了这个是成员变量,然后这个呢是什么呢。
这两个这三个呢这个名字同样的呢,我们称之为叫什么叫构造方法,还有一个呢像下面这种自己命名的这种东西呢,我们就称之为叫成员方法,就是你自定义的这种东西啊,还有一种呢就是我们说的这个构造的啊。
还有各种各样的一些东西,那这个呢我们也可以再声明一个组了,这个呢换成这个PR1号楼的,然后呢这里呢换成个叫user,要加个user in啊,就这name嘛,就叫个UZS,然后呢这里呢就少写两个啊。
就搞个类目和新币就可以了啊,有点这个差异就可以啊,啊这个呢我们就是成员方法,上面这个呢是构造方法,然后呢这个是成员变量,好把这个搞清楚之后呢,接下来啊我们来主要来开始学这个反射了啊。
这个反射第一个拥堵啊,就是说的一个叫反射Z获取Z的一个值。
这个什么是Z呢,它有四种方式获取一种呢是这种方式,那这个是啥意思呢,就是说如果我现在要对这个对象,这个users这个对象里面的值呢来得到的话。
我先第一步要得到的就是,第一步要得到的就是这个类,就这个user类如何得到它,就是有四种方式得到它,我们来说啊就说啊很简单,现在呢我们按照这个事来呐,现在我们这里写了这个Z是吧,这个user l对不对。
然后它里面是有这类信息呢,有这个有这个信息,然后呢有这个方法是吧,有这种东西我们要得到这里面的东西,那么首先是先要来到这个地方来是吧,先来到这个地方来,然后呢一步步往下面进行嘛。
哈那来到这个地方来到这一步呢,我们是先第一步啊,就是说得到Z啊,先得到这个Z,后面那才是这个类下面的这个什么,这种成员变量的组合勒,再也是我们说的这个构造方法的组合类,再是我们说的下面的。
还有一个那个成他成员成员方法的类,这种是方法啊,这个呢是这个变量是这个意思啊,那么现在得到第一步就是这地方啊,如果得到呢,我们先创建一个文件啊,名字就叫get class,就要get class。
然后如何得到它啊,写个主函数,然后这里呢呃如果得到它呢,它有四种方式,第一种方式就这种啊,来给他写一下啊,就是叫大写class点for name,这个呢大家应该有时常相信。
这个呢就是一个获取class的名字的来源,然后呢选择这个呢user啊,选择它复制路径来引用下载了,然后呢这里有个报错,把它进行一个容错处理,写上去自动填上去,然后呢这里有个叫什么。
添加个局部变量来得到它的值,这个呢可以去掉好,这个就是a class,这就是呢获取他的Z啊,获取他la,然后呢我可以打印一下给大家看一下啊,a class好,我们看一下这两个运行下啊。
那他就获取这个名字呢,就是这个类呢class,然后呢com excel呢user然获取了这个类,这第一种方式啊,这第一种方式,一种方式,那就是我们做的这种比喻方式,直接,这种啊搞错了。
我们先讲这种根据这个权限内米啊,直接得到这第一种方式好。
我们再来看第二种,第二种呢就是用这种方式啊。
直接根据类名呢来获取,第二种,根据类名类名加class,然后如何是类名呢,这个地方就是很简单的道理啊,就直接写这个名字,那他这里的名字叫user,我们就直接写就可以了对吧,别user了。
点get class,得写好,我这里呢写个这个结束值嘛,好名字就叫这个user class,然后呢我们可以把这个user class呢进行一个输出,看一下看一下啊,它是不是等于这个。
是不是等于这个来你看第二步也获取到了是吧,这第二种方式啊,这第二种方式还有呢,第三种方式获取这个类的这个第三方式啊,一个是用这种方式啊,获取这个类,把这个类获取到,他要先获取了,后面才能操作它。
你不要说我直接知道他是这个地方嘛,我还获取他干掉啊,是的啊,他这个地方是先把它获取过来,就得到这个有个这个类返回回来之后,你才能操作这个类,知道吧,因为这个返回这个东西呢,我们这样还操作它。
你先把得到你才能操作,不是说哎呀我知道这个名字就可以了啊,不是这样的啊,是要从这里得到他的Z,然后呢你再对这个类的这个东西呢进行操作。
是这个情况啊,你不要搞错了啊,好第三种方式啊。
根据对象来那个,然后这个呢就是多了一串代码,就是说先呢啊创建一个这个这user的,一个就是这个啦。
先创建这个new啊,谁创建个new,那交这个user了。
然后呢一个new对象把你对象new出来换对象,然后呢他再用这个对象的名字user点class,这小小的这class呢获取这个对象,这里呢再接收个局部变量啊,那直接局并非要接受,那这里名字可以取掉。
也这个叫a class1,然后呢我们再输入下a class1看下啊,嗯我们看一下来执行,你看第三个啊,他是也能获取到,哎这怎么还有个获取个无参数出来嘞,哦哦这个无参数是我们这个地方写的。
在哪写了个东西在这里对吧,他把那个user给他打印了啊,来这里,就这里在创建的时候那个情况啊,嗯把这个去掉下吧,这无参数我不无参数,就是不应该打印,就没啥都没有啊,这里好。
这是第三种方式啊,然后呢呃这个第四种方式啊,这个类加载器的这个地方式,这个方式呢稍微有点小复杂,哎我们直接给他看一下吧。
这个代码啊这个呢用的最少啊,一般用的最多的就是第一种啊,这种是最多的啊,下面两种呢用的也不多啊,这种呢就是说直接通过这个东西去获取的啊。
这种第四种方式看他的写法呢也比较简单的。
那直接得到,先用这个东西呢直接写得到之后呢,把这个全路径加上去,加上去呢得到这个值就可以了,呃也没啥啊,找多一场代码的事情嗯,反正那个这种呢一般用的比较少,用的最多的就是前面几种,前面一一种用许多嗯。
这报错了,报了个什么错误啊,哦这个名字错了啊,这个路径写错了,路径是这个路传出去,好这样可以了,好了四个都能获取啊,好这个就是第一种啊,获取Z,那么也就是说我们现在呢就获取到这个累了。
又来到这个地方来了啊,那么接下来的话,我们就要对它下面的东西来做事情了啊,那么先做哪个事情呢,我们先讲对它的成员变量来做事情,那么成员变量做事情呢。
我们先了解一下获取成员变量的几个方式。
什么叫成员变量呢,刚才说了,这个就属于成员变量,就像这里的定义的这个这个这个名字啊的,比如说lemon a g g e n d e r job,这个就属于成员变量,这属于成员变量,就是里面的成员变量。
然后成员变量里面有子嘛,有这个public的公公公的,还有这个什么私有的,然后还是por protect,就是保护的啊,三种啊,这种三种方式对象都有三种啊格式,那这个东西呢大家自己可能下去要查一下了啊。
这不是我们要讲的啊,这是基本的一些对象的三个属性的东西啊。
然后呢额这里呢就是我们说的那个三个东西啊。
那么接下来我们是如何通过这个反思呢,获取这三个值的啊,要获取这个成员变量的一些东西的啊,那么接下来啊我们继续去写一个啊,叫做get啊,取个名字叫FIED是吧,好然后呢用这个文件来继续写啊。
首先第一步啊我们来看一下啊,先来获取这个第一种啊。
叫获取所有成公共成员的变量对象的数组,啥意思呢,好可以写一下啊,这个先呢用这个class for啊。
就先把这东西拿出来,他不是先先要获取这个东西吗,先把拿出来来,先用这个东西把它拿出来,先要得到啊,把它得到这里填个报错,先获取这个地方的啊,得到个a class,然后呢再对A点class。
A class,点什么get,你看source第一个啊。
第一个是获取所有公共成员变量的对象,数组好,这是啥意思啊。
我们把它写上去,写上去之后呢,给一个这个赋值的地方,引用局部变量等于这个值啊,是一个数组啊,返回的数组叫files,然后呢我用for循环把它把它写出了for,然后salt啊,名字就叫FD啊。
冒号FIDS,就是把这个FIDS里面的值依次给到FD,然后呢再依次打赢下FD就可以了,看下B好,我们现在来看一下啊,运行一下,看什么东西啊,看一下啊,大家看到没。
public public int a级类目啥情况,public lion和起来,我看这边我的两个成员是不是就是public的string name,public的英特尔的A级啊,你看int类型。
java类的string类型呐,这是前面的这个包的名字吗,包的指向,然后后面是一个级,这个是name是获取到两个public呀,为什么获取public啊,名字是返回所有公共的。
公共代表的是public的公共public,它的成员变量的对象数组,然后从里面编辑出来,是不是就是这两个啊。
这不就是这个name和A级啊,是这个情况吗,你看好,那么接下来呢我们再来看这个呃,他的这个什么另外一种方式。
那这个呢白进行一个注释。
他是一个什么情况,哎大写一下啊,这个是获取什么,这个是获取什么,获取公共的,对不对,这个是获取公共的层变量,还有一种就是我们说的啊,获取所有的变量,那么获取所有变量,那就用这个了,叫get d开头的。
返回所有成员的对象数组,啥意思呢,来把这个代码呢直接剪贴粘贴,copy copy一下,改一下一个函数就可以了啊,把这个地方改成什么,Get default,第一个改成这个,改这个之后呢。
再把它进行一个遍历,我们来运行一下,看一下,现在,那看出四个啦,poker p r o t e c t和PRVVICT,那里面的GEI和JP是不是获取到了呀,那是不是这两个这两个一个是私有,一个是保护。
是不是也获取到的,也就是说呃这两个一个一个这个get f开头的呢,指的就是什么获取公共的啊。
注意一下啊,来在获取成像变量的啊,这个呢是获取公共的,这个是获取所有的啊,然后两个值的不同之处呢就是多了这个东西啊,注意注意看一下啊,懂吧能理解吧,好这个就是说获得了他两个这个相关的东西啊。
好那么接下来呢我们再看啊,他还有吗,还有两个呢,一个是获取单个的,获取单个的和获取单个成员的变量啊,这个是获取单个公共的,那个是获取单个成员的啊,也是不一样,啥意思啊,你看一下啊。
那个注释一下,接下来就是说这个获取单个的公共,那嗯这个成变量,那这里呢额如何写呢,来看一下啊,这个就是单个了,他不是数组了,他的返回呢也看这个代码中也是的啊。
前面这个是呢数组的返回的啊,然后这个呢是返回的,不是数组,所以这里呢我们就直接这样写。
直接先把这个代码写出来,就是get face,然后get什么呢,直接获取呢,这个直接给就可以了啊。
你看前面这个有S的是返回数组,这个没有带S呢,后面加上一个类,这个类目值呢是什么,你看他写的是很清楚啊。
是一个string name,是啥东西呢,啥是啥东西啊,在哪位呀,这个东西咋弄呀,我们先把它写一个啊,呃这个name写啥呢,String name,这个是写啥呢,比如说我现在写个比如说我写个GNER。
G n d2,写个GNDR啊,然后呢这里呢用个东西把它写进去,等于GNN比二,然后呢我们打印下来打一下基因点量,这是他那个对象的那个参数值啊,那看这里有个这个报错是吧,报错那我们把它看一下啊。
好来看一下能不能行啊啊,先获取下那个GNDR,他报错了啥情况呢,这个报错是什么情况,然后你再换一下啊,换个name看一下,换这个name看一下,嗯好name目出来了。
来public那user name name,然后类型是那他获取单个嘛,获取内容的这个类目是啥,其实就是获取这个了,有这个东西啊,它会有这个东西,为什么刚才GN不行啊,为什么,因为这个是获取公共的。
我这里的GNDR是什么私有的,你获取不到,所以啊这个是获取公共的,如果你要获取私有的,这也把单个的成员变量换成这个,私有的啊或者私有的,你看这里我换成什么这个GNDR,那么这里呢就要写成什么函数啊。
前面加上个D选这个函数,那你吗,那就这两个函数的加D的,就是里面都有没有加D的,就只搞公共的能理解吧,来我们依次把它打一下,看一下是不是对的啊,一个是获取公有的,公共的一个呢是获取这个私有的基因。
那这个获取到了啊,没问题,那public一个public一个PRAFT私有的好,这个就是我们说的第一种啊。
然后呢这只是获取它几个值,后面还有一个呢它还可以怎么样对值进行复制,对值进行复制,获取获取值都可以,然后呢他是如何去复制和这个获取值的呢,对不对,你看啊,他说这个狮子这个值是吧,那我这里有个对象啊。
什么鬼对象的值是吧,就是说你获取到这个成员变量了,你还可以对它的值呢进行修改,可以得到它的值,也可以修改它的值,就是我们说的一个是获取值,一个是复值,这其实我们获取的最终原因,其实就是为了做这一步事情。
就是你获取到肯定就是,无非就是要么得到你们的数据,要么就是这个把它值呢给大家重新再搞一下,就好简单,我们现在呢他这边的这个里面的值呢。
一个是小迪啊,30几啊,什么man啊,SEC是吧,我是不是能够把这个只能给它进行一个获取,或者说尝试把他这个更改呢是吧,现在呢怎么说这个事情啊,嗯这个代码呢其实我都写到这个里面去。
大家都可以看一下,来就是复制和这个操作啊。
来,大家看一下啊,首先声明一个类,然后呢这里的呢get failed得到这个A级,然后seat啊,属于设置这个呦,然后呢这边呢是一个是get,这个是设置一个呢是得到值,我们呢以此来给大家去讲一下啊。
好我们先把这个去掉,大家看一下啊,我们先看一下这边的啊,那这个代码呢就是先创建一个对象啊,然后呢用这个get fighter,这个呢是获取这个A级,这个A级是公共的,再用这个公共的呢怎么办啊。
get了啊,公共的啊。
来看下那个图片呢,get啊,直接加上对象,获取它的值,获取谁啊,获取这个U的,然后呢复制给这个对象A。
然后呢再把A呢把它输入出来是吧,这个倒是获取啊,获取获取的是这个公共的,后面变量,A级的这个值啊,那我们运行一下开始好不好,那已经出来了啊,哎31是吧了,大家看到没答案,一三十一呢是31得到了。
怎么获取的,那先创建一个这个对象,然后呢,从这个前面的a class里面那去得到这个A级,这个前面得到了嘛,这个是获取单个的A级的东西嘛,然后呢对A级里面这个U呢进行获取对吧,然后如果说赋值的话。
赋值这该怎么赋值呢,啊也简单,那set然后对象加上你要值。
那你看啊我们怎么做啊,我们怎么做啊,来直接用这个啊,讲file,点S,然后呢设置它的值对象是U,把它设置为34号对吧,然后呢返回的是VOND。
我们可以进行一个接收。
电动机啊叫AA,他好像不是这个,他这个是有N个第一啊,对象获取值。
也是可以用这个东西啊,他应该直接设置了之后。
那边就有显示,不用返回,啊这直接设置为30了啊,你看啊我先在这边呢输出这个值之后呢,我们等一下呢再从这里呢再输出一下看一下啊,就说一个是设置词,一个呢是一个是负值得了值,一个是这个值啊。
然后这边呢我们再获取次看一下啊,你看我这里的设置好之后啊,再获取一次,这个是设置啊,前面这个呢get是获取它的值,然后这个呢是设置这次和这个,不过还是等于这个值啊,它等于这个A的啊,这不行。
我们可以调一个方法来把它进行一个查看啊,这个是要在这里面去把得到一下,从重新获取式啊,这要重新获取式,因为这里设置值之后呢,我们要又要重新获取式,再获取是叫AA,来打一下AA,放在。
啊一个呢就是获取一个呢就是我们说的这个,那你看现编的啊,你看呃下面这个呢就是我们说的啊夫子,然后上面这个呢是获取值,这个很简单啊,那复制之后呢,把那个对象里面的,或者把它设置为32啊。
当他再去获取这里面的值的时候呢,就变成32了,这个A级呢就变成32了,因为它都是从这里面读的嘛,上面这两个呢就是有的啊,那这个呢是取它的值,椅子,啊取这个A级里面的啊公共的,那么如果说不是公共的话。
那就把这个改一下就可以了,就这里改一下就可以了啊,好这个呢就是关于这个啊成员变量的操作啊,成员变量里面的获取,包括对值的操作,那我们就讲到这里好。
接下来让我们再看第二个啊,第二个就是关于这个它又不是有三种嘛,呢刚刚讲的是failed class也讲了啊,class就获取到所有FIED得到也获取到了,然后呢还有这个第三个。
这个就是我们说的构造方法啊,就这个获取构造方法,什么是构造方法啊,来取个名字啊。
叫get把构造方法的这个名字呢给写上去。
Constant,Are u c t r。
下去,然后呢一次一样道理啊,也是按照刚才那个套路来,基本上就是大同小异了,无非就是函数名不一样了,首先呢先把这个东西写上去啊,我们从高程序先获取类,好获取类之后啊,接下来看一下啊。
我们第一步啊用这个东西呢,它获取属于公共的,那么就是这里面写啊,A class a class,然后点get小的,然后呢选这个,然后呢这里呢就直接用这个东西呢来接收啊,也是一样的道理。
这都几乎都是一致的,没有什么太大差异,然后呢对这个东西要进行一个for循环,获取他的,Z o n,刚才里面的CCO了,然后冒号cn fast对这个co的进行打印对吧,然后这个呢是witch什么呢。
我们先把它运行起来看一下啊,那public里面获取到user java long string和一个也叫user的,然后你看这里啊,我们这个类里面是不是有两个构造方法呀,一个是user,一个是这个。
那么还有一个是PRIVE,他会后没获取到啊,没有获取到,那么你可能会问这下面还有一个public啊,那咋不行啊,这个user咋不行啊,因为这属于成员方法,它获取的是构造方法,构造方法是什么呢。
就是构造你一个对象里面的东西的,它和它相等的,而这个呢是属于它的成员啊,不一样的,所以这个呢获取到的就是什么,获取到的就是公共的,各位打call,对不对,然后下面再看啊。
再把那代码一复制1CTRL加A方,黑加V,这个地方一改,改成个D开头的,那大家想都不用想了,这个是啥啊,你们说是啥,获取的是啥,对,对不对,就包括公共的来把这个14加个D的函数,那就和刚才几乎差不多。
因为原本的这个东西呢大家都理解了,我所有的,那你看是不是现在就出现了三个了,这个PRV是不是也出来了呀,这格式呢里面的呢一个第一个参数,string类型和个int类型的,那我是不是这里的。
这个看是不是这个那name和背景,是不是这个三个都获取了,是是是三个,对不对,然后你可能说这个user info和这个user啊,怎么没有啊,因为这个不属于构造方法,这是成员方法啊。
它使用方法不是用它来获取的啊,那我这个呢就是获取的所有构造方法好。
还有什么是获取单个构造方法的呀。
那这个就简单了。
对不对,那这个就简单啊,来来一些r a class点嗯。
嗯获取到单个的,那就不用加S的,就是的吧,就这个吧,对不对,然后这里有个说一个类型啥意思呢,这是什么意思啊,是这样的啊,你比如说我写个STR点class好,我点个string class。
然后呢把它复制一下啊,引入局部变量哎,来引入这个局部变量,然后呢打印一下constant,来大家看一下啊,我用这个,用这个来异常,把接下去获取个string class,这啥东西啊。
后面加上类型是啥意思啊,你看啊,这个呢是获取单个的这个类型是啥意思呢。
其实就是看里面正里面的。
哪个是符合这个类型的,你看哪个是啊,是不是这个来string name的,这个因为它只有一个类型,这个有两个类型参数里面一个name和一个级啊,这个呢啥都没有,对不对,所以他这个呢就是获取的是这个的。
来我们试一下,看是不是这个意思,那就是获取这个了user选类型,而同理啊,如果你这里写两个来写上,还有个后面什么int点class,对不对,然后名字改一下,叫CON100CN一,那么也是一样道理啊。
要获取两个参数的,哎这里也报了个错,报错他说什么,这为什么报错啊,大家知不知道为什么报错啊,来这为什么报错啊,来获取这个string class和int class的,为什么报错啊,因为它是私有。
那么私油该如何解决它呢,是不是用到这个D开头的一部围了呗,是吧,用这个呀理解了吧,那用这个再来看一下是不是就得到了嘞,那出来了吧是吧,哎这个是不是获取到了,所以这种方式呢就是我们说的啊获取单个的。
然后这个呢是获取,单个的这个公共,然后这个呢是获取这个,单个的构成方法啊,就不分这个公共的啊,这个是公共的,这个就不分了,好这个就是我们说的这个他的第二种,然后后面呢还有一个说是这个什么鬼。
用于创建对象的方法来,是什么意思呢,这个是啥意思呢,其实就是说我们可以呢操作这个构造方法呢,给自己呢再创建一个,知道吧,就说我们可以让自己装一个,刚才那个是对成员变量赋值和得到值啊,这个呢是中间的。
然后呢嗯这个创建呢说实话呀嗯怎么说呢,嗯可以给他看一下啦。
这里呢还有一个东西也给他说一下,这个是对那个私有的东西呢进行操作啊,我们这边写上去吧,然后这个是对私有的啊,我们对他进行这个操作一下啊,看着啊,这个就是那个写的那个东西啊,也没有啥。
就是在这里呢用这个叫6S装啊,对它进行一个简单操作啊,然后里面赋两个值,一个是叫小迪,一个叫三石,对吧啊,对那个UU呢进行打印,也没有啥啊,这边呢就是我们说的那个叫对他的那个对象呢,进行操作啊。
然后这个是string class和英特尔对象class啊,这个呢是获取了私有的,那获取的呢再用这个东西是干嘛的,好,我先不写它,看一下,对这个代码也需要大家理解一下啊,因为我们刚才是获取值。
但现在是要操作值了,这不一样的,然后这里有个好,这里写错了啊,重新来一下,这个还容错,还没写,好来晕一下啊,他报错了,你看他还报了个什么错误啊,跑啥意思啊,私有的为什么呀,现在这个呢操作是对什么。
这个操作是干嘛呀,是对构造方法,进行一个盘朝左啊,他的构造方形朝左,就是我们说的这个地方。
看这个图片,对这个构造方法呢去创建啊,然后下面这句话是什么,因为我们现在获取的是string class和inter class,是属于这个里面的。
它是属于私有方法,我需要强制性加上这个语句,这语句是干嘛的,这里是干嘛的,让他临时的开启访问,八的设置出,然后呢,你在里面的去给他搞一个小的S1,SRC和30号,然后呢,我们在这边呢。
可以尝试性的把这边修改一下是吧,就这个嘛把它输出,对不对哦,我们来试一下啊,来运行一下,这里,你看啊他的一个输出结果呢,就变成了小DSEC和30,看到没,是不是我就对你们值进行更改了。
我操作的就是这个地方的呢,它里面是要输出内蒙和A级呀,然后它本身的内蒙A级是等于什么,是等于小迪和31呀,我在这里把改成什么小迪SZ和30,比如说我把改成什么小DGG是吧,改下的GG。
然后呢明年年给他改40,对不对,40岁成为gala,还怕输出YU呃,那在里面操作的,你看啊,这两个是上面这两个,我先把这两个把注释掉,避免产生影响好吧,你看啊他是一个什么情况来把它运行起来。
你看他就输出小李给K40啥情况,这句话可以把它补输出来,我把这个地方把它这样去操作啊,对他的这个对象进行操作,你里面东西都改了,把它里面复制两个值啊,是吧,因为他要输出这个,这不是他东西吗。
他要输出这个name和A级嘛对吧,私有的,我要教这个东西,是不是这里用反射调用了呀,调用这个对对应的方法了呀,它的构造方法怎么调用的,大家应该看到了吧,刚才,是吧嗯然后呢。
如果说我现在呢要调用另外一个该怎么写呢,那我刚才调的是这个是吧,假如我现在调用这个了,调这个啊,这个是输出名字的指数名字,我调用它,我调这个干什么调用啊,大家想一想啊,我现在调用的是这个。
那我调用这个该怎么写啊,也简单吗,来给他调用一下啊,啊这个是调用的是两个参数的啊,这是一个两个参数的,就是一个string,一个int的这两个好,那么现在呢我们再对它进行调用。
再比如说这里面一个是一个参数的,就一个STR的,好那这个呢就是另外一个了,那该怎么写呢,也是一样道理呢,写一个出来,好这里就不用写这个DA开头了,直接写这个就可以了,因为那个是公有的是吧。
string class就完了,对不对,然后这里的意思改掉,这里呢就直接写他就完事啦,什么都不用写,这里赋值都不用付了,直接用它这个东西呢,COUNTRINSIDE把它这样写就可以了。
这个写不写都无所谓,因为这是对象啊,写不写都可以来两个参数,一个参数嘛就把改成小的gay,对不对,那你看一下是不是啊,那就调用这个嘛啊我OK那为了确保起见,我这里要多打一个好吧,我的名字。
那避免呢有人说不是他对不对,我写个我的名字,对不对的,是这个吧,public的啊,我调用它啊,看是不是调用它,现在用这两个东西,那还是调用它,对不对,看一下啊,他是不是答应我的名字。
那是不是我的名字对不出来呀,那说明是不是调用它呀,为什么,因为只有一个must去内蒙又写错了,对不对,那这个就明白了呗,就是对这个构造方法的获取,包括数据的操作就清楚了呀啊好,这个就是我们说的这个没。
这是我们说的这个这个什么嗯,第四第二个啊,对这个构造方法。
那还有成员方法吗,啊最后一个采用方法啊,都要讲完,讲完之后呢,我们再来思考安全重点啊,哎呀我说这个蛮麻烦的,你做这个讲东西呢,不讲也不行啊,我就这么难听,也听不懂讲了。
那也不知道是讲啥玩意,讲了有什么作用,唉真是尴尬呀,这个开发就是这样子再创建个啊好了,学完之后呢再思考这个问题啊,现在不操心这个事情,好is啊,这个是获取成员方法的,然后呢我们再来搞个获取这个。
怎么这个,成员方法啊,刚才获取这个细啊,构造方法,然后呢实现在在获取这个成员方法的,成员方法呢,就是获取这里有什么这个有什么user info,user对吧,一个是public,一个是保护的,拿两个哈。
嘶然后呢我对它获取如何获取呢,也是一样道理啊,cos点什么get啊啊,第一个是这个get mom s,就是获取公共的啊啊赋值嗯,前面呢加上个九倍量,对不对啊,依此呢用这个for循环啊,简单是吧,都简单。
哎呀说实话呀,我是真不想讲了,没办法呀是吧,呐这个就是我们说的啊,七八运一起来看一下啊,呐大家看到没,这又是新的东西了,来这啥情况,出了一大堆3000块,你看啊他获取成员方法呃。
成员方法的这里要注意的啊,获取所有随的方法,包括继承的啥意思呢,就是内值的。
它也有内置的,也有,你看除了我们本身自己写的,我们自己写的哪一个啊,是不是user info啊,这是我们自己写的这个第一个是我们自己写的,后面的什么这个white呀,什么write呀。
还有什么EQLS啊,什么truth string啊,哈奇code,这不是我们的,压根就没有这啥东西啊,这个是他那边的啊,就是内置的啊,其实就是内置的一些方法,就好比当我们在这里写这个东西的时候是吧。
你可以看一下啊,怎么勾引上点一下呢,alt excite是吧,这里有呢有一些常见的是吧,这是常见的,你看对吧,它类值的啊,是这个意思啊,所以他连这些东西呢他也获取到了哈,然后就到了。
所以这个呢就是它和刚才有的不一样,刚才获取系啊,构造方法呢没有这些,但获取成员方法的时候呢,这个第一个函数那能获取包括基层的水成分法。
如果你不想太基层的,你就直接写这个啊,得加S的,我这就说一下啊,这个他的一个概念,这个是,获取包括医生的,这个公公,这个是这个低一点啊,啊再来写下面一个啊,哎下面这个呢就直接粘贴复制啊。
这个改一下名字啊,这个B开头的就这个啊,然后把打印打印啊,还有这个啊运行,哎他就获取两个,一个是我们的user info,一个就是UZS,包括这里UZS的PO的这个属性的保护类型的,它也能够获取到。
public的也能获取到,这就是我们原本自身的这两个呀,来首选方法,一个是这个这个user input,一个是这个users,对不对,是不是都能获取到来,对不对,这个就是我们说的啊,或许不包括继承的啊。
不包括继承的作业,请播放,嗯这个就是我们的第二种好,我们来看第三种。
第三种呢就是获取单个的哈哈,那单个的也简单的把单个的A克拉斯是吧。
点get不加S的。
就是的吧,是单个单个呢后面呢要写这个类型和名字,啥意思啊。
就比如说啊我们这里呢要告诉他user info或UZS,比如说或者UZS就想去还要写两个参数啊,刚才的只写一个参数,写个名字就可以了,但这个不一样啊,写个user,然后呢后面还要写成什么。
还有后面类型是什么string类型的点,class要这样写才行,然后再给个局部变量,这时候选单个,嗯就这样写好了啊,这就是获取单个啊,嗯再打一下,这个获取这个UZS,这个是获取单个的写法。
我们把单个搞完之后呢,嗯你就自己下去再操作吧,那报错了,表达是非法访问,哎呀这也是一大堆各种各样的一些问题啊,为什么非要让我玩,大家应该知道啊,这个是为什么,啊有人可能说哎呀他是私有的私有的。
我就知道有人这样说,那我帮人下呀,对不对,我把你加下来,我写个D开头的,那这次这可以了吧,来运行一下,要优势,The sfm,我,唉所以我们就说呀你有些东西啊,你不能老这样想啊。
这个是那个获取那个users来给看一下啊,这样就获取对了,而且你看可获取试用时呢,这里又报了个错误,说这个什么鬼,user是string类型不对,啥情况啊,他是有十圈,还有A级,还有这几个呀都有啊嘞。
这里有几个雷姆和GNN都有啊,我们呢只写了两写了一个呃,这个地方呢有两个是吧,谁说了,这后面还要加上个string class呀,这样才对呀,这样就能获取到了啊,这地方要注意一下哈,那下面就获取到了哈。
那哪个就不说了呗,这个就是获取这个,单个的啊,那就不说了啊,你如果说要获取这个的话,那也是一样的道理,那获取这个user info的话,那后面就得多写几个是吧,一个string class。
一个inter class,一个string class,一个string class写进去,把名字写上去就完了啊,这个呢就改成那个就行可了啊。
好这个呢就是它,然后这个呢有个比较重要的一个点啊,它有个叫object的一个创建对象的一个方法,能够用这个INVOK1来干嘛呢,执行任性方法啥意思啊,就是说你可以用它来进行任形方法,那该如何操作呢。
任性方法就说把它进行一个调用韧性,第一个参数呢是object调用该方法的一个值,那我们呢给大家说一下,第二个呢是参数的,全是没有就不写,没有就不写啊,来我们给他运行一下啊。
先在这边呢我先打印一下这两个字。
比如说我要调用它,调用个user啊,我打字进行打印,先打印一下啊,打印一下这个类目,打一下这个GN对吧,这user啊,然后呢现在呢我要对它进行一个操作,如何操作呢啊首先呢和刚才这个GN差不多啊。
先对它进行一个,诶跑哪去了,这A跑哪去了,那,这里需要对它进行一个对象的一个声明啊,啊声明好之后呢,然后对它进行操作啊,It's the,这个代码没写错呀,来看一下啊,在这里啊,先对对象呢把它弄出来。
来写一下啊,然后这里就不一样了啊,那一个是这个,然后呢现在呢就是a class,电怎么了,他这里呢是用把对象。
然后呢加上这个东西是执行这个地方,然后后面是他的参数名是吧。
这个是INVO,先取出他的对象名啊,这是返回值OBJ怎么写的。
这个我还忘记了啊,意思这要先把它取出来。
取出来之后从这里获取,先把它取出来啊,先把它取出来,那用这个先取出来,取出来之后呢有点点,那这个有了,然后呢对象是U然后呢是参数,参数呢,我就给他复制第一个值,给它复制什么呀,就是这不获取这个吗。
内蒙和GN啊,我就是名字呢就叫第一个名字,那就是内蒙啊,叫姚迪吧,A啊,第二个参数那就是性别是吧,那就是给零吧是吧,只能当零了啊,到一吧也行吧,当一回当一回,好这样子把它搞了之后呢,我们来看一下啊。
是不是可以把这个测量方法给运行起来,看一下啊,好你看是不是输出了小的gay和gay1呀,那这小的根1G是哪里呢,是这里输出呢,那我们确保它11下,就说是现在的是这个user成员方法运行的。
把它写进去是吧啊,这个呢也是一样,对吧,避免说哎不是它运行的,不是调用它,对不对,好写上去啊,我们运行啊,来运行下来,你看是不是调用它,你看就调用那个user里面的东西一样呢,把调用出来呀。
小于是给啊给一对不对,是他呀,没问题,那就写出来了吧,所以这个呢不是我说的啊,就是对这个请愿的方法呢,你这个执行压,对,不对进行执行的啊,这个是执行,不是说单纯的赋值了,赋值是赋值,赋值只用参数。
那是赋值,这个参数一换就是赋值了,是执行,因为很简单,这个东西它没有被执行,它是里面那个方法,你没有调用,它怎么执行呢,他就用这东西把它调用了,调用了你才能执行下面这个输出啊,所以他是执行啊。
你不要搞错了啊,不是说赋值赋值是赋值啊,执行这个执行啊,包括刚才这个也是一样,这个也是类似它执行啊,进行这个执行,也属于类似说创建也是那个意思啊,啊这个就是我们说的这个几个东西的全部,介绍了啊,好。
那么这个就是网上说的反射的所有知识点了啊。
基本上就是80%我都讲,所以说网上你再看到反射的时候啊,你阅读相关的文章的时候,这个明白之后呢,阅读相关的这个安全类文章,关于反射的啦就能够清楚一些了啊,也不至于说完全听不懂了。
你比如说这个学了有什么用吗,我不说从开发角度讲,我就说从安全的分析角度讲,那么碰上反射的相关知点呢,至少能够看个大致非懂的能够理解了啊,那么现在呢我们用这个反射的来实现个什么实,实现个命令执行。
那是什么命令执行呢,我们先来看一下啊,我们来分析一下,从这个实验里面我们就能和安全进行挂钩了啊,来首先呢我看一下啊,比如说我们现在啊写一个代码名字叫做get。
然后run啊就叫get run啊,AXEC是吧,就叫这个名字,get around a acc啊,那他是干嘛的呢,来看一下啊,我们怎么操作它啊,你看啊,我写个wrong time。
点get wrong time,点EDC执行一个什么CEO啊,C是吧,这样好好,我们来看一下,这里呢再把它进行个,好我现在来分析一下啊,还有个报错,他说什么鬼必须得到捕获异常,什么鬼东西好。
把异常给他搞上去,好来运行啊,CLAC是我们计算器,然后你看我把这个运哎计算机都弹出来了,这该简单吧,这啥情况,这其实运行的就是自带的,这是我们这个java内自带的run time。
里面那个EREC呢执行命令的一个操作,这种呢我们称之为叫,原声的一个调用啊,对不对,很简单,就说我直接写调你这个对象调用里面的函数,调里面的方法,然后呢把里面的这个LCNF值哎我调用了对吧。
就写这个东西,那就直接调用了啊,好大家试想一下啊,这是这种调用,那么换个角度呢,那么如果啊,是第三方的这个JRR包呢,对不对,如果是第三方的解压包呢,啥意思呢,就是这个wrong time。
Get wrong time,那是在哪里呢,你可以把它点进去呢,它是在这个地方呢,我们看的我直接把点上去了啊,来点上去就可以拿它水呢,安卓的CTRL它是来源于java long里面的。
就是我们这个JDK自带的点进去,它不是来源于哪里,它是来源于这个这里面自带的java long里面东西啊,你直接来到这里呢,你看他路径啊,我们上面都有啊,那来这个wrong time。
这里看来你可以看一下,上面我把它勾选上的时候,你这属性中单他是哪位的java long呢,这里的java long这个包里面的这个包是哪里的,这包哪里的包是在的啊,是在个java1。
8里面的RT j r里面,那RT j r里面看到没来,你看了RT j啊,就是说你按照这个JDK呢,它就自带有了哎,然后你们这边找java long,然后呢来到了这个什么,刚才这个是long time嘛。
哎get rrtime,嗯来到这里,那是不是这俩啊,Long time,那就这俩啊,那就这个地方啊,然后呢里面那里你运行的get around time,那就在下面嘛,get r呢就在这里嘛,对不对。
然后返回这个什么CAMERRTIME对,这是他的逻辑,就是说其实呀你用这个执行命令呢,是怎么执行的,是他的什么JDK自带的这个什么东西呢,调用执行的对不对,自带的这个R7点jr里面的这个东西东西。
对不对,那如果说是第三方打包的呢,是不是就是我们今天要讲到的,用到这个什么class点four。
或者是刚才我们说的这几个诶,跑哪去了,来,就是对象的那个几个操作吗,先要得到对象的,就这几个吧。
对不对,如果这是第三方呢,你是要写完整路径的呀,那我刚才我自己创建的这个什么,这个文件不就是用这个东西来操作吗,只写了个user,不就是获取它,就把它全的东西写上去吗,就把它当做一个类似的东西啊。
所以说呀如果第三方的话,就要这样写,你看我们之前写的那个,用那个JDBC去连接那个dd bc,我们往下的那个MYSQL那个那个链接,是也是用这个东西把把引用的呀,对不对,所以说大家我把这里一讲。
大家自己在脑海里想一想,就觉得这个东西大概知道哎,我们为什么要选它了,其实呢学它的原因就是,方便于你后期去构造这个类似的攻击,payload做准备的,就是你一旦要引用一些,这个里面那些东西的时候啊。
你就需要找到这个地方啊,去提取里面的东西来调用它的方法,或者修改它的那个成员变量,或修改它的这个成员方法,或者是它的构造方法来实现你的目的,所以学这课的原因就是为了做这个事情。
那么这个事情刚好和哪个安全漏洞挂钩呢,就是大名鼎鼎的java里面的最常见,也是考点最多,也是重难点,重重难点,java里面不得不提的反虚化漏洞,所以这个反射呢可以说是反序列化的基础。
而且反虚化的利用呢也是离不开这个反射,包括我们在里面呢要说到过的呢。
RMI什么JDBC,以前呢你只听到过什么JDBCRMI是吧,这些东西它其实都是这个类似的反思的,一些知识点,只是说你们这些不同的协议是吧,有的是访问文件目录的,有的是这个远程协议等等。
来触发这个相关的东西,那么如果说你不学这个反射,这东西呢你就完全不懂好。
那么现在呢,我们能不能就说我不用原生态的去写,执行个计算器来出来了,很简单的道理,就说我原生态写,我写个弹出个计算器,很简单是吧,这大家都明白,就里面的用一下它自带的,这个像是自带函数一样。
哎我把它这一弹就这么简单,那假设说,我现在让你去用这种反射机制,让你把它引用出来,该怎么引用啊,来该怎么引用啊,首先是不是要找到这个java的这个路径啊,这不就是java下面的点NN。
下面的点run time,下面的,是不是来到这里呀,先得到这个路径,就是我先把它当做是一个外部的,因为他明明是内部的,大家可以直接用啊,我把它当做外部的好吧,然后呢我用这个反射型的这个什么这种方式呢。
去把它调用出来,然后呢我现在要调用它里面的什么,是不是这个get wrong time里面的这个EXC呀,要调用这两个东西的,把执行出来呃首先大家思考一下,那这个该怎么调的呢,跟long time。
我们从它的字面上,我们现在给他点进去看下啊,我点进去看看这个long time是哪里啊,这什么方法,public的是吧,public方法,然后名字是也叫long time,那就是取它的什么勾造方法呀。
构造方法是取哪个。
看一下上面的啊,构造方法是哪个,是不是这个对不对,把它取出来来。
我们获取一下啊,来试一下啊,是不是这个意思啊,嗯嗯跑哪去这里,A点class a class,点get c开头的加S获取里面的所有东西,来我们试一下,看能不能获取到啊。
然后呢在这里呢给它进行一个求变量赋值,然后呢再取这个名字啊,那佛一下看一下是不是这个道理啊,CON的,然后我取个名字叫CTRLCN吧,然后CN编辑一下,打一下啊,看一下啊,看一下啊,来运行一下啊。
这个呢就先把它注释掉,那先获取一下它内值的,那获取下内值的哎,怎么啥都没有啊,我哪写错啦,Good,肯,嗯嗯你妹,我取这个吧,我取这个,你们,或许我待,或许这个试一下啊,那会这个,不可能啊。
我怀疑哎这个出来了,你看啊,这获取到了有很多呀,那R谈的呀一大堆是吧,public的呢,包括我们刚才看到那个这个get around time呢,是不是也能获取到啊。
那get wrtime是不是在里面帮他搜一下,来get long time,还是,那在这里吗,你看是不是这里呢跟状态也获取到了呀,他调用的是就是这个get wrong time,然后点EDC,对不对。
他获取到了,那我这里知道了之后,我是就可以直接用这种方式,直接获取到单个就完了呗,或者单个它是无参数的,它是无参数的吗,你不知或单个就可以了,那怎么获取呢,或单个还不简单,我用这个这里不讲过了吗。
来看下图片,那个跑哪去了,这个获取单个对不对。
然后类型long time,他的类型无参的,那就直接一个就可以了嘛,来写一写啊,点get那不加S的,有这个名字是谁呀,Get,wrong time是吧,然后呢它里面有没有参数值呢,没有有空啊,截个异常。
再写个结束值,对不对,名叫get long time,然后呢我们把打印下来看是不是他啊,是不是它打印下来看一下啊,看是不是得到这个这个地方还是不是这个东西,哎,哎果然是它来得到它了,得到它之后。
这里呢是不是就可以调用它里面的一些东西呀,那还有一个就是我们说的还有个是EEC嘛,那先把这个拿出来啊,先把这个拿出来,因为呢我现在还得到这个EREC的啊,EREC的是不是也在里面。
而且还有个EREC的嘛,来我们搜一下EXEC,那这里有很多了EEC的呢。
EEC里面的这个,那其实这里呢也不卖关子了啊,直接给他看一下了,有几种写法啊,来这个是我们第一种写法的,额,用这个这种方式写出来的,还有一种呢就是用这种方式写出来的,来我们直接看这种了,那刚才写的啊。
他是从上面先得到,得到之后呢,下面呢再写这个这些啊,那就和我们一样的,这个是获取EREC的,然后string class,然后这个呢是获取那个long time。
get wrong time的那个地方的啊,long time的,因为EC里面有个string类型嘛,来这个是get on time的,下面呢就是用这个东西呢调用这个class,就和刚才那个调用一样。
来执行一个CLEC就可以了,所以说这个东西呢大家就明白了啊,也不是什么大问题呢,和刚才一样吗,这个是获取他所有的,获取所有之后呢,从里面塞嘛,一个是三大东西啊,来我把自己写一下。
这个呢就是获取所有公共的是吧,包括这个继承的,乘法,然后呢这个呢就获取之后呢就帮助我们的去塞,然后这两个呢就是一个获取这个,EXCEC的什么,对不对,然后这个呢就是获取这个get long time。
啊最后呢就把这两个呢进行一个什么啊执行啊,那么这个run time呢就得到这个class嘛,用这个东西的呢,那后面呢再进行一个执行,后面呢我们来分析一下,看一下是不是能够用这个东西呢,来刚才是用这个。
把这个写下来吧,啊这刚才那是用这个什么原生态的去执行,现在呢我们就是用反射的机制来去运行了,这个里面东西,那看到没计算器呢就弹出来了,对不对,这样机就弹出来了,所以这个和刚才用原生态的就不一样了啊。
原生态的就是你直接引用完了啊,这个呢是类似于说我们从找它的根本,再从根本上面再投理出它有哪些东西,再把这些东西呢进行相应的操作,再去学习,啥意思呢,因为这个是大家知道的,就是我要运行命令,我要执行命令。
我就直接用它自带的东西去运行啊,如果很简单,这个自带的没有呢,或者说他没有,或者说他被封堵了,或者说你不能用它呢,你是不是就只能用其他的这个啊地方的呀,所以呢我们就用到其他的这个地方的,对不对。
来实现这个目的,那么大家就知道了,这个反射其实就是我们装我们他的这个,我们学它的原因就是让我们掌握一门技能,掌握什么技能呢,就可以从其他的加包里面,其他的类里面去拥其他的类,就这么简单。
那你为什么要掌握这个技能呢,就是我说的,如果你在这个安全测试中啊。
有一个类不安全引用,那么现在呢我们就来看一下啊,你比如说像现在啊这里有几篇文章,我们来看一下他的这个安全价值,所以这里有个那叫java反序的话,什么COM什么组件啊。
他说啊这是学习这个java法修法第一篇文章,哎然后说这个踩了这个坑啊,他说什么难归难哦,然后呢他写了一些,这个是不是这里面谁发给我的,不要看这个啊,先看这个,他说啦,java1篇文章,咦怎么一样啊。
啊你看这里啊,呃他这里呢去写这个漏洞链的时候呢,哎呀这里面也好写了,也不搞清楚啊,这还麻个麻的锤子,啊他说这个真正的反虚化漏洞利用呢,是需要了解java的反射原理的。
因为java的反虚化的payload的,大多数与反射机制密切相关,为什么说密切相关呢,就是说你要把这个反序的话,把它利用出来的话,你就必须让它去调用,反射到其他类里面来,把这个类呢给它实现出来。
他后面举的这些例子,都是属于他限制了一些类的利用,所以他只能从它本身的里面去找这种类,从类里面呢去执行出相应的命令啊,你可以看一下这个文章啊,我们现在都没有讲反序列化,所以说呀这不好讲的啊。
嗯你包括这里呢他利用这个这里有几个啊,还有这个最简单的这个最简单的基础啊,这个没写,但我里面写了篇文章的,就是那个叫URDS的那个操作,网上有些类似的课程讲过啊,我们下节课也会个分析啊,就说有个工具。
那个YS那个反序化利用工具里面,那提供了很多那个利用的payload,那个payload是怎么写出来的,就是反射写出来的,所以你分析那个YS那个工具呢,就是等同于分析这个反射的一个机制。
它是根据里面有哪些库,那我们可以看一下,给他介绍一下啊,就是,那个名字叫java的那个房区的话,I s1,我那个英文单词也是不好啊,那工具名字呢S1,这个名字,Java label。
我电脑咱们应该有啊嗯。
那就这个啊来就这个名字的啊,给大家看一下,那这个是那个运行的一个那个情况。
大家可以看一下啦,我运行打开之后呢,哎他是这么一个东西,这个是一个那个反循环利用工具啊,它是个反循环利用工具,你看这里呢有一些这种东西,啥东西呢,你看啊他前面有个名字,后面呢有个这个什么鬼。
叫什么cn beautiful,1。4啊,什么这个3。1啊,什么4。40是啥情况啊,嘶其实呢这都是一些java里面的一些架包,啥意思呢,就是说你有这个反向漏洞之后呢,他利用的是什么。
就是让你去看一下你有没有这个价包,比如说你有这个这个co2MS的,1。92的这个包的话,那么他就可以利用这个包里面的某些类,来实现一些命令执行或者一些方法,啥意思呢,就很简单的道理。
就是说现在的假设有个反需要漏洞,这个反向漏洞,那有了我们下按到他命令执行,我就可以尝试让他去调用什么,调用刚才反射的用到这个什么,这个jajava long time就可以用它啊。
知道吧,就是这个意思,那么这个工具的也是这个意思,它里面有很多这个价包,那么就是说你项目里面啊有这个架包的话,那么他在反向环利用的时候呢,就可以利用这个架包,就利用这个架包里面的一些这个库呢。
来实现一些供给啊,他就是这个意思啊,这个原理,那么现在呢我们是没有讲这个,没有讲这个这个反虚化的,所以说这个东西呢我们也不能继续说了啊,我们要把那个反句话讲了之后呢,啊再结合去分析它的话啊。
那就很好理解了啊,对不对,然后他这个分析里面的还有很多协议,包括刚才我提到过的什么RMIJNDI啊,那都是java的高端的一些安全的课程。
如果说要分析的话,其实我们后面也讲,但是不是这个安全开放里面讲啊,是在后面那个web漏洞,就是我们这个章节讲完之后呢,讲了web漏洞时候啊,单独讲这个java安全的时候呢,我们会有即可的去分析啊。
包括在那个一菲的那个视频里面呢,我也给大家去上传过一些这种,java的这种安全的课程啊,对不对,如果说你有感兴趣的话,觉得讲的不多的话,你可以看那个课程,那是网上的收集到来的啊,第三讲的比较多了。
我后面呢也会讲啊,现在呢还是以安全为主,先把这个讲了之后呢,我们下节课呢再说反虚化的一些操作啊,就是反虚化怎么造成的,反虚化的一些的这些代码的,都某良心呢给大家讲解一下,讲了之后呢,你再来思考啊。
这个反需要和这个反射是不是有关联性,不过呢你要讲到利用的时候,那就有关联性的啊,没讲利用,你是看不到关联性的,一旦一讲到利用的时候,就知道这个关联系统,因为像这个反虚化里面的一些PO的。
那个粘的一个构造呢,就和这个反射的是息息相关的,他为什么有那些什么各种各种协议,还有一些粘的构造,是因为呢它本身里面是有过滤的,如果你不去那样操作的话,它是绕不了的,它是有些过滤的啊,里面有些那种版本。
每个版本的在更新之后呢,它会有些过滤,很复杂的啊,说实话很复杂的,你把它研究到之后呢,这个东西呢是java的一个那个安全问题嘛,很复杂,我们把这个java的课程上完之后呢,说实话啊。
虽然说我也不知道会伤的是个什么深度或程度,但至少呢是吧还是比较这个算比较是吧,比较可以的啊,这网上东西也不好讲,这太难讲了,妈的说实话。
今天的这个安全开发呢就讲到这里了啊,我们下节课把这个反虚化的一些原生态和,和一些什么JSN啊,插美奥的一些那种反序列化的一个东西呢,给他讲了之后啊,啊然后大家再去看一下啊,那个反虚化如果说利用的话。
是不是和这个反射有关,你把两颗呢一加上去一看啊,很多东西呢就能明白了啊,好这个是我们今天这个内容了啊,关于这个java的反射机制的一些介绍,我们也是不劳辛苦啊,这个代码呢也是一个个来敲的,哎。
你也不要说听不懂啊,或者不知道这有什么价值啊,这个东西你用到的时候就知道价值了,你不用去讲这些东西,为什么要讲这价值,一时半会不懂啊,因为我们都是没有去讲,这个java的最深的一个基础,没有讲过。
你暂时不懂这个反射镜是会干嘛,这个是很正常的,你只要到时候那很安全,能够挂上钩就OK了啊,不要去想其他的,我们是结合安全,不是要结合开放,好今天就讲这么多,下节课的内容呢也给大家说了啊。
就是关于这个java的一些反序列化的,一些周某的代码段,就是它反序化是怎么产生的,它有什么意义啊,这些东西都会讲,讲了之后呢,我们再结合一下,好今天呢就讲这么多啊。
这个my BIOS呢是在sting put里面再说啊,唉这个东西买BIOS的讲不讲都其实关系不大,他这个漏洞比较少,重点就是反虚化呀,反思呀,包括这个,嗯几个组件的一些安全,这个是比较重要的。
因为这几个漏洞比较常见啊,好我们这里呢就说这么多了啊,下节课的内容也说了啊,看大家有没有问题。
有问你问一下啊,没问题瞎了啊,其实java你学起来你只要开始学好之后呢。
蛮有趣的啊。
还是蛮有趣的,难他是确实比其他语言要难一些。
输出上传录像,唉早卷一点啦,录像上传完都要骂,哎呀。
我现在真是啊,没办法,我还是对他们对。
对有些人太仁慈了啊。
隔壁的隔壁的有些人不满足隔壁的培训,他都不敢当别人骂,当着我的面骂,对不对,还叫我不要跟别人说,妈的骂起我来拿死你妹的,不管不行,不不闻不问呐,退钱,那全票啊,你妹的一顿骂呀,我真是你妹的。
是不知道啥情况,我只记得啊,之前有个人报名,他说隔壁的把他坑了是吧,花了什么大几千上万,啥都没学到,然后呢,他把别人骂了一顿,说很垃圾啊,什么鬼,还要我不要跟别人说,还不要我当吃瓜材料。
我还没有给他当丝瓜材料,好过了里面的半个人,对不对,他老子刚才在说我的好,过了半个月,他的本性也暴露了啊,直接当着我的面哎,学不懂啊,退钱啊,全飘啊,你这他妈的别人割了你1万的韭菜,你连当着别人骂。
说不好听的话,你都不敢说,我你妹的收了你2000多块钱,天天这么认真教你,你还骂我,我说了呀。
P35:第35天:JavaEE应用&原生反序列化&重写方法&链条分析&触发类&类加载 - 逆风微笑的代码狗 - BV1Mx4y1q7Ny
java开发的第四次直播了,上一次直播呢我们讲了java的反射机制,那这一课呢我们就来讲和反射机制细细挂钩的,这个序列化的一些操作,其实这一课呢开发的点呢不多,主要呢说一下这个序列化。
因为它是java安全中的一个核心部分,好多漏洞呢都是这个反序列化的漏洞,那反序列化呢在pp也好,或者说在java里好呢,都会有一些少许的差异,在java中呢是重难点对吧,中难点又是终点,那又是难点啊。
P1P里面呢还稍微会轻一些啊,因为GPP会好理解些,那个虚拟化的这个开发里面呢东西是差不多的,但是它的安全呢就是截然相反,那java里面的反序列化呢是一个很庞大的支点。
这也是我们后面课程呢要会给讲的,这里有张图片,网上找的啊,来这里有什么鬼,前期的什么反虚化序列化啊,啊后面呢有这个什么技术,然后呢什么叫反射,叫代理内加载集合,包括一些利用念啊的一些分析。
这是后面我们要商的时候,那就给讲啊这个安全漏洞一块的啊。
想开发呢就先把这个反虚化的入门呢搞清楚好,那今天呢就入门了,什么是这个序列,反序列化啊,他有两个啊,一个呢是说这个,一个是我们说的这个,呃序列化还有个呢是反虚化,这个是什么东西呢,我们来解释一下啊。
序列化就是将内存中的对象压缩成字节流,而反序的话呢是相反,将字节流呢转化为内存中的对象啊,这个字节流这个东西呢是在java中这样教,如果是在pp里面的话,pp就是个字符串,那pp是字符串啊。
java里面呢是这个字节流P1P的,反序列话呢是直串,这里呢有有有一些差异啊,我们到时候呢在讲这个反虚化漏洞的时候呢,就是这个开发讲完讲漏洞的时候呢,在精讲这个漏洞的时候呢,会对比一下这个差异的啊。
那么具体呢有张图片大家可以看一下啊,就是这里呢是一个java的对象啊,它把它转化为资金流,这个资金流呢可以存储到文件中,可以存储到数据库中,也可以在这个我们的窗口呢模式下面呢,去显示啊。
所以说什么是这个序列化和反序列化呢,它是一种基数,这个基数呢就是实现对对象呢转化为资金流,资金流的转换对象,那为什么会有这个虚拟化技术呢,其实呢也非常好理解,他们的这个设计呢本身就是用来传输数据的。
你可能会说传数据,这个和这个技术有什么关系呢,很简单的道理啊,你传输数据的话啊,你我们就拿个代码来讲的话。
我们可以随便的先打开这个代码,给大家看一下啊。
嗯这个代码艾迪先暂暂停一下。
然后这里呢有一些这个代码,比如说这里呢有我们一个users的,一个这个这个DM端是吧,这里呢有一个对象啊,这里呢有一些里面的成员存量,成员变量和这个成员方法啊,还有一些呃构造方法是吧,这种啊。
那像这种呢是吧,这个对象,他为什么要进行这个,序列化和反序列化的操作呢,很简单道理啊,假如我要发送一串数据,发什么数据啊,就发这个整个代码端,那你怎么发,你把它CTRL加ACTRL加飞车,这样发吗。
这写完不好,为什么,因为这里呢它里面有很多空格,或者说有一些乱七八糟的字符立罚的话,你如果说像正常罚,我们就这样去写是吧,但是你这里面有这么多空格,还有像这种锁紧复制各种东西。
他怎么去模拟它,那模拟不了,所以说呢他就会用到这个虚拟化技术呢,把这个整个代码端呢是吧,把这个怎么代码端呢给他呀。
封装起来,封装成一个虚拟化人尸的这个什么数据格式啊。
就是我们说的资金流,然后呢去传输,并且很简单啊,如果他把它保存到,把它传输成了这个文件的话,保存到文件中,那么这个文件呢就会储存这个东西,其实就是很简单,我们一句话去理解它啊,它就是一种什么技术呢。
就是把一个代码呢把它封装成一个文件,或者是一个东西,然后这个文件呢再通过某些这个反序化操作,再把它还原出来,就说简单的一句话,就是数据呢你在传输的时候呢不易传输,不易传输呢,就是因为它这里面。
比如说一传这个代码里面有很多东西,这个东西呢里面有很多这个符号,有很多乱七八糟的,你不可能的,就是把它全选粘贴复制啊,放到这个什么值后文那种,他全输过去,因为它不会识别一些什么空格呀。
或者一些杂杂杂七杂八的,那么他就可以用到这个虚拟化技术呢,把他们呢当做一个整体封装成一个文件,那么呢再以这个文件呢去让对方的去解析,能不能理解这个意思,所以这就是它存在的意义啊。
就是因为那数据在发送的时候呢,有一些数据呢它是不一去发送的,所以他需要把它先封装成一个整体,然后封润成阵地之后呢,对方呢再采用相应的技术把它解析出来,那么一个就是封印的封装的过程。
这个过程呢我们称之为叫序列化过程,对方去把这个过程把它还原出来的,那么就称之为叫反序列化,就是一正一反,就类似于和我们那个加解密一样,就是有传数据的,你先把它封装,便于传输,封装成一个文件。
对方呢再把这个文件呢给他再还原出来,那么在封装的过程中。
那个前步骤称之为序列化,就是我们说的把这个对象压缩成资金流,对方呢再把这个自己能把他再还原成这个对象,所以一个称之为虚拟化,一个称之为反序列化,好这一点呢请问大家能不能理解啊,你之后呢,我们就来开始呢。
去讲一下如何进行反序列化操作哈,那么在这个java中呢如何进行虚化操作呢,它是由这几个东西的啊,有它内置的一些API函数,然后呢有一些这个第三方的,像这个菲斯克JSNJKSON,这个是祖先的嘛哈。
它里面呢也内置有这个序列化的这个函数操作,我们初始杰出反序的话呢,是先用原生态的,后面再讲到这个反序化的漏洞,核心部分的时候啊,就是在后面漏洞篇章里面呢,啊我们呢再来看一下这个基于其他的啊。
他的一些反序化操作,那么现在呢我们来看一下,这是他的这个协议,然后呢为什么会出现这个安全问题。
这个呢我们先给大家看一下效果啊,好我们现在写一个代码啊来实现,就说我们先呢去实现一下,一个反序列化的这个操作和序列化的操作,然后呢我们再来去分析它的安全问题啊,两步啊,安全问题呢有分很多组。
这个虚化这个东西呢说白了啊,他这个是来点麻烦的一个东西啊,好我们创建个Sol test dom端,然后呢嗯这里的就直接下一步了啊,就加补20个创建,那就直接创啊。
然后这里呢把这个MVN的这几个东西都给删掉,因为这东西呢不重要啊,然后这个项目呢更简洁些,把这个首页文件hello,亏不得人也给他删掉啊,要不要他都无所谓啊,删掉哎好,然后呢,我们先不删吧。
就来这里写啊,先写一个这个类啊,写个这个user,Dmally,嗯这个user dmi,然后这里呢写什么东西呢,啊就写一些这个常见的,我们说的这个它的一个成员变量值啊,这些东西啊先写一部分啊,写一写啊。
STR搞一些这种他的一些东西啊,内蒙那叫做小李啊,然后呢啊谢谢的习惯,这个呢就叫GN集啊,嗯性别呢闷啊,然后呢A级啊,这个A级那就搞个int类型吧,int类型的啊,数字型的,然后呢搞个30是吧。
选30岁,然后呢可以写一下这个呃,他的一个一只刀毛的一根构造函数是吧,构造函数里面呢写个空的呀,或者说写几个值啊,都是OK的啊,这个也是无所谓的啦,把我给传一下呢,也可以写空的,也能写写几个吧。
还是一个参数,String name ing,还给了string galaf,对嗯,然后呢你思嗯name呢等于这个啊,这个是随便写的啊,就是说就是说有这个东西呢,那说明就可以了啊,这个是可以随便写的啊。
这个无所谓的啊,然后这个是个他的虚构函数啊,构造函数,然后呢我们再来写一个这个呃,比如说我们再写个这个,他的一个user import的一个分数,对不对啊,这个呢就是把三个变量都传进去啊。
三个变量都全进去,啊也好呢,然后呢我们依次啊用到这几个啊,等一下把他对,这里呢也搞个CAD吧,好啊这里呢我们就写了这几个东西啊,好那这里呢写了这几个东西之后啊,这里还可以搞个return吧。
返回一下也是搞个这个东西吧,哎我我这里面用这个代替吧,搞return的返回,把它括起来吧,搞return返回吧,Return,返回user对象里面的,几个值啊,然后我把那个代码呢。
这个东西呢就用那个东西来取代一下吧,还是,就把那个copy过来啊,懒得写了,来就这个啊,我们把它copy过来啊,啧有个秋时string啊,来看一下啊,有个求死菌的一个方法,这个类值的啊。
这个是类值的方法,这个求死绝呢是个类值方法啊,这个不是说我们自己生命的啊,这个user dmo呢是我们自己生命的啊,因demo是我们自己自己声明的是虚构函数,然后这个呢是它自带的,你可以看一下啊。
他这里呢你选择中啊,在选择中按这个excite,再看一下他这个地方东西,然后呢,这里呢继承一下那个虚化的操作那个块啊,模块啊继承,你观察一下他这里有重写方法呢,重写方法里面就有这个几个东西。
其中就有那个set的那些东西啊,来TOSTRING呢,这里有啊自带的啊,嗯没写了啊,好这个写了之后呢,呃我们这里呢就写好了啊,然后我们继续来了,来写文件啊,来首先这里呢我们就创建一个叫SER。
这个呢就是代表的是我们说去把它序列化的,操作的那个名字啊,就搞个这个名字吧,创建这个文件啊,来模拟,模拟它的这个虚化操作啊,然后呢这个怎么操作啊,大家这里的就观察了啊,先写个main函数。
然后这里呢我们再创建一个函数啊,这个呢就是我们说的如何的进行序列化操作了。
我们先写序列化操作,序列化操作了就是让用到这个object,就是我们说的大概有几种方式呢,我们用到的是这种呢,第一种啊,内置的这种方式来进行虚拟化操作,它可以用以下这几种啊。
这里只写了常规的一些场景使用,还有很多啊,就是说不是仅这这几个啊,还有就看你自己啊,内置的就是这两个啊,一个是这个XML的一个抵扣的那个序列化,还是个web,我们杰西。
然后呢一个是写入一个叫reader,写入的话,那就是序列化,为什么叫序列化呢,因为他是要把这个对象呢把它压缩成资金流,它一般都是写入操作,而读入操作就是把资金流堵路,然后再转换。
所以这个white or object,这个这个呢就是一般是序列化的操作啊,然后如果写啊来给大家看一下啊,自己呢先声明一个这个这个对象啊。
把声明一下啊,来我们先声明一下,嗯然后是这个名字,那我们就取名叫,叫这个test嗯,test啊对吧,然后嘞取名一下啊,怎么写啊,首先呢这个是object啊,然后呢他是这个写入解入啊。
然后创建一个这个对象啊,名字就叫OOS叫OOS,它的一个传前面的是写的啊,这个名字可以自己写的啊,呢前面一个大写字母OS啊,这有形的我们就叫output吧,就output也行啊,OS也行,好等于什么呢。
就等于这个对象呢,然后呢这个是点啊,这个对象啊,接下来呢就是怎么办啊,我们把这个代码把它写完之后呢,再给他说啊,再给他说new一个对象,这个啊这个是啥呢,叫fire output sman。
这个是他这里呢有一个叫file open,我们把它解释一下啊,啊有些人不理解啊,这个呢是,输出文件啊,输出文件的一个东西,我们来输出文件,在这里呢可以自己呢写个名字好,可以写一下啊,名字就叫S1啊。
点TST把写上去,然后这里面有个这个报错,报错呢能托夫呢给它自动补齐是吧,还有报错再来看一下是哪里报错好,这里又有报错,他说插入new这个object什么东西啊,是吧啊,插入个丢,哎你开上去了之后呢。
这里呢又会报错,添加异常再添加,哎这里不包了好不包了之后哎,我们进来啊,然后把这个OSS呢点什么呢,大家你看这个点之后呢,嗯那这里是不是有个叫欧包这个东西啊,能有这个函数啦,写入文件写什么东西啊。
这里要有写入文件写什么东西呢,他这里呢就是我们先做个什么事情啊,我先把这个函数写好,我再调用它啊,你先看一下啊,他写什么东西,我给他传个参数,给他传个什么参数呢,传个对象,传个对象,参数传个什么对象啊。
叫O比基,让他写O比基进去好,然后这个OBJ从哪来啊,我们再来给看一下,我们在这里呢写一个东西叫什么UUSERDUMO,然后呢创建一个叫U等于u use dumm,就是呢我们自己呢写这个东西。
然后呢在里面写参数,啥意思呢,就是我们现在呢调用隔壁的这什么use dumo,然后在这里呢做个什么事情呢啊去写名字,那比如说我叫小迪SEC,再另外35gay是吧,然后呢第三个参数30比啊。
就这里呢我们去这样去写这个是啥意思呢,啊就是相当于我这里呢给它赋值一样,那我这里呢有这里只有两个值啊,我给他三个值吧,这边搞个英特尔的类型的那个A几把写进去吧,也是吧,免得等一下呢这个东西呀没有。
是不是它是刚才是两个嘛,给他搞了搞几个,那这里就对了是吧,31哎,加了一水,把选去之后呢,这不是有个对象的吗,这是创建这个什么,这个值就是啊创建一个这个对象是吧。
然后呢引用这个隔壁的是什么new demo呀对吧,脑子里面写词,然后呢你可以自己呢先给他看一下啊,cc u t e把它打印下,这个U你看一下是什么鬼情况,我们先打印下,给他看一下啊,他先先创建一个对象。
创建个user dom对象,然后打印嗯,这里有个11行,有个报错呀,我这里多了一个什么斜杠,妈的啥情况打印,你看他就输出来了,UZ小DC啊,什么小DJ啊,这个东西呢这啥情况呐,这里是输出这个两个值啊。
你看啊我们这里呢确保一下啊,把它输出的时候加个东西,对不对,加个东西,确保是这里在输出,那比如说我就在这里加一下USDMO,再输出,告诉他是吧,确保我们是在执行这里哈,把这个搞清楚对这是A级。
然后呢我们再来运行一下,你看一下啊,现在,是吧,来use dma里面的这个小di c use dma里面的gay,Use dm31,就是我刚才呢在这里呢创建个东西是吧。
创建了use dm就执行这个地方嘛,对不对,把这三个参数传进去,然后这里的输出三个参数就是执行这里嘛,对不对,所以呢这里就有个对象U了嘛是吧,U了有U了,是不是,然后这个时候呢我们怎么办啊,你看一下啊。
我在引用这个函数,那引用这个函数干嘛呢,把U加进去,啥意思啊,U不是个对象吗,这是个对象嘛,创建对象,那把U加就是open ject的对象,对应上呢让它呢去怎么样把它传进去,把它进行object。
把写入写入之前是怎么办呢,其实之前啊这个OS呢它在写入的时候呢,会把它生成到SERTIT里面去好,那么现在呢这里有个报错容错,我们看一下是什么情况,他说把它设置为静态好,设置一下好,这里自动变静态了。
在进来之后呢,这里又有个报错报错,什么情况,添加异常好,添加异常好,先驱好,那现在我看我执行一下,是不是会产生一个SER点TIT文件好,我们看一下啊,这是啥意思呢,给大家解释一下啊。
这个就是创建一个对象,然后呢下一步呢就是什么调用这个方法呀,去运行啊,这样方法是吧,这个方法呢就是下面这个这个下面这个呢,可发底就会什么呢,就是二简单一句话指什么呢,将对象OBG啊。
序列化到文件SER给贴地名,这样就代码的意思就是啊,将对象OBG的这个序列化的数据呢,输出到文件SERDTIT里面去,然后这边呢是调用它吧,那用这个main函数主导函数。
这个主导函数呢就是说这个项目执行的时候,他会运优先运行变函数啊,它会自动运行,运行的时候调用这个函数函数方法啊,老数函数说习惯了啊,这个方法方法呢在下面哎是吧啊,方法里面的方法里面的一个参数。
OB1OBG呢,我们传入UU呢是我们刚才创建的嗯,对来说会对这个use dom呢,这个对象呢进行一个序列化操作,简单来说就是过程完成这个啊,来我们运行一下,看是不是会呃产生这个文件哈来运行。
那你看是不是产生了S12点TT这个文件啊,看到没,然后呢我们可以把SRTIT的打开,看一下是什么鬼情况,打开诶,变成这个东西,这啥东西啊,哎里面莫名其妙,可以看到有些java的一些什么代码来是吧。
有些java代码里面还可以看到一些,但是呢大部分都是啊出现了一些乱码呀,一些东西,那这个东西是啥呢,那现在就是说的是啊这个SETRT嗯,就是啊这个U,我把它写上面吧,执行完之后啊。
这个SER点TT呢就是这个对象U,序列化的数据,能理解了吧,那这个就是他序列化后的数据了,对不对,能理解了吧啊,他就把它序列化了,所以这个就是序列化了啊,好那么这个是序列化。
我们第一次来再完成一个反序化,看下反序化能不能还原出来啊,我们看一下这个反虚化能不能反映出来好,你看它序列化成这个SETIT了,那么现在呢我们再创建一个java类名字。
就叫UNSERILEZADL1normal,就是一个反过来的语文的是吧,这demo的一个文件创建好,创建好之后呢,也是一样道理啊,先这个mail一个主导函数,然后这个的主导函数干嘛的呢。
是不是按照刚才的思意思想,我们先这个DUMBLE一下呀对吧,先DUMA一下,然后呢我们再写一个函数,写个呢什么函数呢,就是我们说的刚才那个反过来的是吧,名字就叫test嘛,对不对,写个反过来的。
那这里呢就是要反过来了,反过来呢他的东西就不一样了,刚才是all over这个令alter stream就是输出,我们相当于要接收,就是换成了什么import,读入流,独流名字就叫oi is吧。
简称OS,刚是OS,那OS等于什么呢,然后等于这个六欧包这个东西是吧,然后呢里面呢再来写个例如什么呢,读入的是吧,读入的file input是吧,读入什么文件呢,这个先空着它好读入什么文件是吧。
创建好这个地方呢,读什么文件呢,我给他加个参数,读入一个叫string类型的文件,Phu,然后呢读入一个FLA,给他传个参数啊,带个参数,这样更加的这个规矩一点,然后把这个异常的给大搞上去啊。
嗯异常搞上去啊,这面还有个异常再搞上去,Ok,好没有异常了,然后呢再对这个OS呢点什么REVGA就完成了,好这样子呢就完了啊,那这个就调好了,然后呢现在呢我们来看一下啊。
那就用这个呢去给他怎么样进行一个U的操作,好的这个报错啊,他说插入return什么鬼东西,这啥情况啊啊应该是这里呢没有返回值啊,因为是要返回一下,返回,返回一个对象吧,应该是要你取不了,返回一个对象。
应该是这样子,返回个对象,返回一个对象哦,O呢,这里呢要加上,在这里写上一个这个这里这里应该也要加个,这里是写OVERJECT就可以了嗯,可看好可以了,把这个呃这个返回呢搞成个对象,把它返回一下啊。
应该可以了,看下这里,好这里呢就不要加U了啊,这里就不用加U了,这里我就直接把它去掉,因为这个不用对象了啊,这个是不用对象了,刚才是封装,我们这里呢直接给U给写个什么。
就写个名字叫什么SER点TT完了是不是,看这个还报什么意思啊,我看一下啊,完了还有什么好可以了,两个异常都解决了啊,一个是解决这里的这个静态的,一个呢是这里的这个东西,那这个呢就是把SERTRT呢啊。
把他这个什么传入到这里来,对不对啊,这是传入这个东西啊,嗯就直接调用下面的那个什么方法啊,这个方法那传入这个SEDITE了啊,就是这个进行什么反序化啊,解析还原虚化,对不对。
然后这个呢就是我们说的要什么,就是很简单,它的意思呢就非常简单了啊,就是读入,这个文件读入这个file name啊,读入final name呢,进行这个反序列化,当然啊对不对啊,他也读出这个FLAM。
那FM呢我该全称的是SITIT,就刚才序列化的,你看啊,我把SITI呢再把它用这个来执行,你看他能不能还原出来啊,现在执行它看着啊,执行它看结果,你看没有啥情况,怎么没有啊,因为啥情况,你们要输出啊。
你不输出就有了呀,对不对,把输出一下就有了呀,这个你能解吧,因为我这没有没有把输出啊,所以这里呢啊搞个输出嗯,以及额等于结束它的值吧,然后我们输出一下,看一下执行一下OUTSI。
你看是不是就有了这个就等于一个什么user name呢,小点S1C给31,是不是好,大家看着啊,一边是虚的话,一边是反虚化,你看着啊,我们现在就是先把这个值一改,你看啊,我先把虚的话,我先给他复制。
为什么这个先把这边把这个地方把它注释掉,好我先给他复制一个叫小DSEC,然后呢给E啊,然后呢30岁搞个这个东西啊,我先把它呢给它序列化一下,让它重新生成这个SERTTT,我先来到这个项目这里啊。
我先把那个S1给他删掉,就这里嘛哈那这是那个刚才的文件是吧,我删掉啊,然后重新生成,那现在没有了,对不对,然后重新生成一个啊,然生成了一个你看文件有了,那这个文件有了啊。
那这个呢就是刚才重新复制的小ASA,然后你看这边啊,这边呢没有做任何事情,就把全入进去,看能不能还原出来,看一下啊,执行,把它还原出来,是这个结果,这个啥啥情况呢,就是因为啊就是他序列化是序列化。
这个TOSTRING啊,我再用这个重新来一下啊,把把猪死了,那你看这是刚才那个虚拟化的结果,然后呢我们这边的再把它还原,那这是不是出来了,小DC呢,G134是吧,出来了啊,嘶好这个呢就是一个正和反好。
那么现在呢我们就来观察一下,这是一个第一步操作,就是使用原声,原声使用呢进行这个序列化和反序化的操作。
大家应该看懂了,其实呢就是把数据呢把它封装成了一个文件。
然后呢文件这边呢就再把它还原返回回来。
也没有什么其他的一些乱七八糟的一些操作。
是不是啊,没有啊,就基本呢就是按照这个逻辑来就足够了是吧。
就是一个是把它封装成了这个文件是吧,看到这个文件,那么就是说这里呢这个是SETIT呢,就是数据的一个结果,然后这边反循环了,再把它还原出来,就这么一个正反的一个操作好,那么这个安全问题是怎么造成的呢。
好我们来先看第一种啊,它的安全问题呢有四个方向去分析哪四个啊。
第一种说入口类的read object直接调用危险方法,这个呢是最常见啊,不这个呢是最好理解的一点。
但是这个呢实际中的很少有是一个什么意思啊,大家看一下啊,它这个OBERJT呢是在反序化的函数里面,就是在读入文件的时候是吧,就是说呢你不是你创建一个对象吗,啊,这个对象呢去读入这个传入的这个SERT。
I t,然后呢,他会用这个对象呢在里面去运行这个reader,objecting是吧,运行这个东西,那么这个read objecting呢是在哪里呢啊,你们可以点击确定一下啦。
这个函数呢它是在objecting input extream点java文件,这个文件它在哪里呢,大家可以看一下,它是在JDK的SR这个JA包里面就是自带的,它是在这里面的一个方法,对不对,然后呢。
也就是说你现在的引用的就是一个自带的,一个是我们这个JDK自带的,就是在我们说的啊,就我们这个家包里面的是吧,在这里面的一个东西是吧,这个SRC的这个里面东西啊,然后呢他在这里面对不对。
是这里面那个object import stream,这地方好。
我们来先记录一下啊,这里一定要搞明白啊,这个java反序的话,很多人学了往上加呢,都很多人都学不明白,一点小课程学好之后呢,就说哎呀讲的太透彻了呀,真好啊,很多人都学不明白。
我们看一下啊,现在记录一下啊,那这个第一个啊就是现在的序列化的啊。
我看一下这里啊,他的安全问题是怎么造成的啊,我们从这个待会分析来,就这个地方,嗯这什么鬼啊,先把去掉,那这里啊在这里啊,来这是他这个反序化的操作的时候啊,这个代码在这里面看着啊,把他保保把拉出来。
做个记录啊,然后这个REDEMON呢它是,他是在这个JDK1。8里面的一个包,里面的是吧,然后呢自带的是在这个方法里面,在这个文件里面啊,哎大家可以看一下呢,在再来我勾选这个路径呢,大家也可以看到啊。
那他是在这个路径啊,能看到没,那在这里面啊,好我们这里呢是在这里面,我们就写一下啊,好那么现在看一下啊,第一种反而序列化造成漏洞的原因最简单的,但是是最不常见的一种什么情况啊,大家看一下啊。
比如说他刚才不是对这个user demo,这里面的这个类进行了这个虚拟化操作吗,如果他在序列化操作的时候,你在这个里面有这么一个东西,好,我们写一个啊,看着啊,搞个私有的。
因为他这个属性要和那个对应上啊,搞私有的,看一下啊,我们在这里写个c or AC是吧,最简单的这是一个执行命令的,这是上节课我们讲过的啊,执行命令的一个这个东西啊,额那我写这个东西想要去嗯,对不对。
这个是啥情况呢是吧,我我这里呢把它写到这个地方来了啊,把写到这来了,写好之后啊,我们先用这个序号把它封装一下啊,来看一下,我们去重新把那个封装封装好之后啊,然后呢这个时候啊。
这个反序化这里呢再把它进运行,然后没有反应,啥情况,是因为呢他这个写的时候呢,要和这个他的一些东西呢保持一致啊,你稍微写错了一个地方,那就不行,哎哎这个是在,空格。
哎我直接把那个粘贴复制过来吧。
它要传入的东西,唉这里还搞个这个东西吧,这个东西马上要讲的啊。
把写进去啊。
好那这里呢我们再写一个这个东西啊,这个叫OS这个东西在写不写都无所谓,其实,哎这个怎么有点不一样啊,等一下啊,我看一下啊,在哪里写的有点问题,I o u s e 7m long time,没有问题啊。
OB机电,诶这哪里写字写的有问题啊,重新来一下,先把那个去掉一下,把那个名字搞过来啊,就刚才他序列化的这个名字,Long time,点get long time,点1ABC,把粘贴复制过来吧。
来我们看看这边啊,好大家看一下啊,我这里呢先把这行注释掉啊,这行呢先不管它,先给大家解释一下意义啊,那么解说刚才在这边呢啊,我们把它序列化一下啊,这里哦这里是USDA,当你改一下。
好这里就是S12点TAT,好我们来这里呢来试验一下啊,执行先来进行一个这个虚化操作,啧嗯,改你妹的改的都死掉了,重新把删减一下,包名都搞错了,好了现在正常了,来我们这里呢执行啊,执行一下。
先把他这个地方呢,那他已经输出两个啊,你看现在啊,这是它把它进行了这个虚化,然后呢你再看这边啊,这边呢我在下面写了个re reader object是吧,然后这边反虚化的时候啊,大家看一下啊。
我们把它反虚化时候反虚化,他会对这个SERTIT呢做文章,然后呢我们再运行诶,这里突然计算器弹出来了,这是什么原因啊,其实非常好理解,我给大家端个点,大家就知道了,这是为什么造成的。
就是因为呢他在序列化的时候,不是序列化这个什么user demo吗,而user dmo里面是不是有个叫read objection,重写的这个方法,也是说是重写方法,而且你发现值呢是等于NG了。
啥意思啊,来我们来关注几个问题啊,升级一个在刚才那个是这里啊,然后那个反序化操作之后呢,反虚化里面有一个什么有这个东西,而是反虚化代码呃,他刚才那就是在这个什么简单易花,那就是重写的这个方法。
这方法里面呢去执行了这个计算器导致的,能你能不能理解这个啊,就是在序列化的时候呢,你序列化这个USDM,而USDM里面有一个叫real objection,然后呢你在反虚化的时候呢,你调用这个什么对象。
运行这个objection的时候读入的这个文件,这个文件是哪里来的,这个FLAM是不是这个SER点TXT里面来的,然后呢你在读它的时候,这个ITIN,就是从user demo里面给它序列化出来的。
所以user s e RT里面呢就有这个自带的,是什么read objection啊,啊这个read object,然后呢所以他就执行这个地方,所以啊这个造成它的原因就是什么。
原来就相当于这里呢执行的这个什么,序列化里面的,里面的这个方法,而不是是吧本身的,这个方法能不能理解它造成这个原因,就是这个意思啊,这是最最直接的他的一个安全隐患,但这个呢在实战中呢它是没有的。
因为很少人在职业搞这种事情,对不对,这是我们说解释下它的原理是吧,这个是这个他的一个解释,我们可以有端个点给大家看一下啊,是不是这个情况,大家看着啊,我在这里呢端个点大家就知道了啊。
你看啊我在这个object里面端个点,然后呢我运行它的时候调试一下,大家看着R呢点击调试,哎,看着啊,你看现在R的FLAM传入的值是不是SER点,Ttt,看着R呢,它的值是不是等于SR点TT,对的啊。
没问题好,我们往下进行呢,不如好,你看布的时候就弹出了这个计算器,好我们再步入下一步,那,那完了好这个呢好像大家没看到啥啥情况是吧,好现在呢我把这个代码把它开起来啊,先点这个代码给他看一下。
好我们家在这里在这里装个点啊,大家在端点重新来看一下啊,看他的流程啊,呃直接执行这里啊,端这里啊,端这里看端这里看好一点啊,哎搞错了点运行去了啊,好看一下啊,断点啊,重新来调试调试啊,好现在看这里啊。
那现在我全参啊,点击下一步了,不如好,你看PHILLIM等于SERTIT,看来我怎么执行啊,再不如好来到这个这个地方来了啊,你看再往下面进行好,这里呢由于他自己自己挑的啊,他现在执行这个函数的时候。
执行这个ober input string,然后来到这个自己对象里面,这个什么自带对象里面这个地方了,我们就把它补除啊,因为这个都不需要看的啊,不除好好往它再往下进行,好,来到这里了啊,大家看这里啊。
这个比较关键的啊,你看现在再往下进行,哎大家发现没,他来到哪里啊,来到user demo里面的什么这个地方来了,看来到这来了什么情况,刚才这个object这个东西。
按理来说的话是应该这个reader他应该是在哪里啊,应该是在这里啊,你看程序都是在这里的,我写这个代码呢,我把它CTRL单击进去,它应该是来到这个object input stream里面。
这个reader objection这个方法,但是当在调试的时候,他跑到哪去啊,他跑到这个user domo这个文件去,是因为这里重写的方法,导致它运行的是这里的方法,而不是这里的方法。
其实就是在我们序列化的时候,就已经把这个方法写到这个SER。
TIT里面去,然后TIT呢,大家可以呢去用这个010GIT呢去分析。
用这个工具啊。
ETT去分析会好一点啊,我给大家分析一下啊,嘶啊拖进去。
你看这里呢,就是它把它进行序列化的一个数据的一个情况,你这是那个序列化的数据,对不对,然后呢里面有些知识啊,这个分析那个TIT好看一些啊,但是这个也无所谓啊,你用的其他分析也是OK的啊。
能不能理解这个这个好理解了啊,我一个这个呃多少个点呢,大家都知道了,你看,然后你看啊,我们这里端下来之后呢,继续呢往下,然后他就执行这个long time呢,然后把计算机弹出来是吧,好老的,你看啊。
下一步下一步好,江西马上要出来了,好就完了嘛是吧,他这个过程呢就结束了啊,其实这个一断链条呢,大家就应该明白这个原理了啊,好那既然明白这个原理之后,这个反序的话难道就这么简单吗,那当然不是,你首先想到。
如果对方这里没有这个东西呢。
是不是,那没有这个东西,还有哪些反虚化的触发操作呢,我们这里讲的就是它的触发操作试点,我们今天只讲两点,讲两点啊,讲三点吧,还有个像这个就是比较关键的这个被讲讲,这个呢叫什么勾造函数。
析构函数啥意思啊,大家看着啊,还有个就是这个指向是啥意思啊,这个指向是啥意思啊,就是说我加上去之后,我们把运下啊,你看下啊,这东西要数一下的啊,来我先把反虚化大家看一下啊,就我加上去之后。
你看我运行它之后呢,它会弹出向七,然后呢值呢并且呢小于SEC呢,get到一呢写进去了是吧,这里有值是这里面写了个os default region,啥意思啊,就是说让它指向。
这是让它指向正确的这个读取这个地方,然后呢我再让他执行命令,知道吧,就是说已经来到这个object里呢,我为了保证它数据能够正确的解析,所以我先让他返回正确的,然后再执行命令,你可能说这不是多此一举嘛。
是这样的啊,就说如果说你把这个代码把它去掉之后,你再去运行这个反序列化的时候啊,对这个数据的进行反序列化时候呢,他虽然也弹出计算器,但是数据你看全部为空,为什么。
因为他引用的就是这OBOJECTION引用这个函数,而这个函数你怎么去把这个数据把它反过来呀,因为你不是那个原生态,那个哦,不a reader objection,所以呢我就说让他调用这里的时候呢。
我先不让它重新,怎么样把指向正确的地方,就让他搞到一个默认的这个地方去啊,这个地方呢你点进去是吧,你看他就是来到这个object里面,它就会自动根据这个需求呢,来到那个正确的这个V这句话的解释。
让它指向正确的什么,To do,这句话的意思就是他是吧,对不对,好理解吧,所以他也能既能正确的这个把反序列化数据呢,把它还原出来,又能呢保证命令执行啊,这句话意思是这个啊这个不是很重要啊。
给他说一下好,那么现在呢我们再来说,除了这个直接调用的危险方法还有哪些呢。
现在来看啊,还有一种方式,什么方式啊,大家看着啊,还有一个就是初始君,这个有点类似于pp里面那个什么鬼,析构函数那些东西了啊,在java里面呢我们就称之为方法,这个又是啥意思呢,大家看着啊。
额这里不是输出输出这个值吗,对不对,输出这个值啊,你看着啊,我先输出它,我把这里写上这个东西,把加上一个什么应用局部变量,这里再来看一下还有没有报错啊,嗯没有报错,好诶,诶这里还是有报错。
报错在哪里报错,诶报错都不给我显示了,没有报错了呀,哎这个颜色都变了,啧什么鬼东西啊,把它写到前面去吧,写前面去好吧,我写在里面啊,写个try嗯,写个try的一个容错的一个语句,好像没报错了啊。
这个容错的语句啊,这是try啊,执行一个计算器这个TRUSTRING里面的啊,然后你看你看这个是TOSTRING,然后这边呢我不做任何事情操作啊,我我先把这个地方呢给大家怎么样把它注释掉。
避免那等下说是他起的原因是吧,然后我我把这个read option里面注释掉是吧,然后呢我现在把这个也注释掉,先不让都不起原因,我先看一下,我自行,那现在肯定不会包计算器,只会进行一个正确的反虚化操作。
你看正确的反虚化作计算机也不谈了,好,那么现在呢你看我把这个代码给它取出来,然后我看一下,现在啊我们在运行,再进行反序化操作,哎计算器弹了,这又是什么情况,我刚才搞的这个reader object。
你弹了,我把猪死掉了,你不弹了呀,我换到这个trust string里面,你咋又弹了呀,啥情况,ch死君是个啥东西啊,进行一个是string方法的一个改变,那他是个什么情况造成的呢。
他是因为你在做这个反虚化的时候啊,如果这里啊对这个对象进行的这个,输出就会默认调用原始的这个什么,去这个对象里面的TOSTRING,方法那你看着啊,我把这行给它去掉,看着啊,我把这行去掉,我再运行。
你看他弹不弹,我去掉它弹个毛啊,没有弹吧,那我先把它关掉,免得你说你没有弹的,我玩这个呢,关呐弹不弹不弹,看着啊,他一出来,谈了为什么呀,就是你在序列化之后,这个对象如果有进行输出,为什么输出什么呢。
输出就是相当于把它当做字符串输出啊,你显示入串呢就会默认触发这个TOSTRING。
所以这就是我们说的反循环利用连的,第四种就是类似的这些他的一些析构函数方法,在用到一些东西的时候,默认触发,有点类似于P1P的反虚化的一些那种操作,pp里面是也有啊,就是什么对象被创建,对象被销毁。
对象被什么鬼转换,就会触发一些类似的一些魔术方法。
那这个java里面也有这种东西,但是它不像PPT那么多。
这是他的用,第二好,我讲到这里呢。
我不妨让大家思考一个问题,什么问题呢,我讲这个是为了干嘛,其实呢就是为了面试,为了后期你在对这种java的反序化呢,知道他的一个流向,就是我们说的java安全里面的什么cc0分析。
这是属于java里面的高端部分,这个课呢说实话网上呢是吧,也没有多少人讲,有人讲,但讲的也不是很多,他也是在java里面面试java安全的时候,温度最多的问题也是,不管是CTF还是这个瓦工里面。
那个高机器人非常困难的一个地方啊,因为大家也看到了,如果我们现在呢没有去讲这个java开发的话,那这个java反序的话,那我无非就是告诉你是个什么东西啊,你这个利用呢那就不用说了。
那个利用的也是网上分析出来的一些PC啊,什么那东西,那现在不一样了,但你学了之后呢,你就知道他是一个什么情况了对吧,所以说呀这个大家就知道了啊。
那这两种啊已经讲了两种,一种呢就是我们说的重写方法是吧,就说我直接呢重写了啊。
就是把那个在序列化的时候呢,啊过程呢就是刚才也说了嘛,就在序列化的时候啊,他不是要把它进行一个对这个对象呢,进行一个呃进行一个复制给读一下嘛,然后进行这个调用这个方法来去序列化嘛,哈对吧。
小正方把它进行进行这个序列化,而进行的时候呢,由于这个user dom对象的本身,文件里面的自带有这个什么read object,所以呢在它里面呢就有这个东西,那么你在反序列化的时候呢。
刚好反序化里面用到的这个什么这个方法呢,刚好又有个叫return object,所以呢他就相当会触发这里面的return,然后触发好,这是第一种啊,第二种呢就是我们说的啊。
这里有个叫truth string,一个类值的啊,它的一个构造方法,然后呢在这里呢诶有它这个例子的诶,你不小心呢啊在序列化的时候啊,哎你这个反虚化时候呢,你做了一个输出是吧。
把这个结果呢把它进行一个输出,就是这个序列化的一个这个对象,把进行输出,那就会默认触发里面的这个TOSTRING,所以TOSTRING里面的代码就会被执行,那么这里的wrong time呢就会被执行。
所以说这就告诉我们两点,这个反序化的利用和构造的话,不仅要看这个函数能不能啊,就是这方法能不能重写,还要看一些内置的这种初始菌啊,还有一些其他的是吧,是什么情况下面会自动触发它。
那么咱要看里面东西好,这是第二类,还有一类就是我们说的最关键的,也是最难的一类,今天呢我们就给大家分析一个这个案例啊,这节课说实话啊,这个知识点是非常难的,但是我们不得不讲他这是走向高端。
那个内容就是什么呢,就是我们说的啊,这个包含里面可控类的一些知识点,这又是啥意思啊。
那么我们来回想过来看一下啊,那么既然这里呢重写re build a re read object方法啊,即使计算器,那么我们思想一想啊,来,现在我换一个啊,那如果换一个name呢。
换一个类里面自带有这个read obli,有自带有领,会不会出发了,对不对,这样换一种啊,我们注意下啊,来我们在这里呢是用的是我讲完之后呢,我再给大家总结啊,我们先把这个实验实验了,换个类啥意思啊。
你刚才呢是对我们这个user,当某这个类呢做的这个封装和序列化操作,我现在换一个,我不用这个user demo了,好我们再创建一个啊,叫URDS,好这个呢还一个R继承一下,说实话我说实说实在话。
我不想讲这么东西啊,我真不想讲这些知识点呢,确实离我们这个现在上课内容呢已经过高了啊,这大家能听懂多少就听懂多少,这主要是为后面讲这个反虚化再做准备,我怕到时候我讲这个反虚化呢,没有这前期的开始呀。
你后面听都听不懂,或者说我伤都伤的很困难,所以我这是没逼,没办法逼着说要给大家先灌输这个思想,那后面再听的时候,那就不会说有很大的问题了啊,好啦这里呢就是什么意思呢,大家看一下啊。
就是这里呢我们就写两个东西,我把这个反虚化这两个操作呢都给他搂过来,大家看一下啊,都到这来,这是这个这个是序列化的,然后呢我把反虚化函数呢也漏过来,落在里面,又要点个S里面去,两个都写进去啊。
然后名字换一下,这个缓存叫UR点TXT好吧,DNSS点TT杠好,写进去好,写进去之后,这里呢去搞个什么事情啊,大家看着啊,我用一个叫哈希map,这是什么东西啊,这个是自带的一个类啊,自带的一个类。
这个类呢是专门做一些浏览器访问和DNS,S类解析的一些事情,他是主要做这些事情的啊,然后我们搞个什么事情呢,找个哈奇等于创建个这个对象的啊,导入类哎,等一下导入错了,这个还导入嘞,好这个小之后呢。
我们先给大家看一下啊,这个写好之后,这里有个new对象嘛,有哈奇是吧,然后你看啊我就随便搞个哈欠put啊,先我们来把原理啊,先把结果给他实现,实现之后呢,我们再分析原理啊,你看我写个什么东西啊。
加put,然后呢这个,U r l,再乘个U等于U,R等于U等于个值吧。
写个这个迪斯logo字啊。
等会这个字,哦这里搞错了啊,不是不是不是不是这样写,我里面的还搞搞搞错了,Hot pot,Are you,Gary,哦应该是这样的吧,嗯这个UR这个路径不对啊,这个里面的不要搞错了。
这个呢是在我们之前的一些东西里面有好,可以了啊,然后呢现在呢我们这里创建一个流,然后呢呃我们先把它进行一个序列化来看看啊,我先序列化,我虚的话谁啊,我虚化这个哈奇啊,顺着哈奇,然后呢。
需要哈起好序列化哈奇之后把异常性添加,我们先看下是不会生成一个DNSS点TIT,其实他就是向量很简单,就这里呢有两个啊,一个是哈奇对象,一个是这个URL对象,然后呢就用这个哈奇点put呢。
来去这个UL对象里面的这个地方,然后一个一个值啊,我们先不管这个是干嘛的啊,好我们来把它序列化,序列化之后呢,它会生成一个角DNSS点TT的这个值,好我们先把运行下看一下啊。
先运行看他是不会生成一个这个DSTIT好,果然生成了,生成之后呢,你可以打开看一下,来这里呢我们可以用这个工具呢打开,给大家观察一下,呐这里是有哈奇map的,有这个java ur的。
那这里是有刚才这个值啊,你看刚写了个值在里面啊,序列化的数据他也把序列化了啊,那么现在再来观察一下,用这个UN,反循化来去引入,我们要对这个DNS点TIT,进行个反序化操作,天天记它好。
那么现在我们先来看一下这里啊,有没有数据。
这是谁呀,不要这样搞啊,随便换一个地址,好来看着啊,两步啊,幸运起来,一圆形先反序化。
然后再那先序列化,再反序列化完之后再看结果,你看有结果了哈,这个我不知道是谁在访问啊,这个你看IP地址啊,如果是武汉的,就是我自己的啊,不是武汉,就不是看这个是哪里的,湖北武汉的,然后这个呢。
也是湖北武汉的好。
你看啊这个呢就啥情况造成的呢,我给大家说一下啊。
如果说你不写这个序的话,你不写这个序的话啊,他是不可能有这个事情的。
我们再分析个例子,大家不要去访问,不要捞眼子,知道吧,你看我这里呢这样不写反序化啊,我让FILIP的,他是接收不到数据的。
啧哎,我真没办法,你这个你要这样搞吗,我他妈刷新个地址,你访问一次,你发新地址,你访问一次是这个,我也不知道是我这个代码执行出来结果了,也不知道是你方的结果了,先判断自己本地地址,你搞错了啊。
这是DNS解析,不是不是说你本地地址能看到的,这是底应该是协议,知道吧,底应该协议啊,这底应该是减一,不是其他的,那这样现没有啊,再来看一下。
我先执行之前我先看一下啊,我再等一下,你好像没有R的。
没有执行,唉我是真没办法呀,哎呀真的是好玩啊,好好好玩啊。
用本地地址很难去那个,用那个茶几还可以那个裁剪,他这个应该是协议啊,和那个传统访问那不一样啊,不是说你创建个网站,那个看那个接受访问请求,就是的那不一样的啊。
按DS协议解析不一样啊,我知道用那个bob shot里面那个东西可以啊,这个无所谓的啊。
大家看效果行了,他不让我讲效果,那就不讲呗,反正吃亏的也不是我。
那我真没办法,他要这样搞嘛是吧,随他去啊,我不就不做这实验了,我就直接跟你说是为什么原因就可以了啊,也不管了,我们看一下啊,这个地方呢,额,按理说这里呢他是不可能出现这个。
DNS请求的地址的啊,这里为什么出现这个情况呢,很简单道理。
但是有人在访问吧,是不是你正常访问,你这里不会有的啊。
那我看我执行完之后呢,这里呢它是不会有的啊,又有了,这就尴尬了啊,啊他要这样做呢。
我们没办法啊,他顶着这样搞那个啥办法呢,随他去啊,我不管他了,我越给他说,他就越得意,我就干脆不管他了,随他去,直接给他说原因啊,我看一下这个是什么原因呢,按照我们刚才的思路来讲。
那他重写这个read open的方法啊,他是执行计算器,就是其实就是说这里呢有一个叫HASHMAP,有哈希map,他在里面创建一个对象,那么我们呢对这里呢是进行了什么,看一下啊。
序列化的序列化的对象是这个什么哈奇,那么哈希呢是来源于什么,来源于这个自带的这个什么V哈,希map类里面就在这里面的,它是在这里面的,它是这个我们自带的类自带类,就是java这里可以自带的哎。
那个java环境里面自带的还有用在这里,对不对,然后这个自带类不是我们这个user demo,我们之前做的是user demo,是我们自己写的这个类,而现在呢就是说他是自带的类里面的是吧,自带类里面的。
而自带那里面呢,他去对它进行这个虚化操作好,后面呢再把它进行反序化是吧,那这里为什么会造成这个DNSS的一个解析呢。
啊我给他说一下原因啊,网上呢在我们虚化利用工具里面。
来这个YSOSER这个工具里面呢,啊他有个过程,那大家可以看一下过程啊,来HASHMAP点read object,然后再来到这个put VR,再hash hash code,啥意思呢。
就是说为什么造成就是这四个地方啊。
四个地方就首先呢你在反虚化时候呢,是会触发这个read objection呀,而WEGOJECTION呢在这个里面它也有,在这个里面它也有啥意思啊。
它的过程我发现晓得来这是链条啊。
连,那这三连啊,啊这上捏这个捏是个什么情况呢。
啊,这个工具是一款反应循环利用工具啊,这个用LDSS的,然后呢这个是就是用的这个哈七呢map,就是呢它这里有个实验结果啊,我们严格不看,那这创建呢这是和我们刚才差不多的,那这个it put呢。
然后呢他利用这个反射的去执行啊。
然后呢进行这个序列化操作时的执行它粘链条,这个链条呢我们先不管它,因为现在我们不是分析说哎,为什么是这么个情况,我们分析是说他为什么造成了反虚化这个漏洞,为什么它能解析DNSS,这是我们分析的。
至于说为什么代码这样写,我们先不管它,这是不是我们现在操心的就是个粘的构造,那不是我们现在能接触到的,我们先知道这个反循环当中的一个情况,和安全问题,他的一个那个利用价值,你看一下啊。
HASHMAP里面我们刚才呢是用的是user dumo,user dumo里面呢调用了这个韦德,那么然后呢我们在这里写了一个这个函数,然后呢应用这个函数的执行命令,那么同样道理。
现在呢就是它新建对象是HASHMAP,HASHMAP里面我们看一下啊,来点进去,在这里搜wait,Or project,你看是不是有这个东西啊,是有它呀,那么也就是说当你进行反虚化的时候。
就会执行这里的read objection,然后资金里面就会有一些类似的一些解析,其中就有我们刚才看到的他的一个解析流呢,put ja点进去,然后这里呢又有什么有一些哈气,有一些哈气,那他有这个东西。
它就哈气,对不对,还有一些东西啊,啊包括这里呢来点进去搜wave in party,然后这里有这个东西是吧,溶解之后呢,这里有put put8呢,这里哈奇呢点进去呢,这是哈奇哈奇名叫哈奇code呢。
再点进去就是他一步步的跟踪过程呢,就在这里了,到put VR,再到哈希哈希到hash code,然后最终呢它这个函数,最终结果hash code是干嘛的呢,就是一个DNSS的一个访问。
所以其实就是很简单,它这个链条是什么情况呢。
就是正常代码中啊,正常代码中呢啊去用到了这个哈希map,创建一个对象啊,我们把背景交代一下啊,把背景写大家就知道了啊,就是啊正常代码中啊,这个使用的这个什么创建这个对象啊,哈奇map。
然后呢这个时候怎么办呢,啊领导了这个,原生态的这个什么reader obo jection啊,方法去反虚化数据是吧,对不对,反虚化它,然后呢就是他肯定是有个写满,有个反虚化嘛,反向这个数据。
然后呢这个方法呢也是一样,导零呀,作为啊原生的是在在这个obo sexting setting in BO,刚才我们跟踪过啊,是在这里面啊,在这里面的啊,就本来在这里是吧,不要在这里。
然后呢由于啊这个哈希map里面呢它也有,所以他也有这个东西啊,也有这个什么,方法,对不对,也有这个方法,然后呢所以说呢就是我们说的第二三步了,那么反序化操作的时候啊,调用这个东西的方法时候呢。
这调用的是谁呀,调的是哈奇mono里面的什么,这个对不对,他调的是tag了,而这个里面呢它的链条就是执行流程啊,执行顺序,执行连。
是一个什么过程呢,就是我们这里啊分析到的这里呢怎么分析。
我们先不管它,后期我们会说的啊,这不是我们现在担心的啊,这个执行链条,下载来啊啊这个最终的结果啊,这个最终的结果啊,他的一个执行结果呢就是一个触发访问JS请求,那么同理,如果这里是执行命令的话,那么。
就是一个什么RC1,能理解了吗,再把这里写上去,大家就应该知道他是个什么概念了啊。
所以这种呢就是利用我们说的第二种方式,就是里面呢有一些可控的类,这个类里面呢有这个东西,知道了吧,好那么大家问一下啊,如果现在呀我换一种方式啥意思呢,我这个反虚化实现的方式呢。
不是有这个叫write object和这个reader obb惊喜吗,那还一个我要是换成了这个什么。
下面这种插件里面进行反序化序列化,那么今天这个东西,我们讲的这个东西能不能触发出来了,大学能不能触发出来,是不是就不冷呀,为什么说不冷呀,因为你能的原理是。
因为这个read objection他是重写导字的,除了重写导致我还讲了个那个初始菌,导致就是字串的这个数据给他导致。
对不对,但是现在呢你用到了个这个,另外的这种茶几里面是吧,就是我们说组件里面的一些那种反虚化的方法,那么写法就不是这个东西了是吧。
包括下面这个是吧,写法就不是这个东西啦,那写法不是这个东西,那你这里的这个比如说这个啊,用的这个哈希对不对,那么这个rate objection有用吗,没用啊是吧,他函数都不一样了,方法都不一样了。
还有屁用啊,那就不是那个触发流了啊,所以啊大家要明白啊。
他这个链条呢是要取决于对方的这个什么。
序列化和反序列化用的是哪些方式,同时呢还要关注对不对,序列化的对象是自己写的还是网他自带的,然后对象里面有没有类似的一些这种方法的,同同同类方法的东西,包括还要考察这个什么构造函数,里面有没有被触发到。
像什么求string是吧,输出的时候包子,所以他的课程量,大家可以想象一下是多么的庞大,这个反循环的课程,你要把讲就要讲什么呢,你想都想得到,那像以上的这是六个是吧,不至于我只写六个啊。
不是说只有这六个啊,不是只有这六个,这是我写的常见六个六个里面那个反需要操作,然后呢还要去看哪些这个类里面,哪些组件里面有这种东西,这个量啊,这个想一想就是六乘多少乘四,我就说6×4就是24种。
可能都已经写上去了,这还只是说分析他有没有安全问题,和这个粘的一个过程,还没有说怎么去写那个POC,所以说啊你要说完全搞清楚这个反序化,从分析到写的话,这呀不用多说啊,我们也讲不那么那么深,对不对。
我们尽力而为,在后面的反学二课程中呢尽力而为多讲一些啊,把这四种可能性呢,都给大家以实际案例呢去分析啊,也是按这个图片来讲的是吧,分析这个反射工具的实现原理啊,分析它的链条啊。
这也是我们并且呢在链条的实现过程中,还有像什么RMIG,RMPZNDI3种协议分别是什么,这也要讲哎呀这个课程量啊是非常大的呀,啧不过我们现在叫开发,叫开发了,只是讲是什么东西啊,至于后面的一个利用。
这其实很简单的道理啊,除了分析开发呢,就是这个漏洞的产生的根本,然后呢再就是漏洞产生的原因,再就是漏洞的验证,验证的就包括验证的POC,那这个验证poo c呢就是非常关键的,像这个什么鬼啊。
MIJDJNDI呀,就是那个利用的那个协议是吧,就是属于在腌制的时候,会用到POC的那些东西,很复杂很复杂啊,不是一科两科的事情啊,如果说你压根就没有学过java的话,没有这些开发经验的话。
是完全听都听不懂,不知道是啥玩意的啊,你这里呢大家如果说实在听不懂的话,也可以直接这个躺平啊,不用去学也是OK的啊,只是说呢你为了成长为一个红队的一个是吧,中高级的选手,这个也是不得已啊,去学的啊。
不强求啊,我们讲了这么多呢,也是不强求的,基础不一样啊。
好今天的内容呢就这么多了啊,我们下节课要讲什么呢。
也不用多说了,下节课要讲的内容呢就是关乎这个,啊组件内的一些安全问题啊,然后还要讲啊,后面呢还要讲这个什么RM啊,什么JDJNDI是干嘛的,要把它进行一个普及,普及完了之后呢。
大家就知道这以后碰上这种什么鬼,什么IM啊,什么J跟DI这什么鬼啊,大家至少呢也知道了啊,我们也达不到说把他交完之后呢,大家就能什么就能这个干什么事情,但至少啊大家以后碰上这种漏洞的时候呢。
你能够看得懂,能够分析上来啊,也不至于是吧,漏洞给到你,你都不知道怎么玩,那就没办法了是吧,哎网上有时候有时候呢经常包一些漏洞出来,那漏洞呢给了一些这种东西,有些人玩都不会玩,这很正常啊。
这java类的都没学过,玩都不会玩那种给到你的都不会玩,我们呢就不能做这种事情是吧,至少学完之后呢会晚两招是吧啊,至于说能不能挖到漏洞啊,这不强求啊,这个太难了啊,这个知识点太多了。
你这个java开发能学好,这已经很不错了啊,你搞那个什么安全分析去玩咯,那不现实,好我们今天就说这么多了啊,这个是反虚化的第一次讲课啊,不是有很多人老在问,就我上次开发的时候。
那有人就问说哎后面讲不讲什么这个内存码呀,什么这个反虚化我都说的很清楚了,我讲的是开发,我不是说我今天就像我今天讲的这个反虚化,我讲哪是告诉你在java中这个东西是个重要点,这个反序化是怎么操作的是吧。
告诉你的漏洞的一个成因,告诉你的,我并没有讲他该怎么用,他还有哪些便衣,还有哪些品种,还有哪些分类都没有说,但不是说不讲,因为你有这个入门点了啊,你有这个点了就知道这个东西了,我后面才好下手。
开始在这上面去开花,结果呀,你这前面都没有听说过,我当时如果就很简单,我们去讲漏洞的时候是吧,讲漏洞的时候,我直接说哎呀,今天讲java反虚化,我就把代码往这边一填,填了之后,我就说哎呀该怎么利用是吧。
哎什么情况,你说咋个搞嘞,对不对,还是要从代码上面是吧,这是什么情况导致这个too string是什么情况,这个什么read open惊喜啊,前面学过那代码呢至少看得明白也不会,至于是吧。
代码我把你贴上去,把例浮现啊,没有任何意义啊,那你永远碰上了换那个东西,你就不知道咋办了,所以说还是要懂点代码的啊,没办法,这个漏洞的核心呢说实话都是这个代码造成的。
而懂代码呢对于漏洞理解呢会大大大大提高啊,你会发现在后面我们学漏洞的时候呢,你把前面代码呢能够学明白,学了个大概之后啊,你再去看后面漏洞的时候,你会发现很多东西呢都好理解了,就不至于没有思路了啊。
这就是我们的核心的点啊,今天就讲这么多啊,下节课呢我们就讲这个JWT和那个,框架嗯,就身份验证的这个东西啊,身份验证的就是JWT的原生技术和那个组件,会同时提到这个JWP的安全问题和,组件的安全问题。
下节课会讲这个东西啊,有些听都没听说过啊,啊课程越来越高端了啊,现在我本来不想这样去讲的,没办法,现实生活送所逼啊。
这一期的课程呢是提前上了难度啊,提前都已经给大家把难度上来了啊,希望大家呢先一后后一啊,先打后一把这个难度先难的先啃一下,后面的就会轻松了啊,当然了,后面不是一致的,轻松上到java那里。
那中国都还是要困难的,那是没办法的。
短时间是不可能把那个搞明白的,都是给大家做一个简单的讲解和入门,然后呢后面呢大家根据自己的java的技能啊,花时间去累去练,总有一天是吧,你就能豁然开朗,到时候不管是面试也好。
或者是分析漏洞的好。
P36:第36天:JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入 - 逆风微笑的代码狗 - BV1Mx4y1q7Ny
呃今天呢是在java的第几次直播了呀,第五次还是第四啊,第五次了吧对吧,还有四次啊。
嗯讲一下什么呢,讲一下这个java的第三方组件的一些安全问题,像最近几年比较火的几个组件的安全啊,logo世界啊啊fast JSON呀对吧,对这几个漏洞哈,那主要呢就是学习这个漏洞,那从怎么得到的啊。
其实我们从这个开发的角度呢,啊学习使用一下这两个组件,然后呢观察一下像这种漏洞呢,主要是看哪些方便啊,然后呢这个漏洞又是怎么形成的,呃至于这个漏洞的分析啊,我们留着后面再去讲啊。
就漏洞的那个细节呢留后面去讲,我们主要是聊清楚啊,这个科呢就是第一个呢,就知道这个漏洞是怎么产生的,这是个什么东西是吧,开发中为什么要用到它,要了解这几方面就可以了啊,我们来先说第一个啊。
这个叫做local4J,那local4J是一个什么鬼东西呢,我给大家先解释一下啊,logo世界呢它是一个开源项目啊,他是在这个java e1里面呢,呃可java这个程序里面呢用来的用来干嘛的呢。
简单来说就是日志的一些相关的处理,对就是对方呢可以利用这个logo时间呢来实现啊,对这些日志啊,包括这个服务器日志啊,还有一些这种各种各样的日志呢,来做一些这个处理啊,简单来说啊。
他就是一个这个java项目中的一个,第三方的一个组件,一个项目,用来呢帮助我们在java程序运行的时候,的一些常见日志呢进行一些处理啊,控制这个日志的一些信息收集,就是说凡是呢有用到过这个java啊。
并且有日志需求的话,就可能会用到这个组件,那么实现这个功能,那么用到这个组件之后,由于这个组件呢有安全问题,所以呢就会出现安全漏洞,学完这个安全开发,利用log4J呢来实现这个漏洞复现的话。
也是能够帮助我们到后期呢,白合审机负责这个第三方组件的安全的检测,包括漏洞复现,logo世界的这个漏洞呢都会有帮助啊,这是我们讲他的一个重点啊,那么现在呢我们就来给大家演示一下啊。
在java11中呢来在实现这个logo世界的引入。
包括这个漏洞的一个介绍啊,开发角度来去讲,加之前啊,这里有一些环境呢大家要自己搭建一下啊。
就是包括这个MV1N的,因为这里呢涉及到这个第三方的仓库组件了,所以大部分的都会用这个啊,没啊ma法,那这些个东西呢来实现这个仓库的整理,然后这个呢啊如果说你不设置的话啊,他可能会有一些问题。
什么问题呢就是有点man啊。
因为这个仓库呢是从外网去下载的啊,一般呢会通过这个IDE1呢配置一下。
这个拉法上面的一个这个这个配置呢,来实现速度更快啊,那么这个相关的配置呢,我这里呢给了一个文章哈,大家都可以下去呢配置一下啊。
就是从这个id音呢,如何烹配置这个MAA的一个长消响一步骤啊,去下载,然后呢去解压,最后呢再添加环境变量,最后呢再设置一下配置一下,在这里再加上这个本地仓库和更新的,这个默认源啊。
这里的指向的是阿里云的这个圆啊,然后去下载,不然的话他从官网去这个下载的话,拖这个解压包呢速度有点慢啊,把这几步都自己做好啊,我这里已经给他做好了啊。
我就直接来演示一下吧,这个呢是一个仓库啊,这个是一个,那个就是你要在网上引用一些第三方组件的,一些解压包的时候呢,他需要从网上去下载,然后呢你如果不配置的话,网上从其他地方下载外网去下载。
那它的速度非常慢,因为都是国外的一些这种仓库物站啊,啊配置阿里文那就会快一些啊,我们先来说这个logo世界的啊,那引用下LOCC的这个DUM啊,学习使用log4J,然后呢顺便把他的安全问题呢介绍一下啊。
名字叫log c dumo,然后这里呢选择一个版本啊,选择版本之后呢,这里那选择新建项目的这里啊,当然了你也可以在这里呢选这个地方,然后呢点击这个地方也行啊,来选中这段java代码。
那选择这个构建系统的为麻烦,然后呢,这里呢这些地方呢可以自己的去选择性的,这个写和不写这个无所谓的啊,然后点击确定啊。
创建好,这里呢就创建好了啊,创建好之后呢。
我们要给他锁一下啊,呃创建好之后呢,这里有个叫外部库,这个外部库呢就是我们说的引用的架包,也可以看到,现在目前引用的是这个我D盘的一个JDK,1。80的一个这个架包啊,这个自带的啊。
就JDK里面呢有一些自带的,就是我们常见的一些这种是吧,里面一些内资的这个函数啊,这些东西呃,但是这里呢没有logo时间啊,那么如何把logo时间引用进去呢,这个也是非常简单的啊。
首先呢我们来到这个前面。
给大家给到过这个仓库的这个官方章,在这里搜索是吧,locals j啊。
搜索LOCJ,把引用进去啊,1。8和16有什么区别,哎呃区别没什么太大区别啊。
就是1。8呢用的比较多而已,那就这条啊点进去啊,大家可以看一下啊,呃这里呢就有很多这个类似的这个版本,大家可以看到啊,来包括这里呢也有是吧,来这里那有很多这个类似的版本啊,嗯然后你看到啊。
这个版本时间和还有什么,这个上面还有这个什么鬼,这个用到的这个人数啊,包括还有些漏洞呢,这是出现过的漏洞,那个这个logo时间呢,这是在前面几年呢出现过这个漏洞的啊,这个螺丝钉漏洞一大堆样呢很多啊。
在前面几年呢,当时报了一个这个CV2021年的一个漏洞啊,当时那是相当火的啊,那个漏洞,然后呢,我们这里那就找一个这个那个世界的这个,作为一个演示吧,对不对啊,我们就选取一个年份的啊,用哪个版本呢。
用个这个吧,2。4。14的啊,20年发布的,那就用这个版本,2。411也行啊,点进去啊,那在那下面呢就有这种哪几种这种这种东西,这啥呢,这全部是那个构建仓库,那现在用的最流行的就是这个MAA。
这里呢直接复制啊,把它复制一下啊。
把这个代码复制一下,然后怎么办呢,啊看一下啊,在IDE1这边呢,来到这个poo m XML,这是干嘛的,这个就是那个MAO的一个配置文件,然后在这里写上一下啊,先要加上这个啊DIQ。
然后呢再把这个代码复制进去,那这个意思呢就是说配置这个XM文件,这个文件配置好之后呢,那个ma呢,它就会自动呢根据这里面的需求呢去下载索引,你看啊,默认现在是没有的,只有这个是吧。
我们这个螺丝C的这个这个仓库的一个架包,2。4。1版本的,然后呢把它进行一个保存,对不对,保存之后呢,你会发现呢这里呢并没有出现这一个这个架包,该怎么办呢,然后这边呢呢id这边有个这个呢。
这个呢叫加载MARVA的一个更改啊,把它一刷新,那它就会从网上去下载了啊,我这边由于配置了这个阿里云元,所以他很会从阿里云的那个镜像站,那那这个速度非常快啊,如果说你没有配置的话。
那么可能从网上下来有有点时间啊,我们来点一下来点一下,你看你看这里呢自动呢外部库这里发现没,就自动就亮了,你看看两个架包之中出来了,你看呢看没看一个API的和一个CRE的,两个人呢2。4141版本啊。
包括现在一样啊,你看啊,我现在把它改成audience140啊,我把它选中,你看现在没有是吧,我再刷新,你看那你看是先变成20140了,这个版本它自动帮你从网上呢把他拉下来,好在自己仓库啊,2。
140啊和2。41那都可以啊,这个无所谓的啊,我们还是用新一点版本啊,好选中诶,一样的啊,这个马宝呢就把他拉下来了啊,拉下来之后呢,我们就可以利用这个东西呢来做这个开发了啊,好我们现在来看一下啊。
这个logo时间的一个代码的一个浮现啊,然后呢我们在这个java文件里面的去创建一下哈,那比如说我创建一个这个叫logo4J是吧,test的一个这个文件哈,好先进去,然后现在呢我们怎么搞呢是吧。
我们看一下啊,它造成漏洞的原因呢其实非常简单,我来先把一个main函数写进去啊,首先呢呃他先定义一下啊,然后一个logo这里要注意啊,这里写的时候要注意在哪选中呢,我们这里有一家logo是吧。
这里呢有JDK自带的logo,还有这个ORG阿帕奇logo4J的,这个我们要选择这个啊,就你不要搞错了,你不要说这里写了这个,那写这个呢你引用的是这个系统的啦,这是这个系统的啊,你不要搞错了啊。
我们这里呢要应用这个什么,引用这个来挂机了对吧,就这个啊,你用它来里面的,然后呢随便再取个名字就叫logo吧,然后等于什么呢,就是引用它来啊,也是这个呢这个里面呢这里有两个了,我们选用这个了对吧。
选他是吧,然后这里说导入库,那把库导进去,Ok,哎这里还报错了,是什么情况,哎呀怎么又报错了哟,上来就给我翻车呀,这是哪里啊,哪里出问题,我看一下啊,提示是什么形式,logo从未使用哦。
这个把使用一下就可以了,好可以了啊,Y1个名字似的啊,无私于请求开启实时专线,什么情况,内鬼在录我的这个东西吗,哎这哪里写错来着,他引用不这样,你看把我导错了呀,哦这里啊,这导错了,妈的个锤子。
我说怎么回事呢,我还叫你们不要导错包,我自己还导错了,报你妹的,好大家看一下啊,那你这里呢我们就随便输出个这个错误的,123啊,或这东西啊,来个先看一下,来我们运行一下,大家看一下啊,那个呢。
就是利用这个java代码来去调用这个logo时间,然后呢来实现呢,它输出呢如果说这里的有错误的话,就会输出一个123码,就直接输出这个坐着一个三,你看error这个LC的一个日志呢,输出一个三,对不对。
好,你看一下啊,然后呢,他的一个网上那个代码漏洞利用,是个什么情况呢,大家试想一下啊,大家知道这个情况之后啊,你看一下啊,我现在可以随便取个变量啊,你看他的一个漏洞,原因我不介绍了。
我这主要说下第一应用,就现在这个代码呢啊把它写一下啊,使用这个log4J的实现这个日志的这个输出啊,然后呢你看啊我们这边一个这个code啊,等于什么啊,大家看一下啊,这样写呢没有问题啊。
当你如果这样写的话,你看一下啊,我们随便写一下啊,变量是吧,java os或非M,然后这里呢再去写啊,Code,好你看一下啊,现在这样去写,你看会发生什么情况,来看一下啊,那输出个win十十。0。
这啥情况,这个java os是啥情况,前面加个这个符号是什么鬼东西啊,你比如说现在的话还可以输什么VM对吧,都可以哈,它其实呢就是说,如果你这样去写这个代码的话啊,它就会输出这个里面的这个东西。
这个东西呢被执行之后呢,是以java代码去执行java代码,执行这个东西呢就是java点VM,就是它的虚拟器OS,那就是它当前运行的操作系统,他就把它进行输出吧,这个扣的嘛。
然后你看就输出了这个我的超系统版本是吧,Win 10amd,我是win11呀,但是速度不准确啊,但无所谓的啦,你看这里那就出来了是吧好,那么你试想一下啊,这个呢就能直接执行这个里面东西。
那么那么利用点就来了呀对吧,如果这个地方这个coder呢在输出的时候啊,我们就可以简单的去写一下这个成因了吗,那如果啊,这个code变量呢,是吧,是可空的,那么这里呢就相当于可以执行命令嘛,对不对好。
那么我们现在想一想啊,前期在这个logo4J这个漏洞爆出来的时候,网上给到的相关漏洞。
我们可以看一下啊,这个螺丝给的一些利用的一些这个测试东西,我看是什么鬼。
网上是有很多的啊,哎他说一些浮现的一些东西呃。
他是怎么浮现的呢,哎我不知道大家还记不记得啊,网上那还是有很多的啊,这个是他分析,然后那这是一些常规的一些这个利用的,什么plod呢,这很多呢也像这样写,对不对,那像这样写啊,这什么情况呢。
然后当时报这个漏洞的时候呢,利用点呢就是什么地方能查的,就往里面查就完事了,有没有这个漏洞呢。
我不管就是往这边的能查什么东西呢,就查什么东西,查什么东西呢,就是查刚才是像这种东西啊,就这东西,那这个是什么东西了啊,那么现在呢,我们就模拟用一个网站来去测试一下啊,用个网站来测试一下。
就是我接受任何变量,比如说我这里呢一个登录的,然后登录里面呢去结束这个什么鬼,登录的账号密码,然后账号密码一旦错误了,我就用这个把输出一下,把日志呢调试一下是吧,就用LOL时间量来实现这个登录操作啊。
来我们来搞个网站起来,这样呢更加的符合实际啊,叫一是吧,web服务啊,然后这里取个名字啊,就叫这个local severb,周末是吧,然后呢取它上去啊,然后web程序对下一步,下一步创建啊。
就在这个窗口上面,然后现在怎么办呢,按照我们前期写了个原理来讲的话,也非常简单的那样是吧,在这里呢创建一个这个,logo4J的那个测试的地址嘛哈,外包script,就传个所咳创建个啊。
然后呢这里呢继承一下,就和之前我们讲那个前面还有没有印象,讲这个script达那个地方的啊,写一下啊,然后呢do get方法呢去提交的时候呢,然后呢结束一下这个值吗是吧,参数值。
然后呢我们就接受叫code吧,先只是个code啊,这个时候呢再到这边呢用个变量来结束循code啊,对吧,结合这个string code,然后在这里呢也是把刚才那个代码呢,给它输出一下点。
现在呢用那个操作啊,把这里呢先把那个库也把导进去,还是按照刚才那个操作一样,先把那个包呢,你看现在包呢是没有那个啊,没有那个ORG那个LUCD的先包导进去,放上来保存,刷新一下。
看这边那看到没多了两个是吧,对,有了之后呢,我们再来引用这个库嘛,是不是引用这个库啊,那我把这个改一下logo,还是按照刚刚那个思路来是吧,然后选取这个对应的啊,这个地方的,然后名字就叫logo嘛。
这个地方的是吧,get然后取名这个地方的点class好OK啊,这个把它写好啊,写好之后呃,这边呢我们就引用它嗯,引用一下logo解释过来之后呢,进行一个什么输出啊,点ARROLL是吧,输出什么东西啊。
就是刚才那个利用代码把code来进行输出,好,大家看一下啊,这是一个网站,然后呢这里呢要给他一个访问地址嘛是吧,按照前期讲的web scale,可放梨子这里访问叫log4J吗,测试点就叫log c。
他给了个访问例子,然后启动这个tm cut啊,那么现在呢就是利用这个东西呢来去访问它啊,访谈呢接受这个访参数扣的。
然后呢用这个LOCC呢去执行它好,我们来先看一下啊。
比如说像现在啊logo是J访问,logo是J地址是吧,后面再加上我们的参数,code等于,比如说我就给他传递刚才的参数,java杠5S执行,执行,然后你看看它输出的结果里面,是不是有这个值啊。
你看有这个值吧,为什么输出两条或者浏览器的问题啊,我把它放到这个浏览器上面来,就是输出一条了,你就输出一条了啊,好能够输出,那么如何来执行计算器呢,如何能执行命令执行呢是吧,就是很简单的道理啊。
这里呢就是很简单啊,就是利用这个什么勾,找这个ATP网站web服务啊,然后呢这里呢去,使用这个带漏洞版本,带漏洞的这个什么log4J组件,对不对,要实现这个功能啊,嗯好那现在呢这里也能访问是吧。
如何去利用呢,我们看一下网上啊,网上呢针对这个漏洞是怎么利用呢,就是写这种东西啊,写这个这种东西,这个什么JNDILDAP这啥东西呢,好我先给他解释一下啊,这个是什么东西呢,呐结合点癌。
一般称之为金根底压注入,它是java里面的一个自带的一个客户端API。
是干嘛用的呢,这里有一张图片是啥用的呢,就是它是java里面一个API,它干嘛呢,它里面有这个LARLDAP方法,还有这个IMI这两个最常见的。
那这两个是干嘛的啊,网上说大概介绍是干嘛的啊,这个有大概的一个说法哈,其实呢就是这个java里面自带的一个东西,他利用这个JDNI里面的这个ORADP,你可以往下面看啊,这个网站是有没有这个解释啊。
这个也是我们下节课要讲的,现在呢就是说先用它啊,就是一个带带接口来去触发,简单来说呢就是可以搜一下这个啧,他的一个大概介绍啊,连网上有写了,哎他的实验服务,然后呢简单来说呢,他是一个干嘛用的啊。
可往下翻,好了,这个都没写太清楚,啊他这里面呢有一些这个东西,然后呢你看啊,他说呢这个arm呢是一个远程方法调用,它实现什么东西啊,他说这个可以干嘛呢,就是可以呢通过网络去请求远程的一个服务。
也就是说他其实就是可以进行一个,远程调用是吧,远程方法调用,就是说你在远程的构造一个方法啊,他可以远程调用,这是IMI,然后还有一个就是我们说的这个奥迪P,奥迪AP是吧,他说是一个什么鬼。
这个服务处理工厂啊,这个呢就这个也是可以调用,远程的一个2D服务,这个呢我们先不用去理解啊,我们后面就会讲他的啊,好我们来利用一下啊,他为什么这样利用来。
你看着啊,我现在怎么做啊,大家看着啊,既然他这里呢这样取code,它能执行是吧,看他能这样执行。
如果说这个可空,我们来搞一个事情啊,你看啊,我用个工具,这工具的后面也用到。
叫做ZNDI的一个解压包文件,就这个文件啊给他打包的,这是最原始的一种,利用J根底来组来实现这个东西的啊,来这里有个叫JNDI的一个point。
然后这个呢解压包,然后你看一下啊,如何用它啊,看这,那用它它干嘛呢,它会生成一些这种payload啊,然后你看啊我生成一个杠C执行一个CRAC,然后来杠A绑定一个IP地址,这个解压包是干嘛的。
是网上面写好的,一个,专门用来啊做这个DJDNDI这个组,这个解压包啊,你看啊它就会生成几个东西,有一个地址呢,这个地址呢就是根据GP地址,就我们这个对Y的一个IP地址里面呢,有个JDK1。7,Gk1。
8,还有个其他版本的,然后呢我们这里是JDK1。8,我可以选这个呢有RM协议的,有这个RDAP协议的,你把这个东西呢把它选中,那我怎么办呢。
那我看一下刚才的payload啊,我在这里呢,我code啊,给他接收的时候呢,如果是这样接收,是吧,这时候他就输出了这个什么值啊,是不是输出这后面这个东西啊,执行了,对不对,如果说我给它这样结束的话。
coder嗯不写这个感叹号,写个什么。
这个东西很明显啊,我这样去写给31-2呢。
把这个去掉,去掉之后呢,你看它的输出呢就是呢原封不动的,没有输出个执行结果是吧,要执行这个java os,就会执行那个win10的操作系统的对应版本,但是那明显不行啊,所以说必须要加它,那么同样道理。
我们构造这个什么,然后呢我们,我们可以构造一下,刚才呢我在这里创建一个什么这个命令啊,然后这是个地址,对不对,我可以构造个什么,该怎么写啊,是不是就这样写了呀,那把括起来,然后这里是ZNDI下面的。
对不对,前面再加上个什么符号,不要这样写了呀,是不是测试化了,你看刚才输这个时候呢啊,结果出来如果没加这个东西,那就不行,那么现在呢我就写JNDILDP,因为这个LDAP呢。
我们可以通过网上的资料可以看一下啊,简单的先看一下它呢是这是这这图片一样啊。
他呢是属于这个尖底I的,它下面的这个LDAP呢是属于这个级别的。
所以我前面要加上这个J跟DI把写上去。
然后呢再写LDAHP,请求这个远程地址的一个这个地址,这啥东西呢,这个东西是我们用网上一个注入工具啊,去执行一个cl AC命令的啊,绑定这个IP地址的一个东西,然后呢它会生成一个地址。
也就是说我生成这个东西代表什么意思呢,我给大家解释一下啊,那么这里呢有这么一个东西,这个是啥呢,这个词呢就是生成的一个远程可访问的,一个什么调用方法啊,调用的方法内容是什么东西呢。
啊这里呢什么方法呢是吧,什么方法呢,就是我们这里呢用这个杠A生成的命令是吧,去运行的叫C2ac对不对,那么其实就是执行计算器的一个什么功能,方法能理解吧,这是我刚才用那个东西生成出来的啊。
是用这个什么一个ZNDI工具,这个猪工具生存,对不对,这个生成的这个地址好,然后呢我们现在看一下啊。
我把这个东西呢给大家直接写到后面去,你看一下啊,写到后面去。
要写到后面去,对不对,然后这个时候啊我们可以关注一下这边的这个。
嘶你跑哪去了。
这边的一个触发结果啊,你看一下啊,这边呢默认的这里是监听状态是吧,你看下现在啊我们直接访问啊,看一下这里啊,嗯哎搞错了,里面的这是啥啥情况,回车,哎那接收到访问计算器弹出来了,电脑弹的啊。
真正的接触到访问计算机谈的同样道理,我可以把它推出来一下,我重新再生成一个,比如说记事本not part load part的是我们基础的嘛,就好比我们电脑上面那运行的load pad是吧。
一打开就是个记事本就被打开了是吧,好我重新来生成个命令绑,重新绑定,你看它就会有生成的一个,这个这个什么东西是吧。
有两种协议,我们就用这个RDADAP协议是吧,复制同样道理,再放到这后面,把它替换一下,好那么在执行之前我们关注一下这面啊。
默认这里是没有反应的,回车好触发哎,记事本突然弹出来了,来接收到。
然后呢你可以看到这个日志里面的,他说这个logo呢去请求了这个什么,一个叫exscore top jdk8的class,啥意思呢,其实这个工具呢就是啊自己呢去用这个工具呢,你把名你输出之后呢。
它就会创建一个class文件,就是一个实体化的一个java的一个编译文件,然后呢当你去请求他的时候,他就会执行这个class文件,这个class文件干嘛的。
是干嘛用的呢,其实就是调用一个记事本出来,所以啊这就是一个典型的logo。
4J的一个漏洞复现,然后从开发的角度上去给他讲。
那么大家从这个点上面学到哪些事情呢,啊学到哪些事情呢,学到了第一个这个漏洞,那个大概复现情况,第二个啊认识到了个JNDI和LDP,他大概是个干嘛用的,还有一点,那就是说如果你有用到这个logo。
是J这个组件的话,并且啊就说你包里面的引用过那个logo,世界的组件版本呢是出现过漏洞的,然后呢你调用过这个logo时间的一个日志输出,那么就会造成这个安全问题,所以说他就告诉我们一点啊,这个什么离啊。
这个开发源码中,啊应用了这个什么漏洞组件啊,就是我们说的如这个什么logo4J,包括这个漏洞的是吧,然后呢第二步呢就是啊应用不行,还有什么开发中啊,使用了这个组件的这个代码啊。
然后呢就是我们说的触发漏洞代码,后面呢就是我们说的啊,这个可空的这个变量呢去传递这个payload了,就是我们攻击的这个什么弄代码啊,PLOADER呢来实现这个重启啊,大概就是三部的一个情况。
手拿布都不行啊,用到这个组件,然后那个楼顶那有这个漏洞啊,漏洞在网上呢用到过,所以说在开码代码升级中,或者说在这个网站的实战中呢,都是有帮助的,对不对,然后具体是说啊如何发现这个漏洞呢。
这个漏洞又该如何继续再去玩下去呢,这不是我们现在操心的问题,我们操心的问题呢就是在开发中呢,我把这个漏洞呢给他服下来,就是介绍一下logo时间的一个简单使用和引入。
然后呢在使用过程中去利用这个漏洞的时候呢,又学到两个东西,就是关于这个节NDI这个事情啊,简单来说它就是系统自带的一个API,这个API下面呢有几种方法,这个RDAP和RMI。
是我们最常见的两种使用方法,具体呢就是可以进行远程的一个调用,那么也就是说,你可以在软子呢去用一些相应工具或自己写的,一些东西啊,去生成一个什么啊,生成一个这个可执行的class文件。
然后呢让这个相关对应的版本呢,去触发这个调用这个远程这个东西,然后实现这个什么调用,那么项目中它就会加载这个什么远程的这个,class文件来实现命令执行,这个说了这么多,不知道大家能不能理解啊。
代码是没有多少,但是呢你在实现的时候,你会发现有很多问题啊,如果说你没有开发基础的话,如果有开发基础,那就非常简单的了,能不能理解啊,这个其实这个案例呢就告诉我们啊,从开发的角度去代码。
升级的时候可以看版本,应用组件,这个版本是否安全,同样呢也是能够看到这个漏洞是怎么产生的啊,你们会有很多疑惑,有的疑惑就是说,那么你讲了,这是代码中我们能看到,那如果说我看不到呢,网站我啥都不清楚。
我怎么知道这个有没有logo时间呀,那这不是我们现在要操心的问题,就像我们前面说过的信息收集里面的,像一些这种组件的收集呢是有技巧的,对不对,有的是基于端口,有的是基于他的指纹,有的基于数据包。
各种情况,其实就是说你在黑盒中呢,你是如何判定他有没有这个logo世界,对不对,这是第一点啊,信息收集的重要性,那么如果说你有源码,有源码的话,你是可以完全看到他这里的有没有。
这里包里面的有没有引用过这个log4J啊,应用过滤开版本版本呢,你可以对照这边它的这个仓库的官方网站。
可以看到他们在这里呢,他自己啊现在都很优化了啊,你看呐在2。717。1这个版本之后啊,他这里呢是没有这个VR,就是我们说的漏洞信息的,也就是说目前当截止当前在2017,移到后面的2020最新版本。
2020这里啊,目前网上没有公开漏洞,那么也就是说如果在这个版本之下,你可以看到啊,他是有这些漏洞的,包括我们今天演示的这个2。14。1啊,它包括四个漏洞,你可以看一下呢,四个漏洞编号都有的。
Cv12021,Cv12022,那这种版本对吧,哎这还包括漏洞的一些常规版,然后呢你再根据这个漏洞的详情呢,去往寻找他的大概的一个利用,所以说从白盒黑盒我都给讲到了啊,黑盒就是盲猜。
因为你不知道会出现哪个漏洞,就是网上的所有那个EE叉P都打一遍,那么百合里面呢,就是分析这个版本呢有没有漏洞。
然后呢去看一下在哪里是调用过这个东西,就是它触发方法嘛,就很简单,我们刚才呢是应用它,然后呢这里呢是有它了之后呢才会触发漏洞,就是有这个东西,就是他触发这个代码端嘛,你就具体搜一下这个地方在哪个代码。
在哪个文件出现过,然后呢你去尝试请求那个文件呢,去触发这个东西是吧,这很好理解吧,哪有那么那么难理解呢,所以我这个讲开发的原因呢,就是第一个让你知道有哪些东西呢有安全问题。
第二个呢就是让你知道这个百合的一个,大概的思路啊,同时呢也是浮现下几个漏洞啊,毕呃了解一下这个java的一些架构,它利用的时候呢,有这个JNDI和LDADP啊,呃这个东西是非常复杂的啊。
他是个非常大的一个学问啊。
那这个呢就是我们的local4J啊,Logo4 j,那么还有一个呢,就是我们可以说用的也是非常多的一个,第三方组件,第三方组件呢你也看一下,我们前期给大家用到的这个什么工具包。
大家应该还有印象啊,你看一下啊。
这个工具包,它下面呢是有很多一些这种利用工具的,大家可以看到呢有这个叫吧,笑是吧,这个丝肉是肉,然后还有这个什么鬼,沃波罗凯斯啊,这个什么双12呀,这个什么什么一大堆呀是吧。
这其实这几个呢都是属于这个几个那个java的,一些那个资源,你看包括这里有还有个什么faster,JSN的简称理工具,你看这里还有个啦是吧。
有个的fast JSON的,都是针对一些java的上面那几个组件特有的。
这也是最近几年比较火的几个啊,这个logo世界啊,SHO啊,然后这个fast js文呢是吧,这几个呢都是几个利用的点啊,然后我们这里呢先讲log事件,然后呢再讲一下这个fast st js n啊。
那你可能说诶那个SHO我怎么不讲啊,希尔那你后面讲啊,希尔是一个生成验证的,我们到时候呢还会联合那个JWT,还给他讲一下,好,那么现在呢我们看一下这个fast JSON文档啊,你们说有没有实战。
这要什么鬼东西啊,你看一下啊,在本地怎么复现了,网上那种实战都是,直接都可以用的啊,我们到时候浮现的时候会用到那几个东西啊,你包括这里很简单的道理。
你看FOFO里面去搜这个东西怎么搜到啊,你如果这个东西logo世界的这个,你说他怎么判断是洛克实验呢,这几个全部是用到了这个洛克世界的,那像这几个地方都用到洛克斯一的。
那么刚才说的EXP全部可以往上面打。
他打的怎么打呢,网上是怎么利用那个漏洞呢,随便查,什么叫随便查,就是凡是有数据传递的,你就往那里面查就完了,就刚才那个螺丝结,网上利用实战中是那样查,为什么呀,因为他是在实战中。
他是不确定哪个值接受过去,他会输出,所以网上利用那个漏洞是怎么利用的呢,那时间就随便插,就是哪里有东西,你就往哪里插,就把那个PO就往哪里插,然后一般查取检测就是触网检测。
就是判断那个DNS is logo的一个解析检测,啥意思呢,还肯定说大家又不明白了啊,其实我不想说,那是漏洞利用,我现在讲安全开发,我不讲了。
你又会一直问问问的,烦死人,真的是啊。
对不对,有人不明白是吧,这个实战中这个讲这个实战中是什么情况,我说实战中随便查查什么呢。
就是把这个后面利用代码来把这个地址一改,改成什么,改成底应该是多个地址,就是我查一个什么东西呢,就比如说啊我查个这个东西呢,然后这里呢写个地址,写个那个DSLOG地址,随便写一下啊。
VLOG我就把这个东西呢随便查查,你问我插哪里,任何地方,啥叫任何地方,就是参数上面浏览框里面就是查了点确定,查了点确定,因为你不确定在代码中他是接受哪个值输出,造成那个漏洞,比如说我现在是抠的。
你知道哎,他结实是抠的,但实战中你哪知道呢,不知道啊,就随便查啊,一旦查了之后,你就观察这个dn log有没有回血,如果有回线,就说明存在就遭到点了,是这个意思,知道吧。
你自己要去想啊,这些东西呢不是我要讲的,其实我们讲的主要是讲他这个白合分析的思路,至于说实战怎么搞,你是根据漏洞情况决定的,有些是随便查,有些是特定地方查。
是不一样的啊,对呀,他们的目的是啥呀,你说目的是啥呢,啊,屋里好玩嘞,哎呀。
你首先要明白我们讲课讲这个logo世界,那我都还把你介绍一下,我不介绍,我直接告诉你,logo世界浮现,你连logo世界是干嘛的,不知道都说了,logo世界它是一个java的一个组件,就是第三方组件。
就系统java语言没有的没有的,别人为什么要用它,是因为别人用它呢,来做一些日式的这种输入输出和真理,他是一个专门搞日子的,你可能说哎日子有什么作用,那我就不好讲了是吧,就好比你的电脑上面对不对。
你要去处理的office,你要不要下个office呢,对不对,那你下载office office这个本身软件出现漏洞,那你会不会遭殃呢,那我没有下载就不照样啊,我下载了就照样了。
那那你总为什么要用office呢,你说为什么呢,他有这个业务需求啊,那么用到这个东西你就用到它,你就是吧,受到他的这个漏洞影响啊,他有漏洞你就遭殃啊,他没有漏洞,你肯定安全呀,好我们再来说这个。
fast j s n啊,那这个就更好理解了啊,这个呢他说的很清楚啊,在数据传递的时候呢,经常会用到这个字符串呐,与这种JJSONXML的格式来进行相互转换去解析,那么这个东西呢它是阿里巴巴的一个开源库。
就是阿里巴巴自己的写的一个这个第三方组件,Fast json,然后呢用来JS格式的一些数据,进行解析和打包的一个作用,这个作用啊,然后它其实呢是可以官方应用于在序列化。
数据和协议相互web输出的各种应用场景中,好那这个fax j格式呢介绍这里啊,我问一下大家,你觉得他是干嘛的呀,其实很好理解,就是用来一些数据的相互转换的,那么转换里面呢就是相互转格式。
那你可能诱惑问了,那为什么要转格式呢,是吧,那就没办法了,是不是,啊可以看到啊,这是他的一个大概介绍啊,就是个fast JSON文的这个东西啊,网上那你可以看一下他官方的一个介绍啊。
来还是跟大家说清楚一点啊,这背景交代清楚点,不然的话有些人老是问他究竟是干嘛的啊,你刚才说为什么要用到它,就是说其实java的原生的这个开发的API里面,就是它原生自带的一些函数啊。
方法他是能够进行这个JSN的解析和操作的,但是呢网上会有第三方的组件也支持,所以呢你用的第三方组件,你可能说不,为什么不用原生的原生的使用器,太麻烦,复杂效率低,知道吧,就好比呢你去买个电脑是吧。
买个电脑呢,原装电脑上面配置不行啊,你就在网上买一些相应的什么一些拓展是吧,歪舌来丰富它,那么这个歪蛇呢就相当于这个组件的意思,能使你的功能更强大,更方便,这样说大家好,理解了吧。
然后这个外设有不同不同的作用是吧,鼠标呢就是干嘛的,键盘就是干嘛的,那我刚才讲的这个logo时间呢就是搞日的,然后这个fast介绍呢就是搞数据的处理的,就是数据的格式处理。
网上那不是很有很多这种数据格式处理吗,是不是,对不对,就比如说这个JS文的这种转换呐,这种各种各样的平台是吧嗯对不对,有什呢各种数据转换对吧,那么其中呢这个JS文格式呢,是大家比较熟知的一种格式了。
好那么他该如何使用呢,按照刚才那个思路来讲话啊,我们来创建一个这个文件哈,先搞个空项目吧,好理解一下啊,名字呢就叫这个fast,JSON啊,DOM啊,总结一下啊,那么它的使用呢我相信大家应该也好说了吧。
来讲解啊,同样道理,刚才用的是log4J是吧,我这里开发时,那我在用什么fast接收呢,啊你看这里头有个什么有一个这个版本的,还有个这个什么face or他还新啊,新新开了一个版本,我们用这个。
然后这里有很多这个版本对吧,嗯在1。2。83之后的版本之后,那就没有漏洞了,1。2。80啊,这个东西是吧,那就有漏洞啊,我可那随便找一个这个这个,这个这个点是吧,你看这里有很多这个相关的这个。
不同的版本的吗,来看很多啊,对吧,我们可以用一个这个拉CV12017年的,184349的一个东西,这网吧low,你就可以搜一下吧,比如说用这个网没那个漏NEO呢,弄个弧线呢,他教你怎么复线啊,往死写呢。
往上就让你写啊,这弧线你复线完能成功有什么用呢,对不对,你从源码上面不知道它是怎么产生的呀。
好来我再看一下啊。
首先呢我们也是用一下啊,他有两个东,Cv,12022和CV1207的这个版本当中是吧,其他版本的也行啊,你自己用哪个版本呢,根据自己需要啊,你想用浮线哪个漏洞啊,或者说测试哪个版本的都行啊。
我们就用这个老的一个版本吧,啊点进去啊,然后呢在这里呢把这个一选中。
按照刚才思路来讲是吧,也是一样道理啊,啊是吧,先看下这,这只有这个1。8的JDK,自带的只有这个1。8,其他都没有,因为我搞了个空项目嘛,新建项目里面都没有做任何事情。
web的一些东西我都没有把它搞进去,是啥都没有,点一下这里啊,刷新一下,那不就出来了嘛呢,阿里巴巴FISK1。24啊,一个版本要出来了,有这个包了之后呢,我们就搞开发的呀,大家注意下开发。
呃创建一个这个fast这个什么测试的,一个这个这个这个这个demo文件哈,那就叫这个名字吧,懒得搞其他的啊,好先不创建啊,他这里呢,由于他是专门来处理这个建温室数据的,所以我在这里呢先搞一个,啊。
还是搞这种啧搞这种东西好一点啊,来创建个包吧,这样看上去更正规一点啊,想com点小DJ啊,就搞了个苞米,然后呢在这里搞啊,看成正正正规一些啊,com下底,然后在下面再创建这个。
呃user user这个类,然后呢我在这写一些数据啊,啊比如说我写哪些数据呢,呃写一下这个比如说名字STRA写的数据啊,这个是写的是干嘛的啊,我给简单解释一下啊,这个写着呢是用来这个长是吧。
来给这个什么fox faster js文呢,把这个数据转换测试用的啊,就是说这个文件是干这个事情的啊,不要等下说为什么要搞这个事情啊,因为有些数据嘛就有些这种呃用户数据。
然后呢用户数据里面呢你也要进行转换,比如说什么名字啊,人机啊,这东西是吧,里边的这个写好啦啦名字啊,这个int类型的学科A级是吧,那就写两个吧,名字和年级就可以了,其他的我们要位都无所谓了。
然后呢写几个这个方法是吧,是一个方法啊,这里有几个自带的啊,get a级啊,什么鬼自带的啊,这些自沙子这个构造方法,这两个是干嘛的呢,一个设置这样啊,把这个先拿出来,Public,String。
然后呢这个是get name,两个其实都自带的啊,这个没什么好说的,你直接搜get,那么也可以,我这也可以自己写的,各种看自动默写,这干嘛的呢,这两个两个自带的啊,这都是自带的,就是我没有固定的。
简单说它里面这个自带的帮你写好了,来自带的一些的这个构造方法,来得到得到这个什么额A级,然后呢这个是得到雷姆,那就这个东西它返回A级啊,返回类目,然后还有些像这种呢也是有些自带的。
那还有个sat sat a级,还有一个是我们说的这个sea name啊,然后你可以把它进行一个输出吧,输出一起呃,输出这个in好,把写好啊,写好之后啊,啊接下来呢保存一下啊。
就我们写这个几个数据写进去啊,就是一个类啊,这等下让我们把它用来当做这个fake jackson,来测试的好,我们这里再来看一下啊,现在呢就选择一个这个叫,JSN的一个这个这个测试啊。
好那么这里呢这个文件那就干嘛用的呢,就是啊这个使用这个fast接收呢,去这个处理这个什么user类文件,是吧,就处理个隔壁的这个user name啊,如如何处理的哎先写个mail函数啊,啊去处理它啊。
如何去处理它啊,大家看一下啊,首先呢我们定义一下user u等于一个new是吧,创建一个对象,然后呢我可以在这个优点里面呢叫sea是吧,A级我设置下连级30优点C的雷姆呢,这名字叫小迪,好。
设置好之后呢,我可以看一下啊,设置好之后啊,你可以怎么样呢,进行个什么输出一下这个U对不对,你看一下啊,我运行一下,看一下是不是啊,来运行,就我对user呢,你看他就输出了啊,三十三十是吧,都输出了。
你看小D30,你看也把输出了,是不是把这个数据给输出了吧,嗯30小于一好,那么大家可以看一下这个数据格式,目前他是一个什么格式啊,呦格式是什么处对象啊,那么其他的像这个A级呀,还包括雷姆呢。
都是指定的什么,一个是int类型的,对不对,就和这种类型一样子呢,然后呢name呢是string类型,然后呢他们都是什么呀,这个是吧,是不传数据,这个呢是个OBGDCD的一个对象是吧。
生成对象嘛哈那这个呢全部是字符串数据,然后如何我要把这个字符串数据好简单啊,比如说像现在啊,我们想嗯把这个数据啊转换成JSN数据,格式数据,所以呢啊我不想用,对不对,自带的这个API太麻烦了是吧。
你有就是太麻烦了,所以这个时候呢我就选择了什么,我就选择了,我就是完全站在这个开发者,为什么要这样写,把它写出来,因为有些人他喜欢win,但是为什么要用,为什么用,哎呀,真是麻烦死了,我就选择了是吧。
第三方组件,JSON是吧,来去做这个功能啊,知道了吧,好,那么现在就正式来到了这个,用发射键是N来去实现这个数据的转换,那么它的数据转换是怎么做的呢是吧,这个呢大家看一下了啊,首先呢我们就怎么办呢。
不就是这个了ZSON啊。
这里的我就给他写了啊,来它的转换类型呢。
这个是对象转这个JSN数据直接写啊,那再看一下JSON,那这里有个叫JSO,那object ction呢第一个啦来源于com阿里巴巴菲斯JSON,刚才这个把他库引用过去了吧,就这个地方吗。
那用这个啊是吧。
点咋这不是有的吗,来这里有的two js on string。
从这个方法名上面大家就知道了呀,这是干嘛的啊,q j s n train啥意思啊,Q来刀to目的地to j sn,数据就是JSN的数据,对不对。
JSON object为什么就是JSN的对象点来到JSN的数据,这就好理解了吧,这是对什么,这个函数是简单来说它是干嘛的用的呢,这个意思就是什么将计而损,对象是吧,转换成什么JSON数据好。
我们在那就把它写上去,比如刚才这个什么这个U吧,把它写上去啊,U,对不对,把它转过去,然后这里呢看下啊,可以搞个局部变量是吧,那我把输出一下,这个这个其实你输不输出都还行,那我们可以来把把写一下吧。
还是搞个九位量呢,输一下来看下二局变量呢,寻人建设是群里能不能帮我输出一下,好看一下啊,我们看一下啊,这个结果啊,然后这个上面输出呢我就把它注释一下啊,看一下啊,执行啊,看现在啊。
你看刚才这个呢是30啊,小迪我们现在输出呢,你看这不就是一个JSN的格式数据了吗,好理解了吧,所以说这里的啊避免有些人不懂是吧,再就是JSN还是把它进行个调节,所以啊这个东西大家已经明白了啊。
这个干嘛用的呢,把数据出来了,嗯好这个呢是转换,然后呢你看啊他的漏洞成因是怎么造成的啊,我们呢给大家简单讲一下,但是他的具体漏洞分析和利用呢,这个我们先不说,就说他的漏洞是怎么造成的啊。
就是在转换数据的时候呢造成的,然后呢具体为什么情况啊,给大家看一下啊,包括后面的漏洞利用都可以对比上来,你看啊它有一个另外一个地方来,我们先把来看一下啊,就在这里啊,它有个这个东西。
如果说他用到这个东西的话啊,不不这个不是啊,这个不是不是说用到这个东西,就是说你可以看一下啊,这是打印更多的信息,就这个函数啊,这个是干嘛的啊,我把他名字也改一下,这个叫一吧。
我们在那可以进行一个测试啊,分析这个你安全漏洞利用的一个这个过程啊,分析一下罗尼用的一个打印输出好,我们看一下啊,把这个这个东西要输出一下啊,好吧,打一下啊,先看一下,你看这个打印呢有个什么东西啊。
你看啊,我用到了加了个这个东西,这个东西就是让它显示这个什么write class name,啥意思啊,输出转换,数据的类型就是top类型,这里面就有他什么哪有他这他这个类,你好。
这里是不是有了有个叫at tap c,我们小d user啥意思啊,然后A级30内姆,小D在这个下面这个输出的嘛是吧,就是相当于说你加上这个函数之后呢,加上后面这个东西之后呢。
他就把这个叫alt name,其实那就是多输出了是吧,多输出一个东西,那么就是因为有这东西的提示,你试想想,如果对方对这一串数据去进行反向的话,啥意思呢,什么叫反向呢,那我们想象下啊。
你这个呢前面两个呢是做的这个什么对象,对象数据把它转换成这个JSON是吧,就是里面对象呢把它转成JSON这个式啦,那么同理,是不是还有JSN,把它转换成对象的一个东西啊,就相互转化的事情啊,是不是啊。
刚才那就是说前面两步都做这个事情啊,然后这里呢我们就分析告诉大家呢,其实它前面有个自带的啊,这个不是说我们做的事情,就是告诉大家告诉大家啊,告诉大家什么呢啊其实啊前面还有一个什么。
其实前面啊有一个什么这个at tap这个东西,它是自带的,只是说我不加入那些,你看不到它其实自带有这个东西,这个呢就是我们说的啊,就是我们说的这个转换的那个对象内啊,对对就是这个com嘞。
内向内内包啊对吧,对象包内包啊,那我这里呢就是说你如果用健身转换对象,那该怎么卷呢,大家看一下啊,我该怎么卷啊,我可以呢,那把这个一复制啊,我可以把这个复制或那个复制都行啊,我把这个也复制啊,来复制。
那我写个变量啊,你看啊,String,然后名字叫E叉P先写个test吧,等于什么等于这个东西来这个斧子自带啊,它自动帮你加了这个斜杠,就是防止这个因为你是双引号嘛,你这里也双引号。
防止这个双引号和双引号这个啊对齐,所以他装这个双引号呢,就不再干扰这个前面双引号啊,是这个意思,这个是id自带的啊,这个没什么那个i id复制写到编里面去,他会帮你自动这个搞这种事情啊,好把显去啊。
然后呢你看啊有个叫GSN,点什么PAR,object这个是干嘛的,好,这个接时候呢导入类导进去JSN点pr解析对象,是不是就是,在商书那下面,那JSN把它搞成对象呢,解析对象,解析谁对象。
把个test搞进去好,先进去之后啊,大家看一下啊,呃然后呢你给应该绝不流量啊,但但这个输出呢他是看不到结果的,因为呢这个是一个对象的,是个救生对象的,你这个输出呢他是看不到东西的啊。
就这个东西呢你看不到它是一个空的,就是我对这个东西呢进行一个把它还原成对象,你看是不是还原的呀,来看到没还原那边好,我这里呢可以给把前面注释掉啊,先把这个前面注释掉,怕有些人呢这个看不懂这个是哪里来。
这是我给他传递的一个JSN是吧,然后让运行,他是不是还原了,你看是还原了呀,还原成这个了,三菱小迪了呀,哎三菱小迪了,这是前面输的3D小题啊,这是前面输的这个前面一个,最下面这两个呢是这里输的对吧。
然后呢不还然的,对不对,不还原的啊,首先说我画圆了啊,那么大家试想下,如果现在啊好,我做个什么事情啊,看着啊,这个地方com里面改成一个什么东西啊,这不是一个com user,就这个地方吗。
如果你看一下啊,我在下面呢再写个什么叫这个,run run点Z是吧,然后这里写个什么东西呢,大家看一下啊,就写个这个,Long time,点EXC执行的CLVC的这个东西,写到一个方法里面去。
名字也叫run,好那写进去,这是个执行命令的吧,来这是一个这是一个另外一个run里面的,然后我这里把一改,你看啊,我在传递这个art的时候呢,我把它改改成什么消低一点什么run,然后我改成个run啊。
来看我改成小地run,看一下啊,什么效果啊,就其实就是说我告诉他,我现在要处理这个什么这个这个对象嘛,那之前呢就是说你如果你如果就说,你之前是这样写是吧,他告诉你是user这个处理它user对象。
然后呢你现在呢我让他写个这个处理run对象,run对象是什么鬼啊,这里面执行的命令啊,好我看下阿拉V型啊,看下,呐弹出计算器就是搞错对象啊,我把对象一换,他就处理run对象去了。
run对象你没的就直接命令啊,对不对,然后呢网上你再看一下网上EXP他怎么用的呀。
你可以看一下嘛,看一下你就知道了呀,不然的话别人叫你怎么用,你有什么用吗啊,你看网上是什么什么怎么用呢,那他说了小于1。2。4版本,这个payload是这样写的,你看看这是他的一个漏洞的。
一个这个这个这个这个什么鬼异差评呢,在漏洞细节你看啊,来把类型改成GSN,那在这输什么,TF等于CON的一个方法,然后后面的一个是RMI东西,啥意思啊。
其实这里非常好理解了,通过我们这个学习他这个漏洞利用,我们就能把它解释出来,啥情况来,我们来对应着给他说一下来,首先呢这个地方为什么要改这个格式啊,改啥改啥,很简单嘛,我们这里那就是很简单的一个意思。
他这里就是啊固定号数据格式,为什么,因为fast JSON时将什么JASSON转换对象嘛,这个漏洞是产生在哪里啊,刚才漏洞的一个产生是在哪里,产生在JSONN转什么对象这里对不对。
然后固定好这个格式对不对,所以呢你就是健身数据好,这是为什么要这里改,再看这下面呐,这下面呢有这个的叫tap,这个tap是干嘛的,艾特hub,是不是我们要转换,刚才我测试那个点。
是不是我们要这个进行这个操作的对象的包啊,这我操作哪个包,对不对,它来个包,那就是这个包好,那下面这个就是它的值嘛,这值啊,他为什么写个RMI呢,arm i我们前前面看到过,它是个什么软件调用方法。
然后调用这个叫class文件,那么为什么要操作这个对象包呢,你再去查一下啊。
这个对象包是一个什么东西啊,好我们先把它把它保存一下,在我们操作这放到上面那个支点啊,然后这里有个苞米嘛,你可以网上搜一下啊,这个苞米呢其实很好理解了啊,他就是那个RM的那个东西,那你给说一下啊。
哎也不用看了啊,他其实就是这个报名,显然就和那个RM方法的调用地方是一样的,因为你要叫mi的话,他那个包呢把它引入进去呢,省掉后面那就是这些事情了啊,网上那些很包显示器,后面那就是你这个操作的东西。
就其实就是参数嘛类似的参数,因为这个里面呢就这个东西嘛。
同样道理啊,我刚才呢呃这个地方我是怎么写的,我这能改成run,对不对,而且你可以看到我run里面呢,还应用到这个java自带的这个东西啊,去执行它,是不是,如果我这里呢不用不用这个包呢,不用第三方的包。
我可以写个什么反射性去调用这个这个一叉一,也是可以的啊,其实就很简单啊。
就把这里改改成那个top里面,那就是我们那个啊利用的那个地方嘛,那网上这个利用过程呢,哎你看了就知道了嘛是吧,对这个这个class文件呢就是它自己生成的,它你看一下利用过程嘛是吧。
他这个地方呢就是呢去创建一个文件,然后把这个文件呢把编译一下,编译成一个这个class文件,然后利用这个工具的呢去生成一个这个地址,这个地址那就是远程调用地址是吧,就是你访问这个地址。
那就会触发触发这个代码啊,这个代码呢就是创建一个目录,所以呢他就发送这个东西给他,让他去转化,转化之后那就触发了,可能你会问,那我怎么知道在哪里发送啊,他其实呢也是在乱测。
因为在如果黑盒中的话,你是不知道哪个值呢会被转换,所以呢一般就是到处插,到处车,到处测,和那个那个时间差不多,就是你要看哪里地方呢有这个转换,你就在哪里测那个数据,主要漏洞,原因呢。
就是啊用到这个fix杰克森的这个漏洞版本,然后呢在某些地方呢,对这个健身呢进行这个转换的时候啊。
然后呢啊对方呢啊,攻击者呢就是让它指向一个这个什么这个包啊,然后呢,去让他再调用一个远程方法来执行代码执行,所以它的漏洞的名字叫做反虚化。
造成域名执行,你可能说诶这怎么有反序列化呀,是这样的啊,在这里呢它用到这个什么JSNPRA对象的话,这个过程就是反序列化,所以这个就是反序化,我们说的是数据转换,是让你更加能理解,但是专业的讲。
这里是传反是序列化的操作,前面那个是前面是那个是虚拟化,这个是反序列化,就是我们前面讲的反虚化和虚拟化的嘛,一个呢就是说把这个数据呢啊对象呢转换成额,转换成那个文件啊,那种东西序列化。
还是呢就是把文件呢再还原出对象,这种呢我们就称之为叫反虚化,那这个呢就是刚好就把数据呢是吧,换成这个对象对不对。
所以他这个是反虚化对不对,所以他称作反虚化,导致人于命令执行啊。
就是利用的什么东西啊,后期的利用的就是我们说的这个。
利用这个JNDI,注入这个LDP和这个什么RM来实现,所以说关键点,这个利用点就在于这个什么mi和这个什么这个。
奥迪AP,因为大家可以看到啊。
我这个利用呢我是在这里写了个文件,但这个文件呢你可以想象一下,这是我写的,他能调用,我如果说要go这里的话,这个地址的对不对,我只能写什么,我都可以思考一下呀,因为如果说我自己去用的话啊。
实战中的这些情况,做我去用到这个东西,对不对,这个东西我们不知道啊是吧,我们是不知道的,所以呢他就是一般是固定的啊,搞一些这个固定的调用,然后再用这个什么IMI和ROADP呢,IIIADAP啦去触发。
远程的这个什么class,然后呢来执行这个相关的这个代码,就是类似我们代码的,一般就是命令执行RC1这种东西嘛,这么个事情,因为这个实战中我们是没有这个东西的,是我自己在勾搭下装是说啊用这个类。
但实际上你不知道,所以不知道呢,一般就固定他固定的就是这个东西嘛,是吧,我刚才也说了啊,固定这是这个东西跑哪去了,网上都利用这个过程来固定就这个东西,那你可以搜很多啊,搜很多都是这个都是固定这个东西啊。
你可以往下翻呐,那这里还固定这个呢,你看看固定个java letter letter d s这个是什么东西,也是java自带的,java自带一个什么d slog地址,主要他访问一个DSLOG。
这个是不是自行命令,就是单纯就是让他访问一个DSLOG地址,来判断漏洞存在,你看这也是固定的,这种java自带的一些这种啊类啊,这个包的地址啊,对不对,因为有些他不知道的,你只能搞一些固定的啊。
后面呢他在利用到这个东西的时候,你看他就固定了,你看对吧,这个地方呢这就是都是固定的啊,这是摘的,然后呢用他这个RMA的方法呢去触发啊,这个后面这个漏洞浮现我就不浮现了啊,因为我们的终点呢。
不是说去教大家怎么去浮现这个漏洞,我们后面讲上期课程我们也用过这个漏洞复现,就说我去浮现过这个fast JSON的一个漏洞复现。
我也复浮现过,但是浮现的时候呢,我并没有去说这个logo是怎么产生的是吧,从代码的角度上去给大家分析,所以呢大家就只知道怎么复现。
至于为什么这里呢是这个payload是这样写的,你只有说了解过学过java的。
已知道诶,这是个什么含义,为什么这样写,是刚才就知道了呢。
是吧,就是改成这个地方吗,那为什么他要改这个东西呢。
啊就是我刚说的嘛,因为实战中呢,你像这个这个run是我自己写的。
那别人代码中你怎么能写代码写不了啊,写不了,那就只能用它自带的呀,就包括了用他自带的这个java里面自带的,这个什么,刚才那个java的呃,呃let这个这个东西让他去访问个地址,来看一下能不能成功。
是吧,后面再用这个执行命令,用这个什么java自带的这个APIRI,这里这里这里JNDI的注入,来实现这个远程调用方法,然后远程调用方法呢是你自己写的代码,是不是把它编译成这个class实现的。
这么一说,大家就明白为什么这样利用了这一讲,就明白了利用的那个过程是什么情况是吧,它代表什么意思,白河中呢也给你提高了提示,你后期呢碰上一些java的人卖了,你也可以看一下这个java源码。
用没用过这些漏洞的这个组件,这也是分析的一个点是吧,呃漏洞利用弧线的时候也知道关键所在了,对于这个java的这个什么鬼,几个组件logo世界呀,SHO啊啊,fast的JSN呐是吧。
你再把它浮现去吃别人面试题问你的时候。
你就知道了呀是吧,那比如说呢2023年互网中高级这个面试题。
给他看一下,呐大家看一下好了,效反虚化不错啊,怎么利用这个啊,我还没说啊,这是那个漏洞浮现的情况啊,然后你看下面那JNDI注原力是吧,还有这个咋还没有,现在像反序化的一个情况啊。
非则有哪些利用链那个什么鬼东西呢,这都是那几个啊啊pp和什么反虚化区别啊,什么鬼,是吧,这是有和我们相关的呀,你没学哪,哪知道的这个间谍注入原理是什么鬼是吧。
这个图片那答答的上答上来几个呀是吧,还DP的这个mi的。
看怎么个情况,就是他自带的,你可以怎么回答呢,啊自带的这个API,它主原理呢,就是利用它里面的那个什么自带的API是吧,里面的那个好DAP和r mi啊,谐音呢去远程调用那个class文件来实现的是吧。
原程装这个调用的方法呢,那个class文件是我们自己编写的,来实现一些相应的操作,代码是由你写的,你说实现啥呢,是不是这个题就能回答上来呀,那不然的话你没有学过,回答个毛啊。
久而久之把字典一级多,这个中高级的一面杀是吧,经验有就把你搞成一个高级,既然没有,又搞成了中期,那也不错了呀。
唉好今天就内容就说这么多了啊,那么下节课讲什么东西呢,哎这也不说,大家也知道了啊,下节课我们就讲解ZNJNDI,这个下面的东西啊,就DNDI注入全部都是干货。
全部都是这个高端课程对吧,下节课讲这个啊。
了解一下这个下面的那个RMI和,RDP的一些知识点啊。
好大家看看有没有什么问题啊,有问题就问,没问题我们就瞎了啊。
今天内容还不是很多啊。
听不懂就是正常的,听得懂就不正常,可以看看生成的class文件吗,这个class文件。
这个你可以看一下漏洞服务先这里嘛,这个漏洞浮现这里呀,他有这个东西啊,那个,他是用那个JJ呃,java c呢去把它编译成那个哎叫谁呢,把别人省的那个东西啊,来自自己写的。
啊就这个啦啊这个java c呢运行这个这个文件,就是字写的,就是你的利用代码啊,把自己写用这个JAVC,那编译成这个你写的是java文件嘛,它变成这个class文件了,class文件之后呢。
他就把这个的class文件呢放到这个网址上面,那然后你这个去调用访问嘛,是吧对吧,然后去这个调用访问后面的代码,能去触发这个路径地址嘛,是这个意思啊,所以那个利用文件那就用java写的。
然后呢把它编译成这个class,因为你学过java s1的。
应该知道啊,它在指引的源代码是这个java文件啊,然后呢执行之后呢,就变成这个呢我们说的这个class文件了,对就是我们这个那这个卡死问题了,只是说我现在要把它反编译了,所以他原慢的能够看到。
如果不反编译的话,那这个呢你看他就是点class,所以说为什么java里面有反编译这个说法,其实呢就是把这个class文件的话,反编译成这个java文件,对不对,因为它源码的是java。
执行之后呢就变成class了。
哎呀还是很多东西啊,你们有些没有学过的,都很难说搞清楚这个java为什么难,就是因为你没有学过java语言,你都不知道他的一些格式啊,各方面的一些东西,我只能说带着你去摸鼻子,一样是摸着一样。
摸一个就就明白一个,那么渐渐的摸摸,摸多了之后的接触多了就会相应的明白,话说啥时候讲的JNDI没有讲啊,没有讲没有讲,这是我们下面要讲的,后面课程要讲的,现在没有讲,这节课比前面有意思多了,哪节课都好。
只是说这节课呢和你这个碰上的这个是吧,可能你经常碰到,你对他比较熟悉,就觉得好,写的加我代码可以发一下吗,好歹码秘密试一试,每节课都发到网盘去了呀,怎么没发呀,等下上网课自己过个二三十分钟。
自己看网盘啊,歇斯肉,讲不讲是吧,CERO讲不讲讲啊,后面讲啊,这个东西是那个身份验证的,就是专门来做身份验证的,这个有点麻烦,他有个专门那个视频ING的视spring安全那个框架,那个有点麻烦啊。
我那个有点不太懂,那个框架不会搞,所以我准备说这几个讲他的,但是你妈的搞了半天没搞成功,我就只能讲这两个线,我看那个到时候和那个GW讲一下,这SHAO,他和那个spring boot结合多。
spring boot太麻烦了,不容易,那属于这个java里面的高端编程的,这两个有什么区别,操马上就要讲,不是今天的内容啊,到时候会讲的,啊对是这个这个service啊,是这个,唉你当然简单。
你天天卷我,你妹还要备课,你天天都在卷,你们自己看着了啊,卷王说简单。