一、漏洞原理:
二、靶场复现:
进入靶场,分析源代码:
<?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 提交: