8.反序列化

1. 254.

Pasted image 20240315192010.png

解题思路
触发vipOneKeyGetFlag()
username='xxxxxx' 和 $password='xxxxxx';

?username=xxxxxx&password=xxxxxx

2. 开始序列化.

Pasted image 20240315192615.png

  • 这里开始序列化了  $user = unserialize($_COOKIE['user']);
  • 复制ctfShowUser这个类,然后将这个改为truePasted image 20240315193230.png
  • 创建一个对象a,并把a序列化 然后url编码输出来(因为这里是以Url模式发送出去的)
  • Pasted image 20240315193935.png
  • 观察源代码可以发现 他接受这个值是从Cookie里面的user参数Pasted image 20240315194100.png
    同时还要登录才行
  • 传参Pasted image 20240315194440.png
  • Pasted image 20240315194449.png

3. 开始反序列化

Pasted image 20240315195005.png

  • 这里传参要为真Pasted image 20240315195157.png
  • 但这里又要为假Pasted image 20240315195215.png
  • 这里序列化Pasted image 20240315195458.png
  • 将username改为x passwd改为y
    isVIP 改为turePasted image 20240315195634.png

4. 多个class

Pasted image 20240315200004.png

  • 这题明显就是 Class变多了
  • 观察代码发现没有像前面几题一样触发flag的。但是有个eval,这个可以用于触发rce
  • Pasted image 20240315200224.png
  • 在给定的代码中,eval()函数被调用的地方是在backDoor类的getInfo()方法中。要触发eval()函数,需要调用getInfo()方法,并向$code属性提供要执行的代码。
  • Pasted image 20240315204757.pngPasted image 20240315204655.png
    这里去掉了不需要的代码,首先是改成backDoorPasted image 20240315202201.png
  • 这样Pasted image 20240315202244.png
  • 就会触发backDoor里面的getInfo()方法
  • 然后将Pasted image 20240315202359.png
    Pasted image 20240315204820.png

5. 开始过滤

Pasted image 20240315204952.png

  • 这题就是上一关加了过滤
  • 根据gpt可以知道这个过滤的意思是
    过滤O C开头的字母 后跟一个或多个数字,再跟一个冒号Pasted image 20240315210357.png
  • 先看一下发现o c后面跟着的数字有 11 8
  • 于是我们采用str_replace 将:11换成 :+11 :8变成:+8
    Pasted image 20240315212029.png

6. php原生类

Pasted image 20240316121151.png
Pasted image 20240316121203.png

  • 观察代码,要求本地Ip 访问,且token=ctfshow
  • 这里没有发现直接的魔术方法,但是调用了一个不存在的函数getFlag()
  • Pasted image 20240316121418.png可以知道,这个行为会触发call魔术方法
  • ysl.php
  • 使用脚本可以查看到Pasted image 20240316124703.png
  • 查看soapClient的使用方法
SoapClient采用了HTTP作为底层通讯协议,XML作为数据传送的格式,其采用了SOAP协议(SOAP是一

种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息),其次我们知道某个实例化的类,如果

去调用了一个不存在的函数,会去调用 __call 方法

7. 260

<?php  
  
error_reporting(0);  
highlight_file(__FILE__);  
include('flag.php');  
  
if(preg_match('/ctfshow_i_love_36D/',serialize($_GET['ctfshow']))){  
    echo $flag;  
}

题目意思就是你序列化出来的东西需要包含字符串ctfshow_i_love_36D,
那我们直接传ctfhsow=ctfshow_i_love_36D就可以了。

8. web261

9. web267

Pasted image 20240317160125.png打开先登录Pasted image 20240317161023.png