>운영 및 유지보수 >안전 >SoapFormatter 역직렬화 취약점 예시 분석

SoapFormatter 역직렬화 취약점 예시 분석

WBOY
WBOY앞으로
2023-05-14 09:07:051954검색

1. 서문

NetDataContractSerializer는 DataContractSerializer와 마찬가지로 WCF(Windows Communication Foundation) 메시지로 전송된 데이터를 직렬화 및 역직렬화하는 데 사용됩니다. 둘 사이에는 중요한 차이점이 있습니다. NetDataContractSerializer에는 CLR이 포함되어 있으며 추가 정보를 추가하고 CLR 유형에 대한 참조를 저장하여 유형 정밀도를 지원하는 반면 DataContractSerializer는 그렇지 않습니다. 따라서 NetDataContractSerializer는 직렬화 및 역직렬화 측면에서 동일한 CLR 유형이 사용되는 경우에만 사용할 수 있습니다. 개체를 직렬화하려면 WriteObject 또는 Serialize 메서드를 사용하고, XML 스트림을 역직렬화하려면 ReadObject 또는 Deserialize 메서드를 사용하세요. 일부 시나리오에서는 악의적인 XML 스트림을 읽으면 역직렬화 취약점이 발생하여 원격 RCE 공격이 발생합니다. 이 기사의 저자는 이를 원칙 및 코드 감사의 관점에서 소개하고 재현했습니다.

2. SoapFormatterSerialization

SoapFormatter 클래스에 의해 구현된 IFormatter 인터페이스는 .NET 개체와 SOAP 스트림 간 변환에 매우 편리할 수 있는 핵심 Serialize 메서드를 정의하며 데이터를 XML 파일로 저장할 수 있습니다. 공무원은 두 가지 건설 방법을 제공합니다.

SoapFormatter 역직렬화 취약점 예시 분석

문제를 설명하기 위해 이전 사례를 사용하겠습니다. 먼저 TestClass 개체를 정의합니다.

세 개의 멤버를 정의하고 정적 메서드 ClassMethod를 구현하여 프로세스를 시작합니다. 직렬화는 각각 개체 인스턴스를 생성하여 멤버에 값을 할당합니다.

SoapFormatter 역직렬화 취약점 예시 분석

일반적으로 직렬화는 직렬화된 SOAP 스트림을 얻는 데 사용되며 원래 어셈블리는 XML 네임스페이스를 사용하여 유지됩니다. 아래 그림의 TestClass 클래스는 xmlns를 사용하여 생성되어 a1 네임스페이스에 집중합니다.

<envelope>

<body>

<testclass>

<classname>360</classname>

<name>Ivan1ee</name>

<age>18</age>

</testclass>

</body>


</envelope>

3. SoapFormatter deserialization

3.1 Deserialization 원리 및 사용법

SoapFormatter 클래스 deserialization 프로세스는 SOAP 메시지 스트림을 객체로 변환하는 것입니다. 새 객체 생성 이는 Deserialize의 여러 오버로드된 메서드를 호출하여 구현됩니다. 정의를 확인하고 IRemotingFormatter 및 IFormatter 인터페이스가 구현되었는지 확인하세요.

SoapFormatter 역직렬화 취약점 예시 분석

IRemotingFormatter 인터페이스 정의를 살펴보고 IFormatter도 상속하는지 확인하세요.

SoapFormatter 역직렬화 취약점 예시 분석

저자가 새 객체를 생성합니다. Deserialize 메서드를 호출하는 구체적인 구현 코드는 다음을 참조하세요.

SoapFormatter 역직렬화 취약점 예시 분석

TestClass 클래스의 Name 멤버 값은 deserialization 후에 가져옵니다.

SoapFormatter 역직렬화 취약점 예시 분석

3.2 공격 벡터 - ActivitySurrogateSelector

SoapFormatter 클래스 정의의 생성자 외에도 SurrogateSelector 속성이 프록시 직렬화의 장점입니다. 유형의 인스턴스를 역직렬화하기 위해 프록시 객체에 의해 사용자 정의된 메서드가 호출됩니다. 다음과 같이 정의된 ISurrogateSelector 인터페이스를 확인하세요.


SoapFormatter 역직렬화 취약점 예시 분석

직렬화 프록시 유형은 System.Runtime.Serialization.ISerializationSurrogate 인터페이스를 구현해야 하기 때문에 ISerializationSurrogate는 Framework ClassLibrary에 다음과 같이 정의됩니다.


SoapFormatter 역직렬화 취약점 예시 분석

SoapFormatter 역직렬화 취약점 예시 분석

SoapFormatter 역직렬화 취약점 예시 분석

코드는 유형 파서의 IsSerialized 속성이 사용 가능한지 여부를 결정합니다. 사용 가능한 경우 직접 기본 클래스가 반환되며, 파생 클래스인 System.Workflow.ComponentModel이 반환됩니다. Serialization.ActivitySurrogateSelector를 얻은 후 Activator에 전달하여 인스턴스를 생성한 다음 반환합니다. GetObjectData 메서드 본문에서 직렬화된 데이터를 완전히 제어하려면 다음과 같이 정의된 Serialization.ISeralized 인터페이스를 구현해야 합니다.

SoapFormatter 역직렬화 취약점 예시 분석

자세한 소개는 ".NET 고급 코드 감사 강의 2 Json.Net 응답 직렬화 취약점"을 참조하세요. 사용자 정의 역직렬화 클래스를 구현할 때 공격자가 제공하는 PocClass 클래스를 생성자 메서드를 통해 읽습니다.


SoapFormatter 역직렬화 취약점 예시 분석

다음 그림에서는 ISerialized 인터페이스를 구현하기 위한 PayloadClass 클래스를 정의한 다음 GetObjectData 메서드에서 바이트 유형 데이터를 수신하기 위한 일반 List 컬렉션을 선언합니다.

SoapFormatter 역직렬화 취약점 예시 분석

List 컬렉션에 PocClass 개체를 추가하고 선언합니다. IEnumerable 컬렉션 map_type을 사용하는 제네릭은 어셈블리에 의해 반영된 Type을 수신하고 IEnumerable 유형을 반환합니다. 마지막으로 Activator.CreateInstance를 사용하여 인스턴스를 생성하고 이를 e3에 저장합니다. 이때는 열거 컬렉션의 반복자입니다. .

SoapFormatter 역직렬화 취약점 예시 분석위 그림은 페이징 제어 데이터 소스에 변수 e3을 채웁니다.

SoapFormatter 역직렬화 취약점 예시 분석

또한 System.Runtime.Remoting.Channels.AggregateDictionary에서 반환된 유형을 확인하세요. IDictionary를 지원하고 Object DesignerVerb를 인스턴스화하고 원하는 대로 값을 할당합니다. 이 클래스는 주로 MenuCommand 클래스 속성 속성의 값을 채우는 데 사용되며 마지막으로 해시 테이블의 자격을 갖춘 버킷에 값을 할당합니다.

SoapFormatter 역직렬화 취약점 예시 분석

다음으로 컬렉션을 사용하여 데이터 소스 DataSet을 추가합니다. DataSet 및 DataTable 개체는 데이터를 직렬화하고 원격 처리를 지원할 수 있는 System.ComponentModel.MarshalByValueComponent 클래스에서 상속됩니다. 원격 처리를 지원하는 NET 개체입니다. 바이너리 형식으로 처리되고 유지되는 개체입니다.

SoapFormatter 역직렬화 취약점 예시 분석

아래와 같이 DataSet.RemotingFormat 속성 값을 SerializationFormat.Binary로 변경하고 DataSet.CaseSensitive 속성을 false 등으로 변경한 다음 BinaryFormatter를 호출하여 List 컬렉션을 직렬화합니다.

SoapFormatter 역직렬화 취약점 예시 분석

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

4를 참조하세요.4.코드 감사

SoapFormatter 역직렬화 취약점 예시 분석

4.1

SoapFormatter 역직렬화 취약점 예시 분석XML Load SoapFormatter 역직렬화 취약점 예시 분석

코드 감사 관점에서 취약한 EntryPoint를 찾아 XML로 전달하고, 역직렬화할 수도 있습니다. 이 방법도 매우 일반적입니다. . 이 지점은 XXE 취약점을 유발할 수도 있습니다. 예를 들어 다음 코드는

이런 종류의 오염 지점 취약점 공격 비용은 매우 낮습니다. 공격자는 들어오는 문자열 매개 변수 소스만 제어하면 역직렬화 취약점 공격을 쉽게 구현하고 계산기를 띄울 수 있습니다.

4.2 파일 읽기


SoapFormatter 역직렬화 취약점 예시 분석이것은 애플리케이션에서 가져온 코드 조각이며, DeserializeSOAP 메서드에 전달된 경로 변수가 제어 가능한지 여부에만 주의하면 됩니다.

위 내용은 SoapFormatter 역직렬화 취약점 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제