私は直列化のpython文字列、タプル、リストや辞書を紹介したブログ記事
詳細は以下を参照してください
パイソンの文字列シーケンス、リスト、辞書のシーケンスを、クラスが説明しました
私はこのブログを紹介します python反序列化漏洞 任意代码执行
それでは、どのようにそれを実行するために、任意のコードをデシリアライズ?
話にまず__reduce__
魔法の方法、
この方法は、シーケンスのどのオブジェクトクラスを示すために使用されなければならない
、それはタプル型は、任意のコードの実行を実装することができ返すとき
例えば:
import pickle
import os
class Student(object):
name = 'yuaneuro'
age = '20'
def __reduce__(self):
cmd = "dir"
return os.system, (cmd,)
y = pickle.dumps(Student())
print(y)
pickle.loads(y)
結果:
私たちは、逆シリアル化操作の実装は、当社の実行時にことがわかりdir
コマンドを
私たちは分析から連載となります。
b'\x80\x03cnt\nsystem\nq\x00X\x03\x00\x00\x00dirq\x01\x85q\x02Rq\x03.'
説明:
\ 03使ってc
オペレータ導入nt
モジュールのsystem
機能nt
モジュールはあるos
モジュールwindows
上で実施
q\x00
識別system
関数memo
インデックス領域
X\x03\x00\x00\x00
識別後ろdir
の文字列の長さ
q\x01
を識別するdir
のメモ領域内の文字列のインデックス
\x85
メタ要素を確立しますグループは、この要素は、DIR先行する文字列で
q\x02
識別するインデックス領域メモにおけるタプル
R
スタック(システム)の機能オペレータ識別ラントップ、およびDIRはタプルとして渡されたパラメータが含まれています
我々は、任意のコードの実行に、逆シリアル化の脆弱性を達成するために他の操作にコマンドをDIRすることができます
それでは、どのように、このような抜け穴から守るのですか?
公式には、文書で述べて、pickleモジュールが安全ではない、これまで信頼できないデータをデシリアライズ行っていません。
- あなたは、より高度なインタフェースを使用することができ
__getnewargs()
、__getstate__()
、__setstate__()
及びその代わりに__reduce__()
魔法の方法 - 厳格なフィルタリングのために、デシリアライズする前