反序列化题目,题目代码如下
1 |
|
得到如下序列化数据:
1 |
|
- “O:3:”BUU”:2:{…}” 部分:
- “O” 表示这是一个对象(Object)的序列化表示。
- “3” 表示对象名称的长度,在这里对象名称是 “BUU”,长度为 3 个字符。
- “2” 表示这个对象包含 2 个属性,后续花括号内就是对这 2 个属性的具体序列化描述。
- “s:7:”correct”;s:0:””;” 部分:
- “s” 表示这是一个字符串(String)类型的数据。
- “7” 表示属性名 “correct” 的长度为 7 个字符,后面跟着属性名 “correct” 本身。
- 紧接着又一个 “s”,然后 “0” 表示对应的值是一个长度为 0 的字符串(也就是空字符串),后面的双引号内就是该属性的值,这里为空。
- “s:5:”input”;R:2;” 部分:
- 同样先有 “s” 表示字符串类型,“5” 是属性名 “input” 的长度,后面跟着属性名 “input”。
- “R” 表示引用(Reference),“2” 表示引用的是前面已经出现过的第 2 个元素(从 0 开始计数,这里就是引用了自身对象中的第 2 个属性对应的元素)。在反序列化时,会根据这个引用关系去正确还原数据结构中元素之间的关联情况。
综合来看,这条序列化数据表示了一个名为 “BUU” 的对象,该对象有两个属性,一个是名为 “correct” 的属性,其值为空字符串;另一个是名为 “input” 的属性,它引用了对象自身中另一个元素(这里应该是和整体对象结构以及相关业务逻辑下存在特定关联关系的一种表示方式,具体取决于应用场景中这个对象是如何使用和定义的)。
弱md5绕过的两种方法:
方法1:通过科学计数法绕过,原理是php里面在做 == 的时候会先把两边的类型转成一样的,因为是 0e开头,php会认为它是科学计数法,而 0的多少次方都是 0。
常用的绕过值有:
1 |
|
方法2:数组绕过,原理是 md5 等函数不能处理数组,导致函数返回Null。而Null是等于Null的,导致了绕过
再次分析网页的代码,需要我们传入5个参数:’pleaseget’、’pleasepost’、’md51’、
‘md52’、’obj’
根据代码逻辑可推出各个参数的值如下:
1 |
|
获得Flag
1 |
|