PHP反序列化 字符串逃逸

前言

最近在打西电的新生赛,有道反序列化的题卡了很久,今天在NSS上刷题的时候突然想到做法,就是利用字符串逃逸去改变题目锁死的值,从而实现绕过

为了研究反序列化的字符串逃逸

我们先简单的测试下

原理

复制代码
<?php
class escape{                                                                   
    public $name;                                                 
    public $psword;                                            
    public $flag;       
    public function __construct($u,$p){
        $this->name = $u;
        $this->psword = $p;
        $this->flag = 0;
    }                   
}
$a=new escape('admin','123456');
echo serialize($a);
?> 

输出结果为

复制代码
O:6:"escape":3:{s:4:"name";s:5:"admin";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}

假设我们增加一个检测函数,去替换我们序列化之后的值,则

复制代码
<?php
class escape{                                                                   
    public $name;                                                 
    public $psword;                                            
    public $flag;       
    
    public function __construct($u,$p){
        $this->name = $u;
        $this->psword = $p;
        $this->flag = 0;
    }                   
}
function filter($s){
    return str_replace("admin","hacker",$s);
}

$a=new escape('admin','123456');
$a_filter = filter(serialize($a));
echo $a_filter;
?> 

输出结果为

复制代码
O:6:"escape":3:{s:4:"name";s:5:"hacker";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}

我们比对下这两串输出结果

复制代码
O:6:"escape":3:{s:4:"name";s:5:"admin";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}
O:6:"escape":3:{s:4:"name";s:5:"hacker";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}

可以发现下面那一串的hacker的长度与实际长度不匹配

假设当$flag=1时回显flag,由于题目是改不了的,那么我们就可以利用字符串逃逸来实现

目标字符串

复制代码
O:6:"escape":3:{s:4:"name";s:5:"admin";s:6:"psword";s:6:"123456";s:4:"flag";i:1;}

我们可以把";s:6:"psword";s:6:"123456";s:4:"flag";i:1;}写入到name的值里面,然后通过admin替换hacker的长度差值与之相等即可

我们先写入name里,然后计算下长度为44+5

复制代码
O:6:"escape":3:{s:4:"name";s:49:"admin";s:6:"psword";s:6:"123456";s:4:"flag";i:1;}";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}

由于我们要挤掉后面长度为44的字符串,构造44*admin

payload

复制代码
O:6:"escape":3:{s:4:"name";s:49:"adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin";s:6:"psword";s:6:"123456";s:4:"flag";i:1;}";s:6:"psword";s:6:"123456";s:4:"flag";i:0;}

即实例化上传的为

复制代码
<?php
class escape{                                                                   
    public $name;                                                 
    public $psword;                                            
    public $flag;       
    public function __construct($u,$p){
        $this->name = $u;
        $this->psword = $p;
        $this->flag = 0;
    }                   
}
function filter($s){
    return str_replace("admin","hacker",$s);
}

$a=new escape('adminadminadminadminadminadminadmin
adminadminadminadminadminadminadminadminadminadmin
adminadminadminadminadminadminadminadminadminadmin
adminadminadminadminadminadminadminadminadminadmin
adminadminadminadminadminadminadmin";s:6:"psword";s:6:"123456";s:4:"flag";i:1;}','123456');

$a_filter = filter(serialize($a));
$a_filter_unseri = unserialize($a_filter);
var_dump($a_filter_unseri);

我们可以看到flag的值变为1,成功绕过

相关推荐
木木子2219 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
酷酷的身影20 小时前
Drivers/LedManager.cs
开发语言·php
云水一下21 小时前
DVWA从入门到精通(十七):Open HTTP Redirect(开放重定向)
web安全·dvwa·开放重定向
可靠的仙人掌21 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
qq_422152571 天前
PDF内容复用的几种实用方法:转PPT、转图片、转长图
pdf·php·powerpoint
txg6661 天前
网络安全领域简报(2026年7月3日—10日)
安全·web安全·网络安全
Chengbei111 天前
SoloXSS:一款现代化的自托管 XSS平台
人工智能·安全·web安全·网络安全·自动化·xss·安全架构
weixin_BYSJ19872 天前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
2301_780303902 天前
网络安全、自动化运维、ERP、CRM、MES
运维·web安全·网络安全·自动化·安全威胁分析
用户3074596982072 天前
GatewayWorker 从零到一完整指南
javascript·php