Directory Traversal FIXME является другим типом атак на внедрение своей информации. В этом случае злонамеренный пользователь принуждает систему прочитать и/или записать файлы, доступа к которым веб сервер иметь не должен.
Примером может быть представление, которое читает файлы с диска без аккуратной проверки их имени:
def dump_file(request):
filename = request.GET["filename"]
filename = os.path.join(BASE_PATH, filename)
content = open(filename).read()
# ...
Несмотря на то, что данное представление выглядит надёжным, так
как доступ к файлу ограничен BASE_PATH
и
использованием
os.path.join()
, если
атакующий использует в имени файла символы ..
(переход в родительский каталог), он может получить доступ к
файлам вне BASE_PATH
. Имеет значение только
время, которое придётся затратить на поиск правильного числа
таких команд, скажем так:
../../../../../etc/passwd
.
Любое представление, которое читает файлы без соответствующего экранирования их имён уязвимы для этого типа атак. Представления, которые пишут в файлы также уязвимы, но вот только последствия страшнее.
Другой вариант FIXME??? этой проблемы находится в коде, который динамически подгружает модули, основываясь на URL или другой информации из запроса. Широко освещённый пример пришёл из мира Ruby on Rails. До середины 2006 года Rails напрямую использовал URL, подобные http://example.com/person/poke/1, для загрузки модулей и вызова методов. В результате получалось так, что специально созданный URL мог автоматически загружать определённый код, включая скрипт для очистки базы данных!
Если ваш код действительно должен читать или записывать файлы, основываясь на вводе пользователя, вам потребуется проверять запрашиваемый путь очень аккуратно, чтобы удостовериться, что атакующий не имеет возможности выйти из базового каталога, к которому вы разрешили доступ.
Замечание
Даже не стоит говорить о том, что нельзя создавать код, который может читать файлы из любого места на диске.
Хорошим примером экранирования можно считать представления из django.views.static. Вот его примерный код:
import os
import posixpath
# ...
path = posixpath.normpath(urllib.unquote(path))
newpath = ''
for part in path.split('/'):
if not part:
# strip empty path components
continue
drive, part = os.path.splitdrive(part)
head, part = os.path.split(part)
if part in (os.curdir, os.pardir):
# strip '.' and '..' in path
continue
newpath = os.path.join(newpath, part).replace('\\', '/')
Django не читает файлы (пока вы не начнёте использовать
функцию static.serve()
),
таким образом данная уязвимость не влияет на код Django.
В дополнение скажем, что использование схемы URL означает, что Django никогда не загружает код, пока вы это явно не укажете. Не существует метода создать URL, который заставит Django загрузить что-то не указанное в схеме URL.
Пред. | Уровень выше | След. |
Внедрение E-mail заголовка | Начало | Открытые сообщения об ошибках |
0 comments | Make a comment