NetDataContractSerializer と DataContractSerializer は、Windows Communication Foundation (WCF) メッセージで送信されたデータをシリアル化および逆シリアル化するために使用されます。 2 つの間には重要な違いがあります。NetDataContractSerializer には CLR が含まれており、追加情報の追加と CLR 型への参照の保存によって型精度をサポートしますが、DataContractSerializer はサポートしません。したがって、NetDataContractSerializer は、シリアル化側と逆シリアル化側で同じ CLR タイプが使用されている場合にのみ使用できます。オブジェクトをシリアル化するには WriteObject または Serialize メソッドを使用し、XML ストリームを逆シリアル化するには ReadObject または Deserialize メソッドを使用します。一部のシナリオでは、悪意のある XML ストリームを読み取ると逆シリアル化の脆弱性が発生し、リモート RCE 攻撃が実行されますが、この記事の著者が原則とコード監査の観点から紹介および再現しました。
SoapFormatter クラスによって実装された IFormatter インターフェイスは、コアの Serialize メソッドを定義します。 .NET オブジェクトと SOAP ストリーム間の変換では、データを XML ファイルとして保存でき、公式では 2 つの構築方法が提供されています。
問題を説明するために古いケースを使用しましょう。最初に TestClass オブジェクトを定義します。
3 つのメンバーを定義し、1 つの静的メソッドを実装します。メソッド ClassMethod がプロセスを開始します。シリアライズでは、オブジェクトのインスタンスをそれぞれ作成することでメンバーに値を割り当てます。
通常は、Serialize を使用してシリアライズされた SOAP ストリームを取得し、XML を使用して元のプログラムを永続化します。たとえば、次の図の TestClass クラスの開始要素は、a1 名前空間に焦点を当てて、生成された xmlns を使用して修飾されます。および使用法
作者は、新しいオブジェクトを作成して Deserialize メソッドを呼び出します。具体的な実装コードについては、次を参照してください。
SoapFormatter クラスの定義にはコンストラクターに加えて、SurrogateSelector 属性もあります。シリアル化プロキシの利点は、フォーマッタが既存の型のインスタンスを逆シリアル化する場合、プロキシ オブジェクトによってカスタマイズされたメソッドを呼び出すことです。 ISurrogateSelector インターフェイスが実装されていることを確認してください。これは次のように定義されています。
シリアル化プロキシ タイプは System.Runtime.Serialization.ISerializationSurrogate インターフェイスを実装する必要があるため、ISerializationSurrogateは Framework ClassLibrary にあります。定義は次のとおりです。詳細については、「.NET Advanced Code Audit Lesson 2 Json.Net Deserialization Vulnerability」を参照してください。カスタム逆シリアル化クラスを実装する場合は、構築メソッドを通じて攻撃者が提供する PocClass クラスを読み取ります。
次の図では、PayloadClass クラスを定義して ISerializable インターフェイスを実装し、GetObjectData メソッドで汎用 List コレクションを宣言してバイト型データを受信します。
PocClass オブジェクトを List コレクションに追加し、IEnumerable コレクションの map_type を使用してジェネリック型を宣言し、アセンブリ リフレクションによって取得された Type を受け取り、IEnumerable 型を返します。最後に、Activator.CreateInstance を使用して、インスタンスを作成し、e3 に保存します。これは列挙コレクションです。
#上の図では、変数 e3 をページング コントロール データ ソースに入力しています。PageDataSource クラス定義を見ると一目瞭然です。
#これを除くまた、System.Runtime.Remoting.Channels.AggregateDictionary によって返される型は IDictionary をサポートし、オブジェクト DesignerVerb をインスタンス化し、任意に値を割り当てるこの型が主に使用されますMenuCommand クラスのプロパティ属性の値を入力し、最後にハッシュ テーブル内の修飾されたバケットを入力します。
3.3 攻撃ベクトル - PSObject
作者の Windows ホストには CVE-2017-8565 (Windows PowerShell リモート コード実行の脆弱性) のパッチが適用されているため)、悪用は失敗したため、ここで詳細な議論を行わずに、興味のある友人が独自に調査することができます。パッチの詳細については、次を参照してください: https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability4. コード監査
XML ローディング
コード監査の観点から脆弱性の EntryPoint を見つけ、それを XML で渡すと、逆シリアル化できます。 LoadXml は XML データを直接ロードするため、この点も XXE 脆弱性の原因となる可能性があります。たとえば、次のコード:#4.2 ファイルの読み取り
#これはアプリケーションから取得されたコード スニペットです。監査中は、あなただけがアクセスできます。 DeserializeSOAP メソッドで渡されるパス変数が制御可能かどうかに注意する必要があります。
以上がSoapFormatter 逆シリアル化の脆弱性分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。