Как узнать, действительно ли это страница 404?

Что я узнал из Foregenix:

Ошибка HTTP 404 Not Found означает, что веб-страница, которую вы пытались найти, не найдена на сервере. Это ошибка на стороне клиента, которая означает, что либо страница была удалена или перемещена, и URL-адрес не был изменен соответствующим образом, либо что вы неправильно ввели URL-адрес

Но тогда я также использую pentests для веб-приложений с Python, и мне интересно, что если я проверю только на String 404 на странице, это может быть не ошибка 404. Может случиться так, что страница существует, но заголовок 404 просто для того, чтобы нас обмануть.

Итак, как именно я узнаю?

Ответ 1

Вы можете проверить код состояния HTTP и посмотреть, 404 он или нет. Код состояния находится в первой строке ответа:

HTTP/1.1 404 Not Found

Если вы используете HTTPlib, вы можете просто прочитать свойство status объекта HTTPResponse.

Тем не менее, именно сервер решает, какой код статуса HTTP отправлять. Просто потому, что 404 определяется как "страница не найдена", не означает, что сервер не может лгать вам. Обычно принято делать такие вещи:

  • Отправьте 404 вместо 403, чтобы скрыть ресурс, требующий проверки подлинности.
  • Отправьте 404 вместо 500, чтобы скрыть факт, что что-то не работает.
  • Отправить 404, когда ваш IP заблокирован по какой-либо причине.

Без доступа к серверу невозможно узнать, что действительно происходит за шторами.

Ответ 2

Вы правы: кто-то может написать "404 Страница не найден" на странице HTML и заставить вас думать, что страница не существует.

Чтобы правильно распознавать коды состояния HTTP, такие как 404, вы должны захватить HTTP-ответ с помощью Python и проанализировать его. Стандарты HTTP 1 и HTTP 2 определяют, что HTTP-ответ, который написан в формате общего сообщения HTTP, должен содержать код состояния.

Пример ответа HTTP (из Точки обучения):

HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
  <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>

Вы определенно не должны доверять части HTML, которая может показывать ошибку 404 (или даже 418, я чайник), когда на самом деле страница может быть найдено.

Ответ 3

В дополнение к ответу Андерса, я нашел способ обнаружить некоторые случаи, когда 404 не используется с помощью атаки Timing. Это вряд ли надежно.

  • Отправьте 404 вместо 403, чтобы скрыть ресурс, требующий проверки подлинности.

Часто серверам требуется больше времени, чтобы определить, что "у вас нет разрешения на получение этого ресурса", потому что им нужно больше обращений к внешним ресурсам, таким как базы данных, тогда им нужно определить "этого нет", нередко даже кэшируемых и быстро определить.

Типичным примером в приложении MVC с RDBS как backend является разница между простым SELECT COUNT(id) FROM articles WHERE id=123 LIMIT 1 и гораздо сложнее SELECT access FROM accesses JOIN articles ON articles.id = accesses.foreign_id WHERE articles.id = 123 AND accesses.type='articles' AND accesses.user_id = (SELECT id FROM users WHERE token='t0k3n' LIMIT 1). И это означает, что приложение может делать такие однострочные запросы в первую очередь: чаще всего "выбирают пользователя, извлекают некоторые данные, теперь берут Thing, теперь спрашивают Thing, может ли пользователь получить к нему доступ через авторизационную систему, апи".

Если разработчики или структура сайта не позаботились об этом случае, довольно часто вы увидите заметную разницу во времени, чтобы обслуживать оба случая 404.

  • Отправьте 404 вместо 500, чтобы скрыть факт, что что-то не работает.

Как правило, сбой или непредвиденные ошибки возникают только после запуска некоторого кода. 404-обнаружение часто приходит раньше: ведь дешево определить, что чего-то нет (см. Выше). Если ошибка возникнет позже. Это означает, что такая ошибка с 500-спрятанным-404, нередко занимает гораздо больше времени, чтобы достичь вас, а затем нормальный 404.

  • Отправить 404, когда ваш IP заблокирован по какой-либо причине.

Здесь время, в зависимости от реализации, часто бывает наоборот. Такая блокировка IP-адресов часто хранится вне веб-приложения (CMS и т.д.), Потому что гораздо проще и эффективнее обрабатывать выше в стеке: веб-сервер, прокси и т.д. Однако, когда сама программа позаботится об этом, генерация фактического 404 часто достаточно дешева, тогда как поиск IP в базе данных, применение масок и т.д. Занимает некоторое время. Подобно сокрытию 403 как 404.