Vulnerability 100 - CodeGate 2012 write-up
Vulnerability #1
Очень простой таск на SQL инъекции. На странице загрузки музыки, кроме самого файла, можно выбрать жанр и указать название. Поле с названием фильтруется, а вот жанр - нет. В качестве музыки достаточно передать файл размером 1 байт с расширением .mp3, других проверок на него нет.
После некоторых экспериментов, понимаем, что запрос выполняется примерно следующий:
Т.е. инъекция будет выглядеть так:
С её помощью получаем список баз
Так как нужно узнать, какую музыку слушает админ, а под каждого пользователя создаётся отдельная таблица, то логичнее всего было бы получить имя таблицы, которая была создана раньше остальных
Аналогичным образом получаем список столбцов
И затем содержимое
Но с файлом выходит облом. Оказывается, он хранится прямо в базе в поле типа blob. Получаем его с помощью функции HEX и вот у нас уже есть файл adm.mp3 весом 32кб, длинной 2 секунды, где произносится слово "Congratulation".
Больше ничего интересного найти не удалось, ни в базе, ни в файле. Затем я попробовал запросить длину поля file, и оказалось, что файл весит ~300кб.
Чтобы получить файл полностью, используем множественный INSERT
Затем, через плеер скачиваем файл, и прослушав его полностью, получаем флаг: UPL04D4NDP14Y
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