На этот раз нам предстоит провести инъекцию на странице где выдаются случайные цитаты, наверняка встречали на каком нибудь сайте такую вещь как "цитата дня" или "слово дня". Многие не фильтруют ввод пользователя (многие даже думают что никакого ввода и нет), ведь уверены что данные доступные через эту форму (а это форма хоть и без видимых инпутов, хотя один hidden input там все же есть, можете убедиться если откроете редактор Ctrl+Shift+C или Ctrl+Shift+I) выдаются только из этой без обидной таблицы, не содержащей критической информации. Но хватит предисловий, приступим!
Мне досталась цитата номер 3, это видно в адресной строке, и если я не объяснил что все инъекции мы в этот раз будем вводить только через адресную строку, а сами вы не догадались, то наверно вам лучше сперва где то набраться основ того как вообще устроены все эти сайты и т.д.
Первым делом что надо проверить это доступен ли параметр для инъекций, для этого можно попробовать что то типа:
3+1
если отобразит цитату под номером 4, то с этим параметром можно работать, но будьте бдительны (и наверно те у кого есть хоть какой то опыт уже собирались возразить): при вводе + в адресной строке он интерпретируется как пробел, чтобы ввести "+" его можно преобразовать с помощью url encode (инструмент доступен на сайте rimgzer0team в разделе Tools), получим %2B, соответственно наши стартовая тестовая инъекция:
3%2B1
Мы попадаем на страницу с другой цитатой (иначе и быть не могло, ведь в этом вся соль задания). Дальше попробуем вывести все имеющеися цитаты, вдруг внутри одной из них и есть флаг, инъекция:
?q=3+or+1
И мы видим сообщение об ошибке:
Как видно в самом сообщении весь текст нашего запроса написан слитно, видимо есть фильтрация типа (пример на php):
$string=str_replace(" ","",$_GET['q']);
Если кто то видит в этом проблему и кажется что подобные решения надежно защищают ваши данные в БД, я спешу вас расстроить, есть обходной маневр - комментарий, например:
"3/**/or/**/1" будет равносильно "3 or 1" для большинства (??) СУБД
это связано с интерпретацией комментариев, комментарии игнорируются интерпретатором, но они служат разделителем в запросе
Пробуем вышеуказанный запрос и получаем вот такой результат:
Хорошая новость тут в том что это работает, а плохая в том что среди цитат не оказалось флага (но наверно это было бы слишком легко для задания за 4 очка).
Нам ничего не остается как поискать среди таблиц ту в которой мог бы находиться флаг. Данные обо всех таблицах, например (а это очень популярная СУБД), в Mysql версией 5 и выше хранятся в БД information_schema (если эта комбинация символов для вас что то новое, то советую поискать о ней информацию в интернете, ведь в ней содержится очень много интересной служебной информации), попробуем достать оттуда что-нибудь стоящее.
Для начала нам нужна таблица со всеми табилцами, она называется (вы не поверите) - TABLES, запрос:
3/**/or/**/1/**/union/**/select/**/1/**/from/**/information_schema.tables
В качестве колонки для выбора мы зачем то указали 1 - это нужно для того чтобы пока что только прощупать количество колонок которое выбиралось в запросе в который вводится инъекция, в случае если количество колонок другое мы должны получить ошибку, либо ничего не выведется вовсе.
Соответственно в запросе была более чем одна выбираемая колонка, пробуем две, запрос:
3/**/or/**/1/**/union/**/select/**/1,2/**/from/**/information_schema.tables
Результат:
Судя по тому что ошибки нет и нам вывелась "2" в последней цитате, колонок всего две (в выборке) и нам визуально будет доступна вторая, подставим вместо 2 table_name и нам станет доступен список всех имеющихся таблиц, запрос:
3/**/or/**/1/**/union/**/select/**/1,table_name/**/from/**/information_schema.tables
если кто запутался, то это все до сих пор вводится в адресную строку, но я удивлен что вы до сюда дочитали
Часть результата:
Как видим все появившиеся таблицы стандартный набор, кроме последних двух, и если содержимое одной мы уже рассмотрели, то соответственно нужная нам информация хранится в другой ( alkdjf4iu ). Сперва нам лучше получить названия полей в этой таблице на случай если их там более двух (чтобы снова не было сообщения об ошибке), эти данные содержатся в таблице COLUMNS, наш запрос будет:
3/**/or/**/1/**/union/**/select/**/1,column_name/**/from/**/information_schema.columns/**/where/**/table_name=%27alkdjf4iu%27
Но видимо что то не задалось или я уже не вижу в чем я тут ошибся, но запрос не от работал и вывелась ошибка (если вы ее видите то отпишитесь в комментариях):
Я попробовал варианты с LIKE и что то еще но все безуспешно, и решил попробовать угадать названия полей (логично было бы если поле с флагом бы называлось flag например), пишем запрос:
3/**/or/**/1/**/union/**/select/**/1,flag/**/from/**/alkdjf4iu
И о чудо, это то что нам нужно:
Меня это воодушевило и решил попробовать угадать название второго поля, я попробовал очень популярный вариант "id".
3/**/or/**/1/**/union/**/select/**/id,flag/**/from/**/alkdjf4iu
Этот запрос возвращает тот же самый результат что и предыдущий (поскольку данные первого поля не выводятся), да и всем очевидно какой может быть id в таблице с одной строкой (я проверил id = 289034 , не так уж и очевидно). В общем, флаг у нас, за это задание мы получаем 4 очка (а значит задание не совсем базовое)!
That's all, folks!