web漏洞-反序列化之PHPJAVA全解(上)(37)

在这里插入图片描述

 这个很重要

为什么会产生这个东西:序列化之后便于我们对象的传输和保存,这个作用就是为了数据的传递和格式的转换,我们称之为序列化。

在这给过程中,会涉及到一种叫做有类和无类的情况,开发里面经常看到的一个东西,我们称之为类,类对象,存在类的话,在类里面有一些内置的魔术方法,如果有类用到反序列化这个操作,就会触发到里面的魔术方法,有时候在不经意之间就会和其他漏洞相互组合。

无类情况,没有在代码写类,就不会触发到魔术方法,这个要看具体代码里面有没有

利用:1.在真实应用,网站下面,2.各种ctf大赛里面经常出现

反序列化的安全问题,会造成漏洞结合使用,他就会产生sql注入,代码执行,目录遍历等等。

相关的开发语言进行序列化就会转换成二进制,xml,json数据,这种数据反序列就会转换成开发语言,代码形式。

数据格式类型的相互转换

序列化就是对象转换为字符串,反序列化就是字符串转换为对象。

#php反序列化

原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,sql注入,目录遍历等不可控的后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

这就会涉及到两个函数:serialize()  //将一个对象转换成一个字符串 ,序列化

unserialize()//将字符串转换为一个对象。反序列化

出发的原因的就是unserialize()使用这个函数时候,存在变量可以控制,触发类里面的魔术方法。

##先搞一把PHP反序列化热身题稳住-无类问题-本地

一个简单的序列化代码

 这个输出结果是什么意思,s是字符串型,变量长度9,变量名字就是xiaodi123,

 这是无类的一种情况。而把输出的值换到变量key,然后使用unserialize()这个函数,一个简单的反序列化代码看看

 只有使用他对应的格式,才能被反序列化,还原出来。

 

如果代码里面等于123,str该等于是什么,数字的话输出结果就是这种

 如果在123用2“双引号括起来,就还是会以字符串模式显示。

##在橹一把CTF反序列化小真题压压惊-无类执行-实例

 这里提示输入账户密码之后点登录没有反应,可能要换一个提交方式

 提示hint

所以在网站上加上?hint等于个字符串,再去访问网站

返回的源代码,然后从代码里面分析有什么漏洞, 

我们的思路加上让传输的hint值反序列化之后和key的值相等于,就能输出flag,所以这里hint就等于的序列化值,因为代码要cookie提交方式,所以抓住他的数据包,对cookie做修改 

 发送数据包出去,网站并没有任何反应

 这是因为代码里面上面,有一个先接受get的传输的hint值,而我们刚刚的数据包里面hint传输至了,所以就不会执行下面的语句,这时候应该是把hint取掉,在抓一次数据包,然后修改cookie值,

 放出去之后,出来登录框

 还是不可以。

这是因为代码执行有个先后顺序,而key的赋值在后面,比对在前面,所以在前面比对的时候,就比对的key值是空的,

既然key的值比对的时候是空的,所以在cookie值哪里就应该比对是空的反序列化值

 在发送出去数据包,flag就出来了

 所以这一题就有两个陷阱,第一个是if,hinnt值判断,第二个就是代码的执行顺序,

下面开始反序列化里面的精髓一个简单的有类代码

魔术方法

在特定情况下会自动触发的方法

触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法

参考:https://www.cnblogs.com/20175211lyz/p/11403397.html

__construct() //创建对象时触发

__destruct()   //对象被销毁时触发

__call()          //在对象上下文中调用不可访问的方法时触发

__callStatic() //在静态上下文中调用不可访问的方法时触发

__get()           //用于从不可访问的属性读取数据

__set()           //用于将数据写入不可访问的属性

__isset()        //在不可访问的属性上调用isset()或empty()触发

__unset()       //在不可访问的属性上使用unset()时触发

__invoke()     //当脚本尝试将对象调用为函数时触发 

这个代码就是有类的,这里新建了一个对象,变量a,变量a新建等于新的abc,新的abc是新建的就会触发调用构造函数,只要是新建的对象就会调用function_contstruct这个魔术方法;他就会在不经意被调用,这个代码就会被执行。

而序列化,并没有调用下面的函数

反序列化,就触发调用了苏醒函数,wakeup,

而对象死的时候,下面并没有写出发函数,但还是触发了一个析构函数,destrust,这就关系到了上面写的  __destruct()   //对象被销毁时触发  这个了。程序结尾之后会默认调用这个结尾,就会调用那个函数

通过这个实例,在这个类写法里面涉及到序列化,对象被创建,执行完等等,就需要知道魔术方法在什么样的场景下面会被触发;有类和无类的区别就是有没有魔术方法,而魔术方法会在特定的情况下被触发。

ss

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AbstractQueuedSynchronizer源码

介绍 基于队列的抽象同步器,它是jdk中所有显示的线程同步工具的基础,像ReentrantLock/DelayQueue/CountdownLatch等等,都是借助AQS实现的。 public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplemen…

使用omp并行技术加速最短路径算法-迪杰斯特拉(Dijkstra)算法(记录最短路径和距离)

原理: Dijkstra算法是解决**单源最短路径**问题的**贪心算法** 它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径 直到求出从源点到其他各个顶点的最短路径。 首先假定源点为u,顶点集合V被划分为两部分:集合…

【玩转Linux操作】Linux服务管理

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🍔服务(service)管理⭐service管理指令 &…

chatgpt赋能python:Python如何快速提取指定行和列的数据?

Python如何快速提取指定行和列的数据? 在进行数据分析和处理时,常常需要从海量数据中筛选出所需的数据。这时,Python是一款非常强大的工具,可以方便地进行大规模数据清洗和筛选。本文将介绍如何使用Python快速提取指定行和列的数…

chatgpt赋能python:Python提取指定位置字符

Python 提取指定位置字符 Python 是一种高级程序语言,其易读性、简单易学性和易维护性使其成为最受欢迎的编程语言之一。它可以用于各种数据分析和科学计算,包括搜索引擎优化(SEO)。 在SEO中,提取和处理数据是一个重…

监听关闭浏览器触发事件

关闭和刷新页面都会触发,一般都不用来做弹窗提示,一般用来做数据操作 // 监听页面关闭 清除本地缓存 window.onbeforeunload function (e) { localStorage.removeItem("statement"); }; // 监听页面关闭 提醒是否关闭 现在不允许自定义内容了…

【深度学习】5-1 与学习相关的技巧 - 参数的更新(Momentum,AdaGrad, Adam )

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。 但是神经网络的最优化问题非常难。这是因为参数空间非常复杂,无法轻易找到最优解。而且,在深度神经网络中,参…

selenium.chrome怎么写扩展拦截或转发请求?

Selenium WebDriver 是一组开源 API,用于自动测试 Web 应用程序,利用它可以通过代码来控制chrome浏览器! 有时候我们需要mock接口的返回,或者拦截和转发请求,今天就来实现这个功能。 代码已开源: https:/…

9k字长文理解Transformer: Attention Is All You Need

作者:猛码Memmat 目录 Abstract1 Introduction2 Background3 Model Architecture3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Multi-Head Attention3.2.3 Applications of Attention in our Model 3.3 Position-wise Feed…

C++基础(6)——类和对象(运算符重载)

前言 本文主要介绍了C中运算符重载的基本知识。 4.5.1:加号运算符重载(成员函数和全局函数都可实现) 运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1:成员…

防火墙日志记录和监控在网络安全中的重要性

防火墙监视进出网络的流量,并保护部署网络的网络免受恶意流量的侵害。它是一个网络安全系统,根据一些预定义的规则监控传入和传出的流量。它以日志的形式记录有关如何管理流量的信息。日志数据包含流量的源和目标 IP 地址、端口号、协议等。为了有效地保…

Git系列:运用Git创建空白分支进行项目相关文档管理

文章目录 起因一、为什么会选择Git分支二、Git分支的简单介绍和好处三、本次的具体操作1.$git checkout --orphan XXX2.删除当前分支里的内容3.提交新的分支 总结 起因 项目管理过程中没有做好相关文档管理,比如需求,开发,测试等文档&#x…

科技云报道:大模型时代,AI基础软件机会何在?

科技云报道原创。 大模型时代,离不开算力,算法、数据的喂养。如果将视角放至整个产业链上,算法背后,还有一个关键要素值得被关注,那就是AI基础软件。 算法是实现AI功能的关键,而基础软件则为算法提供运行…

React项目引入Arco Design,以及Arco Design Pro 架构

创建项目 创建 react-arco 项目 pnpm create vite my-vue-app --template react安装 arco-design/web-react 安装 react 版的 arco-design 基础使用 添加一个按钮,App.tsx import "./App.css"; import { Button } from "arco-design/web-react…

CH2023、Adobe Character Animator 2023(动画角色制作软件)下载教程、安装教程

最后附下载地址 Adobe CH简介: Adobe Character Animator是一款基于动画制作的软件,它可以将手绘的角色通过摄像头或麦克风捕捉到的实时动作转化为动画效果。该软件结合了人工智能和动画技术,可以快速创建高质量的角色动画,并且…

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术 有了前面的知识之后,想必大家对于算力需求的理解已经越来越深刻了。 除了使用CPU,GPU这样的通用器件之外,采用专用的硬件来进行加速是一个大家都能想到的选择。 其中的代表器件就是…

杂记 | 使用Docker和Nginx为网站添加HTTPS访问功能

文章目录 01 准备工作1.1 HTTPS介绍1.2 准备工作 02 编写nginx.conf03 使用docker启动nginx 01 准备工作 1.1 HTTPS介绍 HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密通信保护网站数据传输的协议。它是 HTTP 协议的安全版本,通…

1.4 掌握Scala运算符

一、运算符等价于方法 (一)运算符即方法 op运算符与.op方法调用是等价的,op表示运算符:、-、*、/…… 演示x y与x.(y)的等价 (二)方法即运算符 1、单参方法 str.indexOf(‘a’) 与 str indexOf ‘a’…

stable-diffusion-webui的介绍与使用——Controlnet1.1

源码地址:https://github.com/lllyasviel/ControlNet | 最新版本 controlnet-v1.1 论文地址:2302.Adding Conditional Control to Text-to-Image Diffusion Models 扩展UI地址(需先安装sd-webui):https://github.com/M…

【gcc, cmake, eigen, opencv,ubuntu】四.opencv安装和使用,获取opencv matiax 的指针

文章目录 ubuntu系统安装opencv1.下载opencv和opencv_contrib2.安装指导3.Linux 下 fatal error: opencv2/opencv.hpp: 没有那个文件或目录4.g 和cmake 编译使用opencv的程序5.opencv,eigen速度比较6.opencv常用类型符号7.获取opencv matiax 的指针 ubuntu系统安装opencv 1.下…