一、漏洞原理:
二、靶场复现:
进入靶场,分析源代码:
<?php error_reporting(0); class secret{ var $file='index.php'; public function __construct($file){ $this->file=$file; } function __destruct(){ include_once($this->file); echo $flag; } function __wakeup(){ $this->file='index.php'; } } $cmd=$_GET['cmd']; if (!isset($cmd)){ highlight_file(__FILE__); } else{ if (preg_match('/[oc]:\d+:/i',$cmd)){ echo "Are you daydreaming?"; } else{ unserialize($cmd); } } //sercet in flag.php ?>
分析代码可知,我们只需要将 $file 赋值为 flag.php 并且将 _wakeup()函数绕过即可。
构造payload:
并且将 "serect" 后的 1 改为 2,来绕过 _wakeup()函数。
根据正则表达式,题目不允许 O 的后面有数字,我们只能将 O:6 改为 O:%2B6,其中%2B是加号(+) 的url编码。
将最终的 payload 提交: