Задание 2. Вредоносный скрипт в веб-приложении
Задание
Мы наткнулись на простое веб-приложение Dark Backdoor, которое позволяет хранить заметки, не требуя паролей! Звучит слишком хорошо, чтобы быть правдой, не так ли? Как думаете, вы можете получить доступ к заметкам администратора? Если вы сможете предоставить нам этот доступ, мы, возможно, сможем понять, как они взломали наши спутники, и, возможно, восстановим контроль над ними!
Дано
Скрипт на PHP. Решение Запускаю, перехожу и вижу, что вы находитесь за границей:
На странице есть активная ссылка на toto. Если по ней перейти, будет сформирован такой запрос-ответ:

Видно, что логин преобразовывается в кодировку base64 и передается в
параметре username. Далее решаю проверить приложенный файл и открываю
его. Из кода PHP понятно несколько вещей.
1. Логин забирается из параметра username, значение присваивается переменной encodedUsername:
2. Значение admin в base64 будет YWRtaW4=. Если передать это значение,
то знак равно удалится. В этом случае выполнится условие, которое
обнулит значение переменной decodedUsername:
if ($encodedUsername === "YWRtaW4") {
3. Если передать любое другое значение, то оно декодируется:
4. Далее в скрипте идет проверка с помощью регулярного выражения. Если декодированное значение содержит любые символы (кроме a-z, A-Z, 0-9), то decodedUsername обнулится:
if (!preg_match('/^[a-zA-Z0-9_]+$/', $decodedUsername)) {
5. Из кода также видно, что нельзя передать пустой параметр username:
<?php if ($decodedUsername === ""): ?>
<h1>Error</h1>
<p class="error">Invalid username</p>
6. Флаг можно получить только при условии, декодированное значение — admin:
<?php elseif ($decodedUsername === "admin"): ?>
<h1>? Welcome admin! ?</h1>
<p><?php echo $flagMessage; ?></p>
Итак, в параметр username нужно как-то передать скорректированное значение YWRtaW4= или YWRtaW4, чтобы оно не попало под фильтр. Из документации PHP известно, что в качестве параметра можно использовать список, а функция preg_match() обработает только первое переданное значение.
Передаю значение с апострофом — и получаю в ответ флаг:
