iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Security

【CTF衝衝衝 - Web篇】系列 第 29

【第二十九天 - Python 反序列化】

  • 分享至 

  • xImage
  •  

Q1. 什麼是 python 反序列化

當我們希望在 Python 中保存一個物件(例如將機器學習訓練好的 Model 儲存為檔案,使得未來程式執行時可以將物件狀態直接讀取進記憶體中,不用從頭訓練),此時程式可以將物件的屬性與狀態利用特定的規則編碼,轉為資料序列進行儲存,這便稱為序列化 (Serialize) 。

序列化是許多程式語言都具備的功能,例如先前介紹過的 PHP;而將被序列化的物件還原的過程就稱為反序列化。

Pickle 是 Python 中提供序列化功能的常見 Module,(python2 中,除了 pickle 還有 cPickle)

  • 序列化: pickle.dumps()
  • 反序列化: pickle.loads()
  • 以下是 python 3.8 執行結果

https://ithelp.ithome.com.tw/upload/images/20211013/20140592kebkR7sZ0L.png

Q2. 反序列化利用

Python 中的 __reduce__,類似 PHP 物件中的 __wakeup() 方法,會在反序列化時自動呼叫

import pickle
import os

class Baba(object):
	def __reduce__(self):
    return os.system,("ipconfig",)

payload = pickle.dumps(Baba())
  • 由於 Pickle 的反序列化原理較 PHP 複雜許多,較不易憑空撰寫,這邊建立一個 Class Baba
  • Baba 裡面有個 __reduce__ ,這是一個 magic method ,在反序列化時會自動被呼叫,並且自動執行回傳的參數:
    • 參數有二,第一個參數要是 callable 的物件 (例如一個 function);而第二個參數要是一個 tuple。
    • 反序列化時,會將 tuple 內的元素當作參數,呼叫第一個參數的 function,此例中就相當於 call os.system("ipconfig")
  • pickle.dumps(Baba()) 會建立一個 Baba 物件,並進行序列化。
  • 此時若我們將序列化的 payload 傳入 pickle.loads ,就會成功執行 os.system ,得到 ipconfig 的結果

https://ithelp.ithome.com.tw/upload/images/20211013/20140592VG1QffwQ6x.png


上一篇
【第二十八天 - XSS Lab(2)-6】
下一篇
【第三十天 - 結尾】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-14 12:06:06

恭喜即將邁入完賽啦~

我要留言

立即登入留言