Один из популярных хакерских методов - double escape sequence. По умолчанию ASP.NET его отлавливает и выдает сообщение: "A potentially dangerous Request.Path value was detected from the client". Если не делать <requestFiltering allowDoubleEscaping="true"/>, то вроде как опасности нет.
Опасности нет, а неудобства есть. Мы пишем всё ошибки в лог и постоянно его мониторим. Если вдруг идет много ошибок, админы получает емейлы и SMS, всё бегают и кричат: "Что происходит?!" А я что - я говорю: "Ну, нас атакуют. Сделать ничего нельзя. Сидим и ждем, пока перестанут". Кроме неудобств, такие атаки могут ухудшать производительность сайта.
Поэтому хотелось бы, чтобы double escape sequence отлавливалась не на уровне приложения ASP.NET, а раньше. К счастью, есть простой выход. IIS поддерживает не только стандартные статусы HTTP, но и "подстатусы". Например, в случае double escape sequence он генерирует ошибку 404.11 (хотя с точки зрения внешнего мира это просто стандартная 404).
А мы её теперь можем перехватить:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Errors/ServerError">
<clear/>
<!-- The request filtering module is configured to deny a request that contains a double escape sequence.-->
<error responseMode="File" statusCode="404" subStatusCode="11" path="Static\HackingAttempt.txt"/>
<error responseMode="ExecuteURL" statusCode="403" path="/Errors/NotSupported"/>
<error responseMode="ExecuteURL" statusCode="404" path="/Errors/PageNotFound"/>
<error responseMode="ExecuteURL" statusCode="410" path="/Errors/Gone"/>
<error responseMode="ExecuteURL" statusCode="500" path="/Errors/ServerError"/>
<error responseMode="ExecuteURL" statusCode="503" path="/Errors/ServiceUnavailable"/>
</httpErrors>
</system.webServer>
</configuration>
Что тут происходит? ASP.NET-приложение выдает всякие красивые странички для разных видов ошибок (403 / 404 / 410 / 500 / 503). Там есть лототип, "ой, извините, страница не найдена, может предложить вот это и это", "можно сообщить администратору" и т.д. Но для хакеров сильно много чести. Для них я просто возвращаю содержание текстового файла HackingAttempt.txt из каталога Static (можно хранить в другом месте). Обратите внимание, что слэши в другую сторону, потому что это путь к файлу, а не URL. Внутри файла можно написать: "Пожалуйста, не взламывайте нас!" Или что-то нейтральное: "Page not found". Поскольку строка с statusCode="404" subStatusCode="11" идет перед statusCode="404", то "нормальная" страница 404 возвращается только если ошибка не связана с double escape sequence
Цель достигнута: лишние ресурсы не расходуются на генерацию страницы с ошибкой, и логи не засоряются ошибкой, с который ты всё равно сделать ничего не можешь.
Опасности нет, а неудобства есть. Мы пишем всё ошибки в лог и постоянно его мониторим. Если вдруг идет много ошибок, админы получает емейлы и SMS, всё бегают и кричат: "Что происходит?!" А я что - я говорю: "Ну, нас атакуют. Сделать ничего нельзя. Сидим и ждем, пока перестанут". Кроме неудобств, такие атаки могут ухудшать производительность сайта.
Поэтому хотелось бы, чтобы double escape sequence отлавливалась не на уровне приложения ASP.NET, а раньше. К счастью, есть простой выход. IIS поддерживает не только стандартные статусы HTTP, но и "подстатусы". Например, в случае double escape sequence он генерирует ошибку 404.11 (хотя с точки зрения внешнего мира это просто стандартная 404).
А мы её теперь можем перехватить:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Errors/ServerError">
<clear/>
<!-- The request filtering module is configured to deny a request that contains a double escape sequence.-->
<error responseMode="File" statusCode="404" subStatusCode="11" path="Static\HackingAttempt.txt"/>
<error responseMode="ExecuteURL" statusCode="403" path="/Errors/NotSupported"/>
<error responseMode="ExecuteURL" statusCode="404" path="/Errors/PageNotFound"/>
<error responseMode="ExecuteURL" statusCode="410" path="/Errors/Gone"/>
<error responseMode="ExecuteURL" statusCode="500" path="/Errors/ServerError"/>
<error responseMode="ExecuteURL" statusCode="503" path="/Errors/ServiceUnavailable"/>
</httpErrors>
</system.webServer>
</configuration>
Что тут происходит? ASP.NET-приложение выдает всякие красивые странички для разных видов ошибок (403 / 404 / 410 / 500 / 503). Там есть лототип, "ой, извините, страница не найдена, может предложить вот это и это", "можно сообщить администратору" и т.д. Но для хакеров сильно много чести. Для них я просто возвращаю содержание текстового файла HackingAttempt.txt из каталога Static (можно хранить в другом месте). Обратите внимание, что слэши в другую сторону, потому что это путь к файлу, а не URL. Внутри файла можно написать: "Пожалуйста, не взламывайте нас!" Или что-то нейтральное: "Page not found". Поскольку строка с statusCode="404" subStatusCode="11" идет перед statusCode="404", то "нормальная" страница 404 возвращается только если ошибка не связана с double escape sequence
Цель достигнута: лишние ресурсы не расходуются на генерацию страницы с ошибкой, и логи не засоряются ошибкой, с который ты всё равно сделать ничего не можешь.
Комментариев нет:
Отправить комментарий