 |

31.08.2019, 22:16
|
|
Познающий
Регистрация: 17.08.2019
Сообщений: 83
С нами:
3548433
Репутация:
0
|
|
Предыдущая статья - ссылочка
Ссылка на задание: SQL injection challenge
Я вернулся, давайте продолжать начатое дело.
P.S. Отсутствовал из-за проблем со здоровьем, но всё уже в прошлом.
Остановились на 8 задании, очень таки новом для меня.
Из нескольких дней копания в интернете сделал вывод,
что для прохождения данного уровня у меня не хватает
опыта. И решил пойти чуть другой дорогой. Будем
разбирать решение и что самое главное сделаем
из этого выводы для следующих заданий.
Пожалуй закончим болтологию и приступим к делу.
Запрос очень легкий и понятный. Проблема заключается
в ответе от базы данных на стороне клиента, если я правильно
выражаюсь, мы видим только количество записей в столбце.
Но для решения нам нужно узнать пароль пользователя fast.
Из прочитанного мной объяснения:
Для лучшего понимания разберём что такое ASCII. В этом нам поможет Wikipedia:
А теперь посмотрим, что из себя представляет таблица ASCII:
Как видите из заголовков столбцов, VALUE сопоставлено HEX (Шестнадцатеричная система счисления).
То есть букву A можно представить в компьютерном коде, как 41 и так далее, думаю разъяснили.
Взглянем на решение задания и будем отталкиваться от этого:
P.S. Запрос прикрепил, чтобы не пришлось листать вверх.
Так-с. С помощью -1 мы заглушили ID, то есть такогоID не существует и ответом будет FALSE,
а далее мы ставим условие OR и ID<=(Наш символ в HEX-формате). Остальное разберём подробнее.
Для этого, я развернул на Windows MySQL сервер и создал, что-то на подобии базы данных из задания.
P.S. ID, Логина и пароля, мы не знаем, поэтому написал наугад.
Вот отрывок из решения: (select ascii(mid(pass,1,1)).
Сразу возникает вопрос, что такое MID?
Давайте обратимся к нашему братишке Google:
Давайте используем функцию MID на созданной нами базе данных:
Видим, что запрос mid(pass,1,1), извлекает подстроку которая начинает с 1 символа строки и длинною в 1 символ, то есть - буква P.
Хмм. Надеюсь понятно объяснил предназначение функции MID. В любом случае жду в комментариях с вопросами.
Но узнав предназначение MID возникает ещё один вопрос, ЗАЧЕМ ОН НАМ?
Функция ASCII выводит первый символ строки в HEX формате:
В ответ мы получаем значение 80 в ASCII таблице - это буква P.
И чтобы нам перевести второй символ из строки: Password023,
нам нужно обрезать его с помощью mid. Вот так:
Функция ASCII на вход получает ответ от функции MID,
букву "a".
Всё объяснил. Начнём решать таск.
Первый символ из столбца pass = 57, что есть в буквенно-числовом виде = 9.
И так далее. Получаем ASCII значение всех символов в строке и просто переводим их обратно в буквенно-числовой формат.
|
|
|

31.08.2019, 22:39
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Ну что же, рад что ты разобрался по write up как построен запрос, и научился что-то делать с базой, за это +
Я видел этот write up, однако автор пошёл сложным путём, как обычно есть более простые и понятные решения.
|
|
|

31.08.2019, 22:45
|
|
Познающий
Регистрация: 17.08.2019
Сообщений: 83
С нами:
3548433
Репутация:
0
|
|
explorer сказал(а):
Ну что же, рад что ты разобрался по write up как построен запрос, и научился что-то делать с базой, за это +
Я видел этот write up, однако автор пошёл сложным путём, как обычно есть более простые и понятные решения.
Был бы рад узнать о других способах решения)
|
|
|

31.08.2019, 22:55
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Смотри:
Во-первых можно заранее узнать количество знаков в пароле
-1 or login='fast' and pass like '_'#
Символ нижнего подчёркивания равен одному знаку. Начинаешь с 1-го, пока не получишь верный результат видный по смене вывода.
Теперь с тем же самым запросом узнаём сам пароль
-1 or login='fast' and pass like 'a%'#
Перебирая по очереди символы, доходишь до верного. Знак % после символа показывает что мы начинаем с самого начала, и ранее нет других символов.
Предположим мы нашли, что первый символ пароля буква n, тогда следующий запрос будет выглядеть так:
-1 or login='fast' and pass like 'na%'#
То есть мы теперь подбираем второй символ.
Решение самое простейшее, но есть минус - такой подбор крайне долгий, когда оказывается что-то в конце алфавита или вообще не буква. Знать такое решение очень полезно, но есть и более быстрый способ.
|
|
|

31.08.2019, 23:04
|
|
Познающий
Регистрация: 17.08.2019
Сообщений: 83
С нами:
3548433
Репутация:
0
|
|
explorer сказал(а):
но есть и более быстрый способ.
Заинтриговал прям
|
|
|

31.08.2019, 23:50
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Более быстрый способ относительно способа с like, а так он дольше, чем с mid, но понятнее для новичка, и является одним из самых ходовых вариантов для решения слепых инъекций.
Решается также с помощью подзапросов. Предположим первый символ пароля буква d и в ASCII она равна 100
-1 or login='fast' and ascii(substr(pass,1,1))>97#
Здесь мы узнаём является ли первый символ больше 97 в ASCII(это буква а и с неё стандартно начинается поиск). Если да, то ставим цифру больше, но не на 1, а на 50% от диапазона чисел. Диапазон в ASCII смотрим по таблице, он до 127. То есть (127-97)/2=15 и 97+15=112 Конечно так точно высчитывать ничего не нужно, всё примерно на глаз можно делать.
-1 or login='fast' and ascii(substr(pass,1,1))>112#Запрос показал что число не больше 112
Следующий запрос уже будет половина от половины (112-97)/2=7 97+7=104
-1 or login='fast' and ascii(substr(pass,1,1))>104#Опять не больше 104
-1 or login='fast' and ascii(substr(pass,1,1))>100#Опять не больше 100
Осталось всего 3 варианта с 98 до 100, уже по 1 значению перебираем
-1 or login='fast' and ascii(substr(pass,1,1))>99#
Теперь угадали, вывод показал что число более 99, а в предыдущем запросе было не более 100. значит число 100. Таким образом мы выяснили первый символ за 5 запросов. А проверить можно применив знак равенства
-1 or login='fast' and ascii(substr(pass,1,1))=100#
Ну вот, теперь в твоём арсенале целых 3 варианта решения. Конечно есть ещё ) Но более экзотические и сложные нет смысла расписывать, только каша будет в голове.
|
|
|

02.09.2019, 19:05
|
|
Познающий
Регистрация: 17.08.2019
Сообщений: 83
С нами:
3548433
Репутация:
0
|
|
explorer сказал(а):
Более быстрый способ относительно способа с like, а так он дольше, чем с mid, но понятнее для новичка, и является одним из самых ходовых вариантов для решения слепых инъекций.
Решается также с помощью подзапросов. Предположим первый символ пароля буква d и в ASCII она равна 100
-1 or login='fast' and ascii(substr(pass,1,1))>97#
Здесь мы узнаём является ли первый символ больше 97 в ASCII(это буква а и с неё стандартно начинается поиск). Если да, то ставим цифру больше, но не на 1, а на 50% от диапазона чисел. Диапазон в ASCII смотрим по таблице, он до 127. То есть (127-97)/2=15 и 97+15=112 Конечно так точно высчитывать ничего не нужно, всё примерно на глаз можно делать.
-1 or login='fast' and ascii(substr(pass,1,1))>112#Запрос показал что число не больше 112
Следующий запрос уже будет половина от половины (112-97)/2=7 97+7=104
-1 or login='fast' and ascii(substr(pass,1,1))>104#Опять не больше 104
-1 or login='fast' and ascii(substr(pass,1,1))>100#Опять не больше 100
Осталось всего 3 варианта с 98 до 100, уже по 1 значению перебираем
-1 or login='fast' and ascii(substr(pass,1,1))>99#
Теперь угадали, вывод показал что число более 99, а в предыдущем запросе было не более 100. значит число 100. Таким образом мы выяснили первый символ за 5 запросов. А проверить можно применив знак равенства
-1 or login='fast' and ascii(substr(pass,1,1))=100#
Ну вот, теперь в твоём арсенале целых 3 варианта решения. Конечно есть ещё ) Но более экзотические и сложные нет смысла расписывать, только каша будет в голове.
Спасибо, пойду дальше пополнять арсенал
|
|
|

02.09.2019, 20:39
|
|
Новичок
Регистрация: 31.08.2019
Сообщений: 0
С нами:
3527714
Репутация:
0
|
|
Надеюсь, Вы уже поняли принцип решения этой задачи. Если нет, то не стоит читать это сообщение, ввиду явных подсказок. Так Вы ничему не научитесь.
Если использовать команду hex(mid(pass(2,1))=6, то интерпретатор покажет верный результат. Но так не сработает.
-1 OR login='fast' AND hex(mid(pass,5,1))=6-- - (Команда через hex)
Использование ascii(mid(pass,2,1))=108 покажет верный результат, который будет действительно верным (Символ 'l'). Вроде кодировки должны работать в этом плане одинаково, но именно на этих символах не работало.
-1 OR login='fast' AND ascii(mid(pass,5,1))=108-- - (Команда через ascii)
Но через hex получилось найти остальные символы
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|