NetDataContractSerializer는 DataContractSerializer와 마찬가지로 WCF(Windows Communication Foundation) 메시지로 전송된 데이터를 직렬화 및 역직렬화하는 데 사용됩니다. 둘 사이에는 중요한 차이점이 있습니다. NetDataContractSerializer에는 CLR이 포함되어 있으며 추가 정보를 추가하고 CLR 유형에 대한 참조를 저장하여 유형 정밀도를 지원하는 반면 DataContractSerializer는 그렇지 않습니다. 따라서 NetDataContractSerializer는 직렬화 및 역직렬화 측면에서 동일한 CLR 유형이 사용되는 경우에만 사용할 수 있습니다. 개체를 직렬화하려면 WriteObject 또는 Serialize 메서드를 사용하고, XML 스트림을 역직렬화하려면 ReadObject 또는 Deserialize 메서드를 사용하세요. 일부 시나리오에서는 악의적인 XML 스트림을 읽으면 역직렬화 취약점이 발생하여 원격 RCE 공격이 발생합니다. 이 기사의 저자는 이를 원칙 및 코드 감사의 관점에서 소개하고 재현했습니다.
SoapFormatter 클래스에 의해 구현된 IFormatter 인터페이스는 .NET 개체와 SOAP 스트림 간 변환에 매우 편리할 수 있는 핵심 Serialize 메서드를 정의하며 데이터를 XML 파일로 저장할 수 있습니다. 공무원은 두 가지 건설 방법을 제공합니다.
문제를 설명하기 위해 이전 사례를 사용하겠습니다. 먼저 TestClass 개체를 정의합니다.
세 개의 멤버를 정의하고 정적 메서드 ClassMethod를 구현하여 프로세스를 시작합니다. 직렬화는 각각 개체 인스턴스를 생성하여 멤버에 값을 할당합니다.
일반적으로 직렬화는 직렬화된 SOAP 스트림을 얻는 데 사용되며 원래 어셈블리는 XML 네임스페이스를 사용하여 유지됩니다. 아래 그림의 TestClass 클래스는 xmlns를 사용하여 생성되어 a1 네임스페이스에 집중합니다.
<envelope> <body> <testclass> <classname>360</classname> <name>Ivan1ee</name> <age>18</age> </testclass> </body> </envelope>
SoapFormatter 클래스 deserialization 프로세스는 SOAP 메시지 스트림을 객체로 변환하는 것입니다. 새 객체 생성 이는 Deserialize의 여러 오버로드된 메서드를 호출하여 구현됩니다. 정의를 확인하고 IRemotingFormatter 및 IFormatter 인터페이스가 구현되었는지 확인하세요.
IRemotingFormatter 인터페이스 정의를 살펴보고 IFormatter도 상속하는지 확인하세요.
코드는 유형 파서의 IsSerialized 속성이 사용 가능한지 여부를 결정합니다. 사용 가능한 경우 직접 기본 클래스가 반환되며, 파생 클래스인 System.Workflow.ComponentModel이 반환됩니다. Serialization.ActivitySurrogateSelector를 얻은 후 Activator에 전달하여 인스턴스를 생성한 다음 반환합니다. GetObjectData 메서드 본문에서 직렬화된 데이터를 완전히 제어하려면 다음과 같이 정의된 Serialization.ISeralized 인터페이스를 구현해야 합니다. 자세한 소개는 ".NET 고급 코드 감사 강의 2 Json.Net 응답 직렬화 취약점"을 참조하세요. 사용자 정의 역직렬화 클래스를 구현할 때 공격자가 제공하는 PocClass 클래스를 생성자 메서드를 통해 읽습니다.
다음 그림에서는 ISerialized 인터페이스를 구현하기 위한 PayloadClass 클래스를 정의한 다음 GetObjectData 메서드에서 바이트 유형 데이터를 수신하기 위한 일반 List 컬렉션을 선언합니다.
List 컬렉션에 PocClass 개체를 추가하고 선언합니다. IEnumerable 컬렉션 map_type을 사용하는 제네릭은 어셈블리에 의해 반영된 Type을 수신하고 IEnumerable 유형을 반환합니다. 마지막으로 Activator.CreateInstance를 사용하여 인스턴스를 생성하고 이를 e3에 저장합니다. 이때는 열거 컬렉션의 반복자입니다. .
위 그림은 페이징 제어 데이터 소스에 변수 e3을 채웁니다.
또한 System.Runtime.Remoting.Channels.AggregateDictionary에서 반환된 유형을 확인하세요. IDictionary를 지원하고 Object DesignerVerb를 인스턴스화하고 원하는 대로 값을 할당합니다. 이 클래스는 주로 MenuCommand 클래스 속성 속성의 값을 채우는 데 사용되며 마지막으로 해시 테이블의 자격을 갖춘 버킷에 값을 할당합니다.
다음으로 컬렉션을 사용하여 데이터 소스 DataSet을 추가합니다. DataSet 및 DataTable 개체는 데이터를 직렬화하고 원격 처리를 지원할 수 있는 System.ComponentModel.MarshalByValueComponent 클래스에서 상속됩니다. 원격 처리를 지원하는 NET 개체입니다. 바이너리 형식으로 처리되고 유지되는 개체입니다.
아래와 같이 DataSet.RemotingFormat 속성 값을 SerializationFormat.Binary로 변경하고 DataSet.CaseSensitive 속성을 false 등으로 변경한 다음 BinaryFormatter를 호출하여 List 컬렉션을 직렬화합니다.
RemotingFormat 속성이 Binary로 지정되므로 BinaryFormatter 포맷터가 도입되고 SurrogateSelector 에이전트 속성이 사용자 정의 MySurrogateSelector 클래스로 지정됩니다. 직렬화 후 SOAP-XML을 얻은 다음 SoapFormatter 개체의 Deserialize 메서드를 사용하여 읽은 파일 콘텐츠의 스트림 데이터를 구문 분석하면 계산기가 성공적으로 팝업됩니다. CVE-2017-8565(Windows PowerShell 원격 코드 실행) 취약점)이 패치되었으며 익스플로잇이 성공하지 못했기 때문에 여기에서는 이에 대해 깊이 논의하지 않겠습니다. 관심 있는 친구들은 스스로 연구할 수 있습니다. 패치에 대한 자세한 내용은 https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability
XML Load
이것은 애플리케이션에서 가져온 코드 조각이며, DeserializeSOAP 메서드에 전달된 경로 변수가 제어 가능한지 여부에만 주의하면 됩니다.
위 내용은 SoapFormatter 역직렬화 취약점 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!