Я установил Apache с mod_wsgi
при установке по умолчанию с очень простым тестовым приложением test.wsgi
это выглядит так:
def application(environ, start_response):
status = '200 OK'
output = 'Path: %s' % environ['PATH_INFO']
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Сам Apache в основном настроен так:
WSGIScriptAlias / /home/user/wsgi_test/test.wsgi
Теперь, если я обращаюсь к URL-адресам на этом сервере, я получаю следующий результат:
GET /test/../test/./test
=> Path: /test/test
GET /test/%2E%2E/abc
=> Path: /abc
GET /test%2fabc
=> 404 Not found
(из-за AllowEncodedSlashes off
, Я полагаю)Таким образом, мне кажется, что Apache разрешает / предварительно обрабатывает эти URL-адреса перед передачей их приложению, что приятно, поскольку может предотвратить множество атак включения локальных файлов и обхода каталогов, когда путь к файлу не является частью строки запроса.
Можно ли полагаться на это поведение или есть какой-то неприятный способ обмануть Apache, чтобы он действительно передавал URL-адрес, например /test/foo/../bar
к приложению? Было бы это ошибкой Apache, если бы это было возможно?
Руководство по безопасности «Глубокая защита» предполагает, что вам следует настроить Apache для предварительной обработки путей, но вы также должны сами защитить себя от опасных путей.
Поскольку вы, вероятно, намного больше знаете о том, как должны выглядеть действительные пути, вы должны иметь возможность предложить гораздо более строгий тест, который также легче выполнить, чем что-либо, что Apache может сделать в целом.