Игра «Насколько хорошо ты знаешь __?» были в тренде на вашей домашней ленте Facebook? Если это так, то я уверен, что вы можете себе представить, насколько потрясающе впечатляюще получить 15/15. Разве не было бы здорово получить высший балл в чьей-нибудь викторине? Ну, после прочтения этого поста вы можете!

Ниже вставлен код успеха 🔑

Как использовать код

  1. Перейдите к викторине друга Боба и нажмите «Приготовиться!» кнопка
  2. Откройте инспектор браузера и перейдите в консоль (на Mac/Chrome вы можете ввести: ⌘ + Alt + j)
  3. Введите код, вставленный выше, в консоль, нажмите Enter и наблюдайте, как происходит волшебство.
  4. Теперь ты официально лучший друг Боба!

Надеюсь, если вы дочитали до этого момента, вы получили от этого поста то, чего действительно хотели, а именно повеселиться со своими друзьями!

Однако, если вы хотите узнать больше об этом процессе, не стесняйтесь продолжать чтение.

Для технически подкованных/заинтересованных читателей

Процесс взлома этой игры был довольно забавным, и каждый может сделать это с небольшим руководством.

Играя в игру, вы, возможно, заметили, что вы можете обновить игру в середине, и это уничтожит все набранные очки. Это говорит о том, что очки хранятся на стороне клиента до окончания игры, и в этом случае он отправляет результаты на сервер.

Проверка страницы приводит к следующему:

Каждый вопрос заключен в div с id=“qi”, где i∈{1..15}

AnswerQuestion(1,1,38,1) Выглядит многообещающе…

Из следующего мы можем сделать вывод, что AnswerQuestion(), вероятно, является функцией, которая вызывается, когда мы выбираем ответ, поскольку она связана с событием onclick каждого ответа.

Имея это в виду, мы проверяем скрипт, в котором определен AnswerQuestion().

q → Номер вопроса

r → Ваш ответ выбран

q_real → Код номера вопроса

r_good → правильный ответ

Каждый вопрос содержит правильный ответ, встроенный в него в качестве последнего параметра (AnswerQuestion(1,2,3,4), 4 – реальный ответ).

Имея это в виду, мы видим, что код проверяет, равен ли ваш ответ r правильному ответу r_good. Если это неверно, код отображает красный шрифт через class=’ma_bad’. В противном случае функция тайм-аута устанавливается на 1,5 секунды, при этом ответы и вопросы пользователей добавляются в список. Следующий вопрос отображается, если мы не закончили викторину или список набранных ответов отправляется на сервер для записи вашей оценки.

Возникает вопрос, как мы можем обмануть это?

Каждый вопрос имеет свой номер вопроса и связанный с ним правильный ответ. Если мы пройдемся по этим 15 вопросам, извлечем номер вопроса и ответа из атрибута onclick (представленного в виде строки в JS; как удобно, да?), мы можем затем добавить эти данные к пустой строке, что приведет к нашей обманутой версии список_данных

Что мы можем сделать с этим списком? Не похоже, что мы можем поместить эту версию list_data в функцию, верно? Есть такая вещь, как масштаб, и программирование просто так не работает… или работает?

Внутренняя работа сети рассказывает другую историю, которая приводит к мистификации Javascript (дополнительные подробности можно найти здесь). list_data был определен вне функции, следовательно, это глобальная переменная, поэтому мы можем изменить ее по своему усмотрению, и изменения сохранятся.

Изменение текущего номера вопроса на число больше 15 (например, 1000) приводит к тому, что функция AnswerQuestion при вызове переходит к коду перенаправления страницы. Затем это отправляет наш обманный list_data на сервер и записывает наш высший балл!

Вывод

Надеюсь, вы улучшили свои навыки программирования, прочитав этот пост; возможно, теперь вы можете выявлять ошибки в других онлайн-приложениях, с которыми вы взаимодействуете!