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