详谈php反序列化漏洞的利用与修复



     php反序列化中的字符转义是一个好难掌握的知识要点,近期几次比赛都出现了相关问题,

所以我下定决心要彻底掌握这个知识要点,所以想出了这篇文章。
 
 
 
基础知识掌握,字符转义掌握后即可掌握。这是一个封闭的思想,类似于SQL中的通用密码。

掌握了这个原理之后就会变得很容易。在SQL注入中,我们经常使用','来关闭或探查注入点,

从而进行各种姿势的注入。反序列化时,序列化值基于;作为场的分离,最后以}结尾。让我

们稍微看一下。
 
 
 
反序列化的过程是要遇到的;当}与前面的{}配对时,反序列化将停止。我们可以稍微改变上

面的序列化值:我们可以见到没有报告错误,并且这个对象被成功反序列化,这正好说明了我

们上面提到的关闭问题。另外,改动一些序列化的值能够反序列化我们知道不在对象中的值

,我们可以通过学习绕过__warmup来了解。在这里,我们可以自己尝试掌握。
 
 
接下来,是时候报错了。当您的数组长度与描述的不另外,它将报告一个错误。例如,在上

图中,当s:3:“Tom”变为s:4:“Tom”或s:2:“Tom”时,就会报错。为了解决这个错误,在字符转

义中分为两类。题目中经常会过滤一些关键词,使用的手段通常会替换关键词,使得一些关

键词增加。简单了解一下,结果正常连载。这里,我们替换序列化的字符串,这使得后续的

反序列化报告出错。然后我们需要篡改汤姆身上的绳子。用户名后只有一个年龄,所以我们

可以用双引号构造用户名后的参数值。在此改动年龄值。我们将用汤姆代替汤姆”;s:3:“年

龄”;s:2:"35";}然后反序列化,意思是在传递参数的时候改动用户名,也就是我们写链的

时候的操作。
 
 
能够见到构造的序列化数组长度是20,在上面的反序列化过程中,他会将一个O变成两个

oo,所以我们得到的应该是s:20:“Toom”。我们需要做的是让这个双引号里的字符串在过

滤替换后真的像描述的那样长,这样他就不应该报错了,配合反序列化的特点。(反序列

化过程是要遇到的;在}与第一个{}配对后,反序列化将停止。)关闭后,忽略年龄的字符

串:13,年龄成功改为35。年龄的改动要求之前的字符串用户名的值长度和描述的一样,

这就需要我们精确计算。这里我们将一个o改成两个,然后只写o而不是Tom,效果一样。

我们需要了解我们构造的字符串的长度,除了在双引号内,也就是“;s:3:“年龄”;s:2:"

35";},需要22o。一般来说,22o加上下面22的数组长度,总长度为44。经过过滤和

替换后,有44个光学o,与所描述的数组长度一致。
分享: