[NewStarCTF 2023 公开赛道]Unserialize

本文讨论了PHP中如何处理私有属性$cmd在反序列化过程中的问题,涉及到了不可见字符%00的处理、URL编码技巧以及利用sort命令查看flag文件的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道反序列的基础题,但是细节蛮多的。

这里有一个细节。$cmd 是 private 属性的,赋值只能在内部赋值。即 private $cmd = <命令>

不能

然后if判断语句是过滤我们输入的命令,这里比较好绕过。常见的cat命令代替

编写exp

<?php
highlight_file(__FILE__);
// Maybe you need learn some knowledge about deserialize?
class evil {
    private $cmd="ls";
}


$res=new evil;
echo serialize($res);
?>

浏览器输出的结果:O:4:"evil":1:{s:9:"evilcmd";s:2:"ls";}

这里直接将输出结果传进去是不行的。原因

PHP 序列化的时候 private和 protected 变量会引入不可见字符%00,private是%00类名%00属性名 ,protected为%00*%00属性名 ,注意这两个 %00就是 ascii 码0的字符。这个字符显示和输出可能看不到,甚至导致截断(无法复制),但是url编码后就可以看得清楚.。

就是说上面的O:4:"evil":1:{s:9:"evilcmd";s:2:"ls";}

要改为O:4:"evil":1:{s:9:"%00evil%00cmd";s:2:"ls";}

接下来查看根目录,这里也有一个细节%20算作一个字符串,所以s:后面填4。

最后就是查看flag文件了,可以用上面提到的命令替换cat命令。这里就用sort命令来看。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值