首页 > 编程语言 >【PHP安全系列】demo:PHP 反序列化漏洞①

【PHP安全系列】demo:PHP 反序列化漏洞①

时间:2024-08-13 16:51:08浏览次数:9  
标签:test2 demo unserialize action PHP test 序列化

<?php
 class index {
     private $test;
     public function __construct()
     {
         $this->test = new normal();
     }
     public function __destruct()
     {
         $this->test->action();
     }
 }
 class normal {
     public function action(){
         echo "please attack me";
     }
 }
 class evil {
     var $test2;
     public function action(){
         eval($this->test2);
     }
 }
 unserialize($_GET['test']);

这段代码包含了一个 PHP 的反序列化漏洞,可能会导致代码执行漏洞。让我们逐步解析每部分代码,帮助你理解其中的关键概念和潜在风险。

代码结构解析

1. index

class index {
    private $test;

    public function __construct()
    {
        $this->test = new normal();
    }

    public function __destruct()
    {
        $this->test->action();
    }
}
  • 属性: 该类有一个私有属性 $test,它会在构造函数中被初始化为 normal 类的实例。
  • 构造函数: 当 index 类的实例被创建时,$test 被设置为 normal 类的对象。
  • 析构函数: 当 index 类的实例被销毁时,$test->action() 被调用。由于 $testnormal 类的对象,所以会调用 normal 类的 action() 方法。

2. normal

class normal {
    public function action(){
        echo "please attack me";
    }
}
  • 这个类有一个 action() 方法,它只会输出字符串 "please attack me"

3. evil

class evil {
    var $test2;

    public function action(){
        eval($this->test2);
    }
}
  • 属性: 该类有一个公开的属性 $test2,它可以存储任意数据。
  • 方法: action() 方法会调用 eval() 函数。eval() 函数执行其参数作为 PHP 代码,因此如果 $test2 包含 PHP 代码,它将被执行。

漏洞分析

unserialize($_GET['test']);
  • unserialize(): 这个函数用于将序列化的字符串转换回 PHP 对象。它会根据序列化的数据重建对象及其属性。

潜在风险

由于 unserialize() 允许通过序列化数据创建对象,如果攻击者能够控制传递给 unserialize() 的数据,他们可以创建 evil 类的实例,并设置其属性 $test2。然后,在反序列化过程中,如果创建了 index 类的实例并调用析构函数,会触发 evil 类的 action() 方法,执行 $test2 中的任意 PHP 代码。

攻击过程示例

  1. 构造恶意数据:

    $evilPayload = serialize(array(
        'test' => new evil()
    ));
    

    在这个例子中,我们创建了一个 evil 类的实例,并将其放入序列化的数据中。

  2. 设置 $test2:

    $evilObject = new evil();
    $evilObject->test2 = 'echo "This is a test";'; // 可以是任何 PHP 代码
    $evilPayload = serialize(array(
        'test' => $evilObject
    ));
    
  3. 利用漏洞:
    evilPayload 传递给 URL 中的 test 参数,例如:

    http://example.com/script.php?test=O:4:"evil":1:{s:4:"test2";s:22:"echo 'This is a test';";}
    

    这会导致 unserialize() 创建一个 evil 对象,并在 index 对象的析构时执行 echo 'This is a test';

解决方案

  • 禁用 unserialize(): 如果不需要反序列化,最好禁用该功能。
  • 使用 allowed_classes: PHP 5.6 及更高版本支持 unserialize()allowed_classes 选项,可以限制反序列化的类。
    unserialize($_GET['test'], ['allowed_classes' => ['index']]);
    
  • 安全库: 使用经过验证的库进行对象序列化和反序列化,避免直接使用 unserialize()

了解这些概念可以帮助你更好地理解 PHP 反序列化的风险,并采取相应的安全措施。

标签:test2,demo,unserialize,action,PHP,test,序列化
From: https://www.cnblogs.com/o-O-oO/p/18357284

相关文章

  • Thinkphp8 通过中间件 和 属性 简单实现AOP
    转载请著名来源,侵权必究//属性接口declare(strict_types=1);namespaceapp\common\attribute;interfaceAttributeHandler{publicfunctionhandler(mixed$handler);}//不需要登陆属性declare(strict_types=1);namespaceapp\common\attribute;/***跳......
  • 快速运行php服务
    下载小皮面板在官网寻找合适的安装包:https://www.xp.cn/安装并打开;启动服务管理页面,可以修改服务器端口号以及其它配置把需要运行的PHP放入上图“打开根目录下”的地址即可放入php文件后url路径添加对应的文件名即可查看效果......
  • 基于Dango+微信小程序的广西东盟旅游资源信息管理系统+80003(免费领源码)可做计算机毕业
    django广西-东盟旅游资源信息管理系统小程序摘 要在社会快速发展和人们生活水平提高的影响下,旅游产业蓬勃发展,旅游形式也变得多样化,使旅游资源信息的管理变得比过去更加困难。依照这一现实为基础,设计一个快捷而又方便的基于小程序的旅游资源信息管理系统是一项十分重要并且......
  • PHP 返回结果给前端/ajax后,在后台继续执行代码的方法
    .问题背景在实际项目开发中,遇到一个问题:前端通过Ajax请求后台PHPAPI接口,执行多文件的打包下载操作,该请求由于需要更新大量的数据(日志、统计等信息)到数据库且还需要执行较大的磁盘IO操作,导致该请求很耗时间。由于前端页面的更新需要快速响应,因此需要PHP快速返回计算结果,然......
  • 报错:2024-08-12T18:39:35.313+08:00 ERROR 29668 --- [demo2] [ main] o.s.
    org.springframework.beans.factory.BeanDefinitionStoreException:Failedtoparseconfigurationclass[com.example.demo.DemoApplication]atorg.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179)~[spring-con......
  • PHP性能优化秘籍:让代码飞起来
    标题:PHP性能优化秘籍:让代码飞起来PHP作为一门广泛使用的服务器端脚本语言,其性能直接影响到Web应用的响应速度和用户体验。本文将深入探讨PHP性能优化的多种技巧,从代码层面到服务器配置,帮助你的PHP应用达到最佳性能。我们将通过一系列详细的优化策略和实际代码示例,展示如何......
  • 2024年华为OD机试真题-模拟数据序列化传输-Java-OD统一考试(C卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:模拟一套简化的序列化只传输方式,请实现下面的数据编码与解码过程1、编码前数据格式为[位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer......
  • 文件包含与PHP伪协议
    文件包含与伪协议一、无任何过滤措施的文件包含漏洞:(ctfshow-web78):1、data://协议:?file=data://text/plain,<?phpsystem('tacflag.php');?>2、php://filter协议:?file=php://filter/read=convert.base64-encode/resource=flag.php得到base64加密过后的数据,对数据进行bas......
  • php除数为0无法捕获
    先看一个代码$num=0;try{echo1/$num;}catch(Exception$e){echo$e->getMessage();}这时候得catch是无法捕获除数为0得错误修复<?phpfunctionerrorHandler($errno,$errstr,$errfile,$errline){//检查错误类型是否为除以零if($errn......
  • PHP身份证三要素核验接口集成-身份证三要素查询真伪-身份证三要素实名认证
    身份证三要素实名认证接口简介:身份证三要素实名认证是核验身份证号、姓名、证件头像是否一致,以此来验证身份证的真伪,现已被广泛应用于电商、银行、保险等各种需要对身份真伪进行核查的场景。身份证三要素实名认证接口核验返回参数说明如下:序号 名称 类型 说明1 user_check_res......