ホームページ  >  記事  >  運用・保守  >  SoapFormatter 逆シリアル化の脆弱性分析例

SoapFormatter 逆シリアル化の脆弱性分析例

WBOY
WBOY転載
2023-05-14 09:07:051886ブラウズ

1. はじめに

NetDataContractSerializer と DataContractSerializer は、Windows Communication Foundation (WCF) メッセージで送信されたデータをシリアル化および逆シリアル化するために使用されます。 2 つの間には重要な違いがあります。NetDataContractSerializer には CLR が含まれており、追加情報の追加と CLR 型への参照の保存によって型精度をサポートしますが、DataContractSerializer はサポートしません。したがって、NetDataContractSerializer は、シリアル化側と逆シリアル化側で同じ CLR タイプが使用されている場合にのみ使用できます。オブジェクトをシリアル化するには WriteObject または Serialize メソッドを使用し、XML ストリームを逆シリアル化するには ReadObject または Deserialize メソッドを使用します。一部のシナリオでは、悪意のある XML ストリームを読み取ると逆シリアル化の脆弱性が発生し、リモート RCE 攻撃が実行されますが、この記事の著者が原則とコード監査の観点から紹介および再現しました。

2. SoapFormatterSerialization

SoapFormatter クラスによって実装された IFormatter インターフェイスは、コアの Serialize メソッドを定義します。 .NET オブジェクトと SOAP ストリーム間の変換では、データを XML ファイルとして保存でき、公式では 2 つの構築方法が提供されています。

SoapFormatter 逆シリアル化の脆弱性分析例

問題を説明するために古いケースを使用しましょう。最初に TestClass オブジェクトを定義します。

3 つのメンバーを定義し、1 つの静的メソッドを実装します。メソッド ClassMethod がプロセスを開始します。シリアライズでは、オブジェクトのインスタンスをそれぞれ作成することでメンバーに値を割り当てます。

SoapFormatter 逆シリアル化の脆弱性分析例

通常は、Serialize を使用してシリアライズされた SOAP ストリームを取得し、XML を使用して元のプログラムを永続化します。たとえば、次の図の TestClass クラスの開始要素は、a1 名前空間に焦点を当てて、生成された xmlns を使用して修飾されます。および使用法

SoapFormatter クラスの逆シリアル化プロセスは、SOAP メッセージ ストリームをオブジェクトに変換することであり、これは、新しいオブジェクトを作成して Deserialize の複数のオーバーロードされたメソッドを呼び出すことによって実現されます。

IRemotingFormatter インターフェイス定義を見て、IFormatter も継承していることを確認してください。

作者は、新しいオブジェクトを作成して Deserialize メソッドを呼び出します。具体的な実装コードについては、次を参照してください。 SoapFormatter 逆シリアル化の脆弱性分析例


# 逆シリアル化後、メンバーの値TestClassクラスの名前を取得します。

SoapFormatter 逆シリアル化の脆弱性分析例

3.2 攻撃ベクトル - ActiveSurrogateSelector

SoapFormatter 逆シリアル化の脆弱性分析例SoapFormatter クラスの定義にはコンストラクターに加えて、SurrogateSelector 属性もあります。シリアル化プロキシの利点は、フォーマッタが既存の型のインスタンスを逆シリアル化する場合、プロキシ オブジェクトによってカスタマイズされたメソッドを呼び出すことです。 ISurrogateSelector インターフェイスが実装されていることを確認してください。これは次のように定義されています。

SoapFormatter 逆シリアル化の脆弱性分析例

シリアル化プロキシ タイプは System.Runtime.Serialization.ISerializationSurrogate インターフェイスを実装する必要があるため、ISerializationSurrogateは Framework ClassLibrary にあります。定義は次のとおりです。


SoapFormatter 逆シリアル化の脆弱性分析例


##コードは、次のことを決定します。型パーサーの IsSerializable プロパティが利用可能です。直接の基本クラスを返すことができる場合、利用できない場合は、派生クラス System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector の型を取得し、それをアクティベーターに渡します。インスタンスを作成し、GetObjectData メソッド本体に戻ります。さらに、シリアル化されたデータを完全に制御するには、次のように定義される Serialization.ISeralizable インターフェイスを実装する必要があります。

SoapFormatter 逆シリアル化の脆弱性分析例詳細については、「.NET Advanced Code Audit Lesson 2 Json.Net Deserialization Vulnerability」を参照してください。カスタム逆シリアル化クラスを実装する場合は、構築メソッドを通じて攻撃者が提供する PocClass クラスを読み取ります。

SoapFormatter 逆シリアル化の脆弱性分析例

次の図では、PayloadClass クラスを定義して ISerializable インターフェイスを実装し、GetObjectData メソッドで汎用 List コレクションを宣言してバイト型データを受信します。

PocClass オブジェクトを List コレクションに追加し、IEnumerable コレクションの map_type を使用してジェネリック型を宣言し、アセンブリ リフレクションによって取得された Type を受け取り、IEnumerable 型を返します。最後に、Activator.CreateInstance を使用して、インスタンスを作成し、e3 に保存します。これは列挙コレクションです。 SoapFormatter 逆シリアル化の脆弱性分析例


#上の図では、変数 e3 をページング コントロール データ ソースに入力しています。Pag​​eDataSource クラス定義を見ると一目瞭然です。

#これを除くまた、System.Runtime.Remoting.Channels.AggregateDictionary によって返される型は IDictionary をサポートし、オブジェクト DesignerVerb をインスタンス化し、任意に値を割り当てるこの型が主に使用されますMenuCommand クラスのプロパティ属性の値を入力し、最後にハッシュ テーブル内の修飾されたバケットを入力します。 SoapFormatter 逆シリアル化の脆弱性分析例

SoapFormatter 逆シリアル化の脆弱性分析例

次に、コレクションを使用してデータ ソース DataSet を追加します。DataSet オブジェクトと DataTable オブジェクトは System.ComponentModel.MarshalByValueComponent クラスを継承します。リモート処理をサポートする ISerializable インターフェイス。ADO.NET オブジェクトの中でリモート処理をサポートし、バイナリ形式で永続化される唯一のオブジェクトです。


SoapFormatter 逆シリアル化の脆弱性分析例

プロパティ DataSet.RemotingFormat の値を SerializationFormat.Binary に変更し、プロパティ DataSet.CaseSensitive を false などに変更してから、BinaryFormatter を呼び出してリストをシリアル化します。以下に示すように、コレクション。


SoapFormatter 逆シリアル化の脆弱性分析例

RemotingFormat 属性が Binary として指定されているため、BinaryFormatter フォーマッタが導入され、属性 SurrogateSelector エージェントがカスタム MySurrogateSelector クラスとして指定されます。シリアル化後、SOAP-XML が取得され、SoapFormatter オブジェクトの Deserialize メソッドを使用して、読み取られたファイル コンテンツのストリーム データが解析され、電卓が正常にポップアップ表示されます


SoapFormatter 逆シリアル化の脆弱性分析例


3.3 攻撃ベクトル - PSObjectSoapFormatter 逆シリアル化の脆弱性分析例

作者の Windows ホストには CVE-2017-8565 (Windows PowerShell リモート コード実行の脆弱性) のパッチが適用されているため)、悪用は失敗したため、ここで詳細な議論を行わずに、興味のある友人が独自に調査することができます。パッチの詳細については、次を参照してください: https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability

SoapFormatter 逆シリアル化の脆弱性分析例 4. コード監査SoapFormatter 逆シリアル化の脆弱性分析例

4.1

XML ローディング

コード監査の観点から脆弱性の EntryPoint を見つけ、それを XML で渡すと、逆シリアル化できます。 LoadXml は XML データを直接ロードするため、この点も XXE 脆弱性の原因となる可能性があります。たとえば、次のコード:

この種の汚染ポイントの脆弱性の攻撃コストは非常に低く、攻撃者は受信文字列パラメータ ソースを制御するだけで済みます。簡単に逆シリアル化を実現し、脆弱性を悪用して計算機をポップアップさせます。


#4.2 ファイルの読み取りSoapFormatter 逆シリアル化の脆弱性分析例

#これはアプリケーションから取得されたコード スニペットです。監査中は、あなただけがアクセスできます。 DeserializeSOAP メソッドで渡されるパス変数が制御可能かどうかに注意する必要があります。 SoapFormatter 逆シリアル化の脆弱性分析例

以上がSoapFormatter 逆シリアル化の脆弱性分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。