记录一次CTF解题PHP反序列化

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

PHP反序列化

序列化通俗来讲就是将对象转化为可以存储、传输的字符串,反序列化就是把那串字符串再变回对象。

例如:

<?php
class chybate {
    var $test = '123456';
}
$cless1 = new chybate;

// 序列化
$cless1_ser = serialize($cless1);
echo $cless1_ser . '\n';

// 反序列化
$cless1_user = unserialize($cless1_ser);
print_r($cless1_user);
?>
O:7:"chybate":1:{s:4:"test";s:6:"123456";}
chybate Object
(
    [test] => 123456
)

这里序列化结果中的O就是object对象的意思,数字7代表着对象的函数名长度为7,然后就是对象名"chybate",然后这个数字 1表示对象有一个变量,大括号里的s代表的是string类型,如果是一个i是int型,4表示变量名的长度,后面接着就是变量的值。

题目分析

题目给出了一个类xctf,其中包含一个变量 flag 和一个魔术函数 __wakeup(),用 code 接收一个序列化后的字符串。

记录一次CTF解题PHP反序列化

分析给出的源码,其中魔法函数 __wakeup() 是一个突破点,它在反序列化的过程中会被调用。

serialize()unserialize() 函数对魔术方法 __wakeup() 的处理:

serialize() 函数序列化对象时,如果对象中定义了 __sleep() 方法,将会调用该方法来确定哪些属性需要被序列化。如果对象没有定义 __sleep() 方法,将会序列化对象的所有属性。

unserialize() 函数反序列化对象时,如果对象中定义了 __wakeup() 方法,将会在对象反序列化后调用该方法 __wakeup() 方法用于初始化反序列化后的对象状态,通常用于重新建立对象和其相关资源之间的联系。

__wakeup() 的一个绕过点:一个对象被序列化后,如果它的属性被修改,那么它在反序列化的过程中则不会执行 __wakeup() 函数。

解题

解题思路就是,修改序列化后中的属性来绕过 __wakeup()。

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

xctf序列化:

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

当被反序列化的字符串中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得 __wakeup() 函数失效。

构造payload: /?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";},这里将变量的个数改为2,属性个数发生变化,这样 __wakeup() 在初始化反序列化后的对象状态时就就会失效。

记录一次CTF解题PHP反序列化

成功get flag!

总结

PHP反序列化漏洞原理就是,在反序列化该对象时触发魔术方法从而执行命令或代码。

PHP序列化需注意以下几点:

  • 序列化只序列属性,不序列方法。

  • 能控制的只有类的属性,攻击就是寻找合适能被控制的属性,利用作用域本身存在的方法,基于属性发起攻击。


若有错误,欢迎指正!o( ̄▽ ̄)ブ文章来源地址https://www.toymoban.com/news/detail-855156.html

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

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

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

相关文章

  • CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半

    2024年02月08日
    浏览(40)
  • Fastjson 结合 jdk 原生反序列化的利用手法 ( Aliyun CTF )

    2023 Aliyun CTF ezbean是一道CTF java反序列化题目。 题目的目的是让选手通过一个java原生反序列化入口,最终达成RCE。本文对题目的几种解法做了具体的分析,主要分为预期解法和非预期解法两种思路。通过对Fastjson在反序列化的行为分析,从两个方向攻克本题。 题目的逻辑简单

    2024年02月07日
    浏览(43)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(52)
  • Java反序列化和PHP反序列化的区别

    反序列化存在的意义是为了数据传输,类是无法直接进行传输的。通过序列化后转换为字符串格式或者JSON格式进行传输 。 序列化与反序列化 seriallization 序列化 : 将对象转化为便于传输的格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。 deseriall

    2024年02月07日
    浏览(39)
  • 反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(48)
  • 基于PHP反序列化练习

     PHP创建一个以自己姓名命名的类,要求存在两个属性,name,age,进行序列化,输出序列化以后的数据。 序列化后数据: 手动修改序列化后的数据实现age年龄+100,输出反序列化后的内容:

    2024年01月23日
    浏览(64)
  • php反序列化漏洞基础

            序列化是将对象或类转换为字符串的过程 ,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。         通过 序列化,可以将对象或类转换成一串字

    2024年01月20日
    浏览(64)
  • PHP反序列化漏洞原理

    1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。

    2024年01月16日
    浏览(62)
  • PHP反序列化漏洞-魔术方法绕过

    一、__wakeup()魔法函数绕过: 在PHP中,__wakeup()是一个魔术方法,用于在反序列化对象时自动调用。 当反序列化字符串中的对象属性个数大于实际属性个数时 ,可以利用这个漏洞进行绕过。 触发条件: PHP版本为5.6.25或早期版本,或者PHP7版本小于7.0.10。 反序列化字符串中的对

    2024年01月18日
    浏览(55)
  • 无涯教程-PHP - Filtered反序列化

    PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化时提供更好的安全性。 它产生以下浏览器输出- PHP - Filtered反序列化 - 无涯教程网 无涯教程网提供PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化... https://www.lea

    2024年02月10日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包