try again,学到了
[SWPUCTF 2021 新生赛]ez_unserialize
点进去,查看源码,提示disallow,是一个爬虫协议robots.txt,访问
得到源码
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
函数解析:
:::success
unserialize:编程术语,指的是将序列化的数据还原为原始数据结构的过程。
序列化是将数据结构转换成一串字节流(通常是字符串),以便在存储或传输时进行持久化或交换,序列化的数据可以被保存到文件、数据库或通过网络传输。
unserialize将序列化的字节流重新转换为原始的数据结构,这个函数可以用于将序列化的数据还原为原始对象、数组、哈希表等数据结构。
序列化的字符串一般有特定的格式,例如json、xml,比如在json中使用键值对的方式,键是字符串,而值的数据类型不限制,也可以进行嵌套。
反序列化不受信任的数据可能会存在安全风险,比如代码注入。
:::
_destruct用于定义一个对象在销毁(释放内存)之前执行的操作,用于执行一些资源释放或清理的操作,当对象不再被引用或执行脚本结束时,系统会自动销毁对象,在销毁前调用该方法,这种机制允许程序员在需要清理资源时候进行相应的处理,例如关闭文件,释放数据库连接、释放内存。
__construct:当创建对象时,该函数被调用。
代码审计:
wllm类里面有两个属性admin和passwd,还有一个构造函数和一个析构函数,在创建wllm类的对象会调用construct函数,然后设置admin=user,passwd=123456.在销毁wllm类时调用destruct函数,会检查admin=admin和passwd=ctf成立吗,如果成立则数据flag,否则输出其他。最后从get获取参数p的值,并将其反序列化为原始的php数据结构。
我们需要的是构造admin=admin,passwd=ctf成立
关于反序列化漏洞https://www.freebuf.com/articles/web/263584.html
反序列化漏洞利用总结 - FreeBuf网络安全行业门户
使用反序列化函数是会自动调用_wakeup魔术方法(前提是该函数存在),即为执行eval(phpinfo()