Gray Hat C#, Программирование

#20 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. Определение протоколов, используемых в привязках SOAP.

Здравствуйте, дорогие друзья.

Двумя основными типами привязок являются HTTP и SOAP. Это кажется излишним, но привязки HTTP передают данные по общему протоколу HTTP, используя строку запроса HTTP или параметры POST. Привязки SOAP используют протокол SOAP 1.0 или SOAP 1.1 через простые сокеты TCP или именованные каналы, которые охватывают данные, поступающие на сервер и обратно в формате XML. Класс SoapBinding позволяет вам решить, как взаимодействовать с данным портом SOAP в зависимости от привязки.
Пример узла привязки из WSDL показан в листинге ниже.

Sample binding XML node from the WSDL

Чтобы проанализировать этот узел XML, нашему классу необходимо извлечь некоторую ключевую информацию из узла привязки, как показано в листинге ниже.

The SoapBinding class
The SoapBinding class

Приняв XmlNode в качестве аргумента конструктора SoapBinding, мы сначала присваиваем значения атрибутов имени и типа узла, к свойствам Name [1] и Type [2], класса SoapBinding. По умолчанию, мы устанавливаем для логического свойства IsHTTP значение false. Свойство IsHTTP помогает нам определить, как отправлять данные, которые мы хотим фаззить, используя либо параметры HTTP, либо XML-код SOAP.
Перебирая дочерние узлы, мы проверяем, заканчивается ли имя каждого дочернего узла на «operation» [3], и если да, то добавляем операцию в список SoapBindingOperation. Если имя дочернего узла не заканчивается на «operation», узел должен быть привязкой HTTP. Мы гарантируем, что это так, с помощью оператора else if и устанавливаем для свойства HTTP Verb значение атрибута verb дочернего узла. Мы также установили для IsHTTP значение true. Свойство Verb должно содержать либо GET, либо POST, который сообщает нам, будут ли данные, отправляемые в конечную точку SOAP, содержаться в параметрах строки запроса (GET) или в параметрах POST. Далее мы реализуем класс SoapBindingOperation.

Составление списка дочерних узлов операции

Класс SoapBindingOperation — это небольшой класс, используемый в конструкторе класса SoapBinding. Он определяет несколько строковых свойств, которым будут присвоены значения на основе узла операции, переданного конструктору, как показано в листинге ниже.

The SoapBindingOperation class
The SoapBindingOperation class

Используя XmlNode, переданный конструктору, мы сначала присваиваем свойству Name значение [1] атрибута name, на узле XML. Узел операции содержит несколько дочерних узлов, но нас интересуют только три конкретных узла: http:operation, soap:operation и soap12:operation.
Перебирая дочерние узлы в поисках интересующего нас узла, мы проверяем, является ли данная операция, операцией HTTP или операцией SOAP. Если это операция HTTP [2], мы сохраняем местоположение конечной точки операции, которая представляет собой относительный URI, например /AddUser. Если это операция SOAP, мы сохраняем SoapAction, который используется в определенном заголовке HTTP при выполнении вызовов SOAP к конечной точке SOAP. Когда мы пишем логику фаззинга, эта информация будет использоваться для отправки данных в правильную конечную точку.


Поиск служб SOAP в портах


Прежде чем мы сможем начать фаззинг, нам нужно закончить анализ WSDL. Мы реализуем еще два небольших класса, которые охватывают доступные службы SOAP и порты SOAP в этих службах. Сначала мы должны реализовать класс SoapService, как показано в листинге ниже.

The SoapService class

Класс SoapService принимает узел XML в качестве единственного аргумента конструктора. Сначала мы присваиваем имя службы свойству Name [1], класса, а затем создаем новый список портов под названием SoapPort. Перебирая дочерние узлы в сервисном узле, мы используем каждый дочерний узел для создания нового SoapPort и добавляем новый объект в список SoapPort для дальнейшего использования.
Пример XML-узла службы с четырьмя дочерними узлами портов из документа WSDL показан в листинге ниже.

A sample service node from a WSDL document

Последнее, что нужно сделать, — это реализовать класс SoapPort, для завершения метода ParseServices(), а затем завершить анализ WSDL для фаззинга. Класс SoapPort показан в листинге ниже.

The SoapPort class

Чтобы завершить анализ документа WSDL, мы извлекаем несколько атрибутов из узла порта, передаваемых конструктору SoapPort. Сначала мы сохраняем имя порта в свойстве Name [1], а привязку — в свойстве Binding. Затем, ссылаясь на единственный дочерний узел узла порта с помощью свойства FirstChild [2], мы сохраняем имя и данные о местоположении дочернего узла в свойствах ElementType и Location соответственно.
Наконец, мы разбили документ WSDL на удобные части, которые позволят нам легко написать фаззер для поиска потенциальных SQL-инъекций. Используя различные части WSDL, описанные как классы, мы можем программно управлять автоматическим обнаружением уязвимостей и отчетами о них.

На этом все. Всем хорошего дня!

Цикл статей по Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности.