Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "HTTP - POST". За решение задачки дают 15 баллов, чуть посложнее начального уровня.
Задание: Find a way to beat the top score! Найдите способ побить рекорд! Также предлагают ознакомиться с тем, что же такое POST-запрос.
POST — один из многих методов запроса, поддерживаемых HTTP протоколом. POST предназначен для передачи данных в теле запроса на сервер. Часто используется для загрузки файла на сервер или передачи данных заполненной пользователем формы.
Ссылки
https://en.wikipedia.org/wiki/POST_(HTTP)
https://ru.wikipedia.org/wiki/POST_(HTTP)
Решение
Переходим на страницу задания:
http://challenge01.root-me.org/web-serveur/ch56/
Видим страницу с текстом:
RandGame
Human vs. Machine
Here is my new game. It's not totally finished but I'm sure nobody can beat me! ;)
Rules: click on the button to hope to generate a great score
Score to beat: 999999
Нажимаем на кнопку "Give a try!"
Так, я получил 747394 очка, а нужно, судя по заданию, чтобы было больше 999999. Посмотрим содержимое страницы.
У нас есть форма, которая методом POST отправляет данные на сервер. При этом она передаёт скрытую переменную score. При отправке формы срабатывает скрипт:
document.getElementsByName('score')[0].value = Math.floor(Math.random() * 1000001)
Этот код каждый раз присваивает случайное значение переменной score от 0 до 1000001 (не включая). Соответственно, шансов получить больше 999999 очков не много.
Естественно, кликать до посинения не будем. Мы можем убрать этот скрипт и присвоить значение переменной score самостоятельно. Или можно повысить свои шансы на успех, сделаем это. Редактируем скрипт.
Дописываем пару нулей. Нажимаем на кнопку "Give a try!"
На этот раз нам выпадает больше чем 999999. Видим флаг:
H7tp_h4s_N0_s3Cr37S_F0r_y0U
Валидируем.
Флаг подходит, зарабатываем 15 очков.
Безопасность
- Следует помнить, что методом POST данные передаются от клиента серверу, поэтому клиент может эти данные менять как ему вздумается. Web-сервер не должен доверять данным, переданным через POST.
- Не передавайте секретные данные через POST в скрытых полях. Если данные не отображаются в URL, то это не значит, что клиент не может их посмотреть.