Выбор ответа 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 просто часть имени),…

Варианты ответа

  1. ../files_backup/secret.txtправильный ответ
  2. ../../etc/passwd%00.txt.pdf
  3. ./report.pdf/../a.pdf
  4. a/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 ошибок.