SoapFormatter 逆シリアル化の脆弱性分析例
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 つの構築方法が提供されています。
問題を説明するために古いケースを使用しましょう。最初に TestClass オブジェクトを定義します。
3 つのメンバーを定義し、1 つの静的メソッドを実装します。メソッド ClassMethod がプロセスを開始します。シリアライズでは、オブジェクトのインスタンスをそれぞれ作成することでメンバーに値を割り当てます。
通常は、Serialize を使用してシリアライズされた SOAP ストリームを取得し、XML を使用して元のプログラムを永続化します。たとえば、次の図の TestClass クラスの開始要素は、a1 名前空間に焦点を当てて、生成された xmlns を使用して修飾されます。および使用法
SoapFormatter クラスの逆シリアル化プロセスは、SOAP メッセージ ストリームをオブジェクトに変換することであり、これは、新しいオブジェクトを作成して Deserialize の複数のオーバーロードされたメソッドを呼び出すことによって実現されます。
IRemotingFormatter インターフェイス定義を見て、IFormatter も継承していることを確認してください。作者は、新しいオブジェクトを作成して Deserialize メソッドを呼び出します。具体的な実装コードについては、次を参照してください。
SoapFormatter クラスの定義にはコンストラクターに加えて、SurrogateSelector 属性もあります。シリアル化プロキシの利点は、フォーマッタが既存の型のインスタンスを逆シリアル化する場合、プロキシ オブジェクトによってカスタマイズされたメソッドを呼び出すことです。 ISurrogateSelector インターフェイスが実装されていることを確認してください。これは次のように定義されています。
詳細については、「.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
4. コード監査
4.1
XML ローディング
コード監査の観点から脆弱性の EntryPoint を見つけ、それを XML で渡すと、逆シリアル化できます。 LoadXml は XML データを直接ロードするため、この点も XXE 脆弱性の原因となる可能性があります。たとえば、次のコード:この種の汚染ポイントの脆弱性の攻撃コストは非常に低く、攻撃者は受信文字列パラメータ ソースを制御するだけで済みます。簡単に逆シリアル化を実現し、脆弱性を悪用して計算機をポップアップさせます。
#4.2 ファイルの読み取り
#これはアプリケーションから取得されたコード スニペットです。監査中は、あなただけがアクセスできます。 DeserializeSOAP メソッドで渡されるパス変数が制御可能かどうかに注意する必要があります。
以上がSoapFormatter 逆シリアル化の脆弱性分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









