php反序列化——字符逃逸增加
题目
放到本地环境
发现是这种情况:a:2:{i:0;s:1:"x";i:1;s:5:"aaaaa";}
分成两部分: a:2:{i:0;s:1:"x ";i:1;s:5:"aaaaa";}
现在需要做的就是自己构造第二部分: ";i:1;s:6:"123456";} 一共20个字符
经过preg_replace函数 x->yy 增加1个字符
所以需要填入20个x,对应上面构造的20个字符 ( ";i:1;s:6:"123456";})
payload:xxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";}
本地看看效果
可以发现aaaaa已经变成了123456了
提交
总结:
1、先本地环境打印出用到的变量,看看什么形式
2、从这个形式中分开,也就是找到要构造的那个变量(";i:1;s:5:"aaaaa";}),加上 "; 进行闭合前面的变量
3、最后加上 ";} 闭合构造的变量,使得后面的内容失效。
失效的原因是:反序列化是以这个;}来作为结束标志的,但也不完全是,前提是前面的成员属性数量一致,成员属性名称长度一致,内容长度一致,只有在这个前提之下,;}才会被当作结束的标志
而我们前面已经满足了成员属性数量一致,成员属性名称长度一致,内容长度一致。