Перейти к основному содержанию

CTF web — kavichka

CTF

Как и обещал, разбираю первую задачку из нашего соревнования CTF. Задание называется kavichka, 100 баллов за флаг.

ctf

Ссылка ведёт на URL:

http://challenge01.root-me.org/web-serveur/ch9/

Нам предлагают пройти одно из испытаний на root-me.org. В комментариях к задаче сказано: флагом является пароль админа.

Ссылки

CTF - Capture The Flag

Решение

Обратим внимание на название — kavichka. Одно это наводит на мысль об SQL инъекции.

SQL injection — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Атака осуществляется путём внедрения (инъекции) стороннего кода в SQL запрос.

Первый взгляд на задачку:

ctf

У нас есть форма логин с двумя полями: логин и пароль. Можно предположить как происходит логин внутри запроса. Скорее всего в запросе написано нечто вроде:

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; --'

 В этом случае условие всегда выполняется. Пробуем.

ctf

Бинго! Мы залогинились, вот только не под админом. Да и пароль скрыт, хотя, скрыт ли?

F12 — открываем в браузере консоль, смотрим что лежит в поле password:

ctf

Ну вот, пароль лежит в открытом виде, а скрывается звёздочками только из-за того, что тип поля - password. Теперь мы можем спокойно логиниться под юзером user1.

TYsgv75zgtq

Как бы модифицировать инъекцию так, чтобы войти под админом? Угадаем логин админа, пусть будет "admin". Угадаем, что поле в таблице называется "user". Есть варианты не угадывать, а получить с помощью инъекции, но это не сегодня. Сегодня мы удачно угадываем... Хм, несложно придумать такой запрос:

SELECT * FROM table1 
WHERE user='asd' AND Password = '' OR user='admin' ; --'

Тогда в поле пароля вставляем:

' OR Username='admin'; --

Пробуем:

ctf

Ага, залогинились под юзером admin! Тырим пароль админа — это и есть наш флаг.

Безопасность

  1. Защищайтесь от SQL инъекций. Одним из хороших способов является использование "параметризированных запросов".
  2. Не используйте стандартные логины.
  3. Названия полей таблицы не имеет смысла усложнять, инъекцию можно проводить по идентификаторам колонок.

Теги

 

Похожие материалы