Эта задачка показалась мне интересней предыдущих, несмотря на то что дают за нее всего два очка. Интересна она тем что запутана, но тем не менее запутана не без надежно, хотя времени я на нее потратил прилично. Итак, приступим!
На первой странице как видно как таковых зацепок нет, но, как я уже не раз говорил, "первым делом смотри заголовки!". А в заголовках нас поджидало самое интересное:
В заголовках содержится таинственный Cookie "AUTH",чертовски похожий на строку закодированную в base64. Нужно это проверить, попробуем расшифровать:
О чудо! На выходе нас ожидает строка типа guest,e72b95c694aaa5c5,1531945967,false:5b41abad337ec1e094b037f7a310f6ba
интуитивно понятно что мы не хотим быть гостем, меняем на admin, дальше какой то не понятный хэш(hex??), далее бросается в глаза типичный timestamp, но если у вас под рукой будет ресурс где timestamp unix epoche обновляется в реальном времени (поверьте мне таких ресурсов полно, например), то можно заметить что дата немного из будущего, я это заметил не сразу, одна из причин по которой пришлось повозиться с заданием. Потом идет ключ false, видимо указывает авторизован пользователь или нет, я интуитивно поменял на true, затем ":" и какой то хэш типа md4-md5 (сперва еще был вариант что SHA1, но не подходит поскольку там символов больше).
Сперва я просто подменил guest -> admin, false -> true и перезаписал cookie, но вывалилось сообщение "похоже что кто то пытается нас взломать, неправильный md5", что только помогло разобраться с тем что хэш это md5, оставалось понять хэш чего. Попробовал самый банальный вариант и захешировал весь текст (из раскодированной строки guest,e72b95c694aaa5c5,1531945967,false:5b41abad337ec1e094b037f7a310f6ba) до двоеточия и он точно совпал с хэшем (тем что после двоеточия). Путь стал ясен, но было непонятно что же за значение e72b95c694aaa5c5...
Сперва мне показалось что это неведомый md5 16bit (о нет, я не псих, я не сам это придумал, есть даже сайт который генерирует такие хэши)
Я несколько раз очищал cookie AUTH, для того чтобы получить новое значение и в тот период, по неведомой случайности мне выпадали несколько значений которые начинались с "ba", в остальном мне это напоминало типичный результат uniqid() (стандартная функция php), но количество символов не совпадало и я решил попробовать ее с префиксом (префикс нужно передавать как параметр), собрал для этого небольшой скрипт, для удобства можете воспользоваться онлайн генератором:
Непосредственно код ниже: (не повторяйте мою ошибку, мне казалось что все можно сделать в однострочном варианте и использовать echo short open tag "<?=" но в таком случае у вас сгенерируются разные значения в uniqid и хэш не будет соответствовать строке)
<?php $rand=uniqid('ba');
echo base64_encode("admin,".$rand.",".(time()+300).",true:".md5("admin,".$rand.",".(time()+300).",true"));?>
При написании статьи мне уже попадались другие значения строки и при том что все сработало, видимо строка просто рандомная. Как видно в коде, я к текущему timestamp прибавляю 300 секунд, как я уже писал выше timestamp был немного из будущего что наталкивает на мысль что это время жизни наших кук. Нам остается только подменить куки AUTH на наши, для этого сперва удалите существующий AUTH в настройках браузера (или специальными программами) а лишь затем вводите новый:
После обновляем страницу и получаем заветный флаг.
Тут еще раз стоит напомнить о том что в куках нельзя хранить чувствительную информацию или параметры, и куки должны отправляться с флагом httponly!