Выбор ответа Senior SSRF, файлы и редиректы обновлено
Проверка пути через startswith
Вопрос
Код: p = os.path.realpath(os.path.join(BASE, name)); if p.startswith(BASE): open(p), где BASE = "/srv/files". Какой ввод обходит проверку?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: ../filesbackup/secret.txt. Результат /srv/filesbackup/secret.txt начинается со строки /srv/files, хотя лежит в соседней папке. ../../etc/passwd%00.txt и a/b/../../../c.txt нормализуются в пути вне /srv и проверку не пройдут (а %00 в Python просто часть имени),…
Варианты ответа
../files_backup/secret.txtправильный ответ../../etc/passwd%00.txt.pdf./report.pdf/../a.pdfa/b/../../../c.txt
Разбор
Результат /srv/files_backup/secret.txt начинается со строки /srv/files, хотя лежит в соседней папке. ../../etc/passwd%00.txt и a/b/../../../c.txt нормализуются в пути вне /srv и проверку не пройдут (а %00 в Python просто часть имени), ./report.pdf/../a.pdf остаётся внутри BASE. Правильно сравнивать с BASE + os.sep или использовать os.path.commonpath([p, BASE]) == BASE.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.