首先第一个就是概念。第二个是他的利用,一个好用的工具ysoserial,主要用来生成工具的paload,修复大差不差。
#概念:我们有时候需要保存某一个对象的信息,会进行一些操作,类似于反序列化,序列化的过程中的对象,就是我们所说的class的状态以二进制储存到文件的系统中,然后另外一个系统对这个二进制进行读取,再来还原,如下图这样
序列化那段英文字母的意思是,写入对象
反序列化英文字母意思,读取对象
就相当于序列化就是把序列的字节写到输出流里面
反序列化就是把源输出流里面转换成一个对象
类似于存档,读档吧,跟php一样的相互转换
序列化:将对象的状态信息转换为可以储存或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性储存区。
反序列化:从储存区中读取该数据,并将其还原为对象的过程,称为反序列化。
##简单的java代码演示
#主函数
---调用序列化方法
---将反序列化的的结果返回给person变量
---输出person变量
#序列化方法
---创建一个person的对象
---创建一个文件输出流(指向person.txt的文件),命名为oos
---将person对象的写入到文件输出流中
将对象person序列化之后写入到d盘里面person.txt文件里面。使用到了oos.write0bject(person)去写入。
#反序列化方法
---创建一个文件输入流(指向person.txt的文件),命名为ois
---从到文件输入流中读取person对象的信息
---返回person对象(直接显示会乱码,一般用base64加密输出)
这个代码就是读取那个文本对他进行还原。
一个就是将数据写到对应的文件,一个是将文件进行读取进行还原。
这个就是对象序列化之后的样子。
就转换为了原来的对象。
他有什么作用,我们可以看一下下图新代码
这个代码是java里面执行命令的代码,写为ipconfig就输出的结果就和命令提示符的结果一样,假如那个绿色的字符串是一个可控变量,变量来源于假如是是一个代码读取数据的d盘文件里面的,假如里面是ipconfig,而这个代码就执行ipconfig。
##WebGoat_Javaweb 靶场反序列化测试
打开靶场
exec命令执行代码,然后这一串代码就是接受你输入的数据,进行对象的还原,进行命令执行,这就是对应的靶场漏洞。
而攻击他有两种方式,一种是结合上面组件攻击,第二种就是没有组件自定义pyload,
用第二种方法我们就用到上面提到的工具了,
攻击过程:xiaodi转换为一堆储存在txt里面的乱码,称为序列化
txt一堆乱码转换为xiaodi,称为反序列化。
rO0ABXQAVklmIHlvdSBkZXNlcmlhbGl6ZSBtZSBkb3duLCBJIHNoYWxsIGJlY29tZSBtb3JlIHBvd2VyZnVsIHRoYW4geW91IGNhbiBwb3NzaWJseSBpbWFnaW5l
他变成那串数字经过了两步,序列化+base64加密
我要攻击他该怎么去构造pyload?
假如我要写一个ipconfig
问题1:对方回显吗?回显就是可以看到,不回显就是他执行了但看不到。所以大部分反序列化漏洞都会进行一个操作,“反弹shell”,这个就能解决回显问题,就是把对方执行命令的会话反弹到另一个服务器上去。
反弹的命令:ip地址>这个要根据操作系统写语句
假如现在我要写一个pyload,要写ipconfig,先进性序列化,然后在进行base64加密,获得一个rO0AB格式的字符串,就是pyload。。而自己一个一个去写很麻烦。
然后组件里面hibernate是调用的组件。这个组件能不能调用就对比工具执行时候显示出来的
就和图中这些对比,看在源代码中有没有,有就可以调用。执行那个calc.exe,这个电脑上计算机,然后结果都输入到pylioad.bin里面,这个工具只能到序列化这一步,
之后还要进行base64加密,就可以直接写一个base64加密的python脚本,
打开pylioad.bin,对里面的内容进行加密,保存到pylioad.txt里面。
原因就是有计算机的执行命令
这里来结合一下开头思维导图内的知识点,黑盒测试里面数据格式点,刚刚那个图片就说了指定的字符串开头一定是序列化加密值,
##2020-网鼎杯-朱雀组-Web-think_java真题复现
这里还涉及到sql注入
打开sqldict
白盒代码审计完之后发现有sql注入漏洞,打开网站,抓一下数据包看看
代码审计在那个sqldict有sql注入漏洞,然后请求地址在第一个代码就显示了common/test/sqldict对应的文件地址,代码里面接受dbname和teblename的值,然后上面语句里面有dbname值,
注入语句便是
dbName=myapp?a=' union select (select pwd from user)#
这个注入代码是因为前面语句告诉了,dbname,参数是myapp,剩下的可以猜出来的。
然后获取到账户和密码在他的导入模块里面有接口
就通过访问开发接口实现账户密码的登录,这个接口是默认的
然后在登录成功上面有一个数据,而且是rO0AB开头的字符串,序列化之后base64加密值,
返回数据里面有这个东西,又涉及到序列化,把值序列化之后展现出来,
而点开那个获取当前用户信息,就会出现一个框让我们填写token
而token就是那个序列化值,赋值那个值粘贴到这里,看返回
先进行base64解密,用python写一个解密脚本
下面反序列化之后的结果。
抓那个查看用户信息的包,在请求数据包里面有这个数据
所以在请求数据包里面,他对序列化值有接受,我们就可以构造一个攻击性的pyload发送过去,
就用到那个生成pyload的工具 这里因为不知道他的模组,就直接用的工具,生成向外网发送的语句,发送到那个ip地址的,写到xiaodi.bin文件里面,(linux的curl是发送的)
生成出来之后再去python脚本base64加密一下,然后打印出来
发送出去数据包,监听端口里有数据
这个反序列化漏洞是在对方回显的数据格式上面发现的,
产生反序列化漏洞的原因我是在登录,还是查看用户信息,是在查看信息的时候发送的请求数据包里面有序列化值发送出去,而且接受并显示数据,所以攻击语句写在请求数据包里面,写他对应的格式;
这个漏洞该如何检测到,数据格式点,http数据包请求中的参数看看,各种协议里面
白盒第一点就是找函数,这些函数都涉及到读取对象的, 一般用这个函数的意思都是在对象中获取数据,获取对象数据,在操作中设计序列化或者反序列化,这是漏洞产生根本原因。
第二点是在组件里面找,在那个yeoserial里面有的组件,在代码里面可能也有
第三个就是代码点,rce代码点,执行漏洞的代码点;然后再数据认证,刚刚那个题目就是登录数据包里面有序列化操作。
i
s
s