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,与所描述的数组长度一致。
还没有评论,来说两句吧...