Как и обещал, разбираю первую задачку из нашего соревнования CTF. Задание называется kavichka, 100 баллов за флаг.
Ссылка ведёт на URL:
http://challenge01.root-me.org/web-serveur/ch9/
Нам предлагают пройти одно из испытаний на root-me.org. В комментариях к задаче сказано: флагом является пароль админа.
Ссылки
Решение
Обратим внимание на название — kavichka. Одно это наводит на мысль об SQL инъекции.
SQL injection — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Атака осуществляется путём внедрения (инъекции) стороннего кода в SQL запрос.
Первый взгляд на задачку:
У нас есть форма логин с двумя полями: логин и пароль. Можно предположить как происходит логин внутри запроса. Скорее всего в запросе написано нечто вроде:
SELECT * FROM table1
WHERE user='' + user + '' AND Password = '' + password + ''
Если разработчик не проверяет входные переменные, то в код можно внедрить инъекцию. Попробуем в поле логина написать что угодно, а в пароль вставить
' OR 1=1; --
Тогда код получится такой:
SELECT * FROM table1
WHERE user=' + user + ' AND Passsword = ' + password + '
SELECT * FROM table1
WHERE user='asd' AND Password = '' OR 1=1; --'
В этом случае условие всегда выполняется. Пробуем.
Бинго! Мы залогинились, вот только не под админом. Да и пароль скрыт, хотя, скрыт ли?
F12 — открываем в браузере консоль, смотрим что лежит в поле password:
Ну вот, пароль лежит в открытом виде, а скрывается звёздочками только из-за того, что тип поля - password. Теперь мы можем спокойно логиниться под юзером user1.
TYsgv75zgtq
Как бы модифицировать инъекцию так, чтобы войти под админом? Угадаем логин админа, пусть будет "admin". Угадаем, что поле в таблице называется "user". Есть варианты не угадывать, а получить с помощью инъекции, но это не сегодня. Сегодня мы удачно угадываем... Хм, несложно придумать такой запрос:
SELECT * FROM table1
WHERE user='asd' AND Password = '' OR user='admin' ; --'
Тогда в поле пароля вставляем:
' OR Username='admin'; --
Пробуем:
Ага, залогинились под юзером admin! Тырим пароль админа — это и есть наш флаг.
Безопасность
- Защищайтесь от SQL инъекций. Одним из хороших способов является использование "параметризированных запросов".
- Не используйте стандартные логины.
- Названия полей таблицы не имеет смысла усложнять, инъекцию можно проводить по идентификаторам колонок.