这个很重要
为什么会产生这个东西:序列化之后便于我们对象的传输和保存,这个作用就是为了数据的传递和格式的转换,我们称之为序列化。
在这给过程中,会涉及到一种叫做有类和无类的情况,开发里面经常看到的一个东西,我们称之为类,类对象,存在类的话,在类里面有一些内置的魔术方法,如果有类用到反序列化这个操作,就会触发到里面的魔术方法,有时候在不经意之间就会和其他漏洞相互组合。
无类情况,没有在代码写类,就不会触发到魔术方法,这个要看具体代码里面有没有
利用:1.在真实应用,网站下面,2.各种ctf大赛里面经常出现
反序列化的安全问题,会造成漏洞结合使用,他就会产生sql注入,代码执行,目录遍历等等。
相关的开发语言进行序列化就会转换成二进制,xml,json数据,这种数据反序列就会转换成开发语言,代码形式。
数据格式类型的相互转换
序列化就是对象转换为字符串,反序列化就是字符串转换为对象。
#php反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,sql注入,目录遍历等不可控的后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
这就会涉及到两个函数:serialize() //将一个对象转换成一个字符串 ,序列化
unserialize()//将字符串转换为一个对象。反序列化
出发的原因的就是unserialize()使用这个函数时候,存在变量可以控制,触发类里面的魔术方法。
##先搞一把PHP反序列化热身题稳住-无类问题-本地
一个简单的序列化代码
这个输出结果是什么意思,s是字符串型,变量长度9,变量名字就是xiaodi123,
这是无类的一种情况。而把输出的值换到变量key,然后使用unserialize()这个函数,一个简单的反序列化代码看看
只有使用他对应的格式,才能被反序列化,还原出来。
如果代码里面等于123,str该等于是什么,数字的话输出结果就是这种
如果在123用2“双引号括起来,就还是会以字符串模式显示。
##在橹一把CTF反序列化小真题压压惊-无类执行-实例
这里提示输入账户密码之后点登录没有反应,可能要换一个提交方式
提示hint
所以在网站上加上?hint等于个字符串,再去访问网站
返回的源代码,然后从代码里面分析有什么漏洞,
我们的思路加上让传输的hint值反序列化之后和key的值相等于,就能输出flag,所以这里hint就等于的序列化值,因为代码要cookie提交方式,所以抓住他的数据包,对cookie做修改
发送数据包出去,网站并没有任何反应
这是因为代码里面上面,有一个先接受get的传输的hint值,而我们刚刚的数据包里面hint传输至了,所以就不会执行下面的语句,这时候应该是把hint取掉,在抓一次数据包,然后修改cookie值,
放出去之后,出来登录框
还是不可以。
这是因为代码执行有个先后顺序,而key的赋值在后面,比对在前面,所以在前面比对的时候,就比对的key值是空的,
既然key的值比对的时候是空的,所以在cookie值哪里就应该比对是空的反序列化值
在发送出去数据包,flag就出来了
所以这一题就有两个陷阱,第一个是if,hinnt值判断,第二个就是代码的执行顺序,
下面开始反序列化里面的精髓一个简单的有类代码
魔术方法
在特定情况下会自动触发的方法
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct() //创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
这个代码就是有类的,这里新建了一个对象,变量a,变量a新建等于新的abc,新的abc是新建的就会触发调用构造函数,只要是新建的对象就会调用function_contstruct这个魔术方法;他就会在不经意被调用,这个代码就会被执行。
而序列化,并没有调用下面的函数
反序列化,就触发调用了苏醒函数,wakeup,
而对象死的时候,下面并没有写出发函数,但还是触发了一个析构函数,destrust,这就关系到了上面写的 __destruct() //对象被销毁时触发 这个了。程序结尾之后会默认调用这个结尾,就会调用那个函数
通过这个实例,在这个类写法里面涉及到序列化,对象被创建,执行完等等,就需要知道魔术方法在什么样的场景下面会被触发;有类和无类的区别就是有没有魔术方法,而魔术方法会在特定的情况下被触发。
ss