пятница, 12 июня 2015 г.

HTTP 404.11

Один из популярных хакерских методов - 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

Цель достигнута: лишние ресурсы не расходуются на генерацию страницы с ошибкой, и логи не засоряются ошибкой, с который ты всё равно сделать ничего не можешь.

Комментариев нет:

Ratings by outbrain