Веб-серверы: информация для начинающих

Usage from command line

Issue the command in your project’s directory. Alternatively you can add the path to serve as a command line parameter.

This will automatically launch the default browser. When you make a change to any file, the browser will reload the page — unless it was a CSS file in which case the changes are applied without a reload.

Command line parameters:

  • — select port to use, default: PORT env var or 8080
  • — select host address to bind to, default: IP env var or 0.0.0.0 («any address»)
  • — suppress automatic web browser launching
  • — specify browser to use instead of system default
  • — suppress logging
  • — more logging (logs all requests, shows all listening IPv4 interfaces, etc.)
  • — launch browser to PATH instead of server root
  • — comma-separated string of paths to exclusively watch for changes (default: watch everything)
  • — Regular expression of files to ignore (ie ) (DEPRECATED in favor of )
  • — reload page on CSS change, rather than injecting changed CSS
  • — path to .js file exporting a middleware function to add; can be a name without path nor extension to reference bundled middlewares in folder
  • — serve this file (server root relative) in place of missing files (useful for single page apps)
  • — serve the paths contents under the defined route (multiple definitions possible)
  • — translate requests from /abc to /#/abc (handy for Single Page Apps)
  • — (default 100ms) wait for all changes, before reloading
  • — Enables http-auth expecting htpasswd file located at PATH
  • — Enables CORS for any origin (reflects request origin, requests with credentials are supported)
  • — PATH to a HTTPS configuration module
  • — Custom HTTPS module (e.g. )
  • — proxy all requests for ROUTE to URL
  • — display terse usage hint and exit
  • — display version and exit

Default options:

If a file exists it will be loaded and used as default options for live-server on the command line. See «Usage from node» for option names.

Java applet

В тех случаях, когда прокси обрезает эти заголовки или хакер не имеет доступа к серверной стороне (например, если его скрипт внедрен в чужой сайт), вышеописанная техника не будет эффективной. Но если у клиента установлена виртуальная машина Java, хакер может создать специальный апплет и уже с его помощью определить локальный адрес клиента.

Впервые этот способ был продемонстрирован еще в 2002 году. Lars Kindermann, автор идеи, тогда даже не подозревал, насколько востребованным может стать его решение в будущем. Идея программы заключается в том, что Java-код, находящийся на сервере www.hacker.com, создает подключение к самому себе. В результате создается экземпляр класса java.net.socket, в котором хранится сетевая информация о клиенте:

Для исполнения аплета добавляем следующий код в наш скрипт go2intranet.php:

Апплет выводит данные в консоль виртуальной машины Ява:

На практике он может делать специальный запрос на веб-сервер, чтобы передать полученные данные хакерскому скрипту. Далее мы рассмотрим комплексное решение по определению клиентского IP-адреса, поэтому обработку данных оставим на потом. 

Следует заметить, что прокси или антивирус может блокировать активное содержимое, в таком случае следует применять обфускацию кода. Тэг апплета можно добавлять в документ на лету, используя
JavaScript:

Этот код идентичен с:

Но будет считаться безопасным для систем контроля содержимого. Но что если у клиента отключена виртуальная машина
Java?

Frontend сервер nginx

В данном случае не обязательно использовать именно Nginx. В некоторых ситуациях более актуальным будет взять HAProxy. Но в общем случае подойдет Nginx. На frontend сервер будут поступать все внешние http запросы. На него будут проброшены порты 80 и 443. Расскажу, для чего использовать отдельный frontend сервер. Ведь можно обойтись и без него.

  1. Удобство эксплуатации и обновления. К примеру, я хочу попробовать какую-то новую настройку — изменение ядра, модуля nginx и т.д. Я делаю копию frontend, настраиваю на нем все, что нужно и переключаю на него трафик. Если все в порядке, то оставляю в работе, либо переношу настройки на основной сервер. Если возникают какие-то проблемы, я просто переключаю проброс порта на старый сервер и все сразу начинает работать как прежде. В общем случае, frontend сервер очень маленький (20-30 гб под систему и логи).
  2. На frontend удобно работать с внешними запросами — контролировать, обрабатывать, блокировать, предотвращая доступ к бэкенду с данными. Например, можно настроить ipset и блокировать отдельные страны. Можно выстроить простейшую защиту от ddos. Можно настроить отдельный модуль ModSecurity для Nginx. Когда у вас frontend отдельно, вам проще настраивать и обновлять компоненты, не боясь нарушить работу сайтов.
  3. Frontend сервер аккумулирует все логи с внешних запросов и передает в ELK. Далее я покажу, как их удобно в автоматическом режиме сразу все передавать на хранение, а потом удобно анализировать.
  4. В общем случае с отдельным frontend сервером безопаснее. Все внешние запросы приходят к нему. Многие зловреды (как и легальные компоненты и плагины) не понимают, как работать на бэкенде, который стоит за frontend. Это как плюс так и минус в некоторых случаях, так как усложняется эксплуатация. Особенно хлопотно с битриксом, так как у него много сервисов и проверок, которые напрямую стучатся по внешнему ip домена и не понимают, что делать, когда попадают на фронтенд. Но это все решаемо.

На frontend настраиваются бесплатные сертификаты от Let’s Encrypt. Так как весь трафик от фронта до бэка крутится в рамках одного гипервизора, смысла передавать его в шифрованном виде нет. Так что на backend он идет по http.

С frontend я отправляю в ELK логи запросов только к php скриптам. Именно они представляют для меня полезную информацию, так как позволяют оценить скорость работы сайта. Информация от отдачи статики лично мне не нужна. В общем случае, я ее не собираю, а включаю отдельно по мере необходимости. Это позволяет не раздувать лог файлы. Чем меньше их объем, тем удобнее и быстрее с ними работать.

Локальный сервер Denver

Но наиболее популярным среди web-мастеров считается локальный сервер Denver. Он разработан русским программистом Дмитрием Котеровым. Поэтому вся документация здесь на русском языке. Проект бесплатный. Название Денвер получено от сокращения Джентльменский набор web-разработчика. Скачать его можно по ссылке.

Денвер устанавливается очень легко и быстро. К тому же есть подробные инструкции и видеоуроки по работе с сервером. При запуске Денвера сразу создается виртуальный диск. На рабочем столе вашего компьютера будут созданы три ярлыка: Start Denwer, Stop Denwer, Restart Denwer. Они служат для запуска и остановки сервера.

При вводе в адресную строку localhost, у вас должна появиться такая тестовая страница.

На данном сервере можно разместить несколько сайтов. Их адрес совпадает с названием папки, в которой на сервере находится сайт. Для каждого сайта можно использовать свою базу данных, управление которыми происходит с помощью phpMyAdmin.

Итак, для полноценной работы web-мастера необходим локальный сервер для сайта на ПК, который позволяет создавать, тестировать и отлаживать динамические сайты. Таких серверов разработано достаточно много, каждый имеет свои достоинства и недостатки. Если вы хотите заниматься разработкой сайтов, можете попробовать различные варианты, но я рекомендую выбрать Денвер. Это простой и удобный сервер с достаточно большими возможностями.

Если вас заинтересовала статья, или вам есть, что добавить, оставьте комментарий.

Проголосуйте за статью, нажмите кнопку социальной сети.

How it works

The server is a simple node app that serves the working directory and its subdirectories. It also watches the files for changes and when that happens, it sends a message through a web socket connection to the browser instructing it to reload. In order for the client side to support this, the server injects a small piece of JavaScript code to each requested html file. This script establishes the web socket connection and listens to the reload requests. CSS files can be refreshed without a full page reload by finding the referenced stylesheets from the DOM and tricking the browser to fetch and parse them again.

Комплексное решение

В зависимости от ситуации, хакер может применить те или иные методы. Каждый из способов специфичен, поэтому в некоторых случаях придется отказаться от некоторых из них. Например, вариант с использованием PHP будет работать даже через рисунок:

Остальные проканают через подключение удаленного скрипта:

Так может выглядеть PHP-код, объединяющий технику Ява-сканирования и получения информации из заголовков сервера:

Таким будет код Java-апплета:

Все остальные комбинации оставляю для самостоятельной работы читателей. Стоит также добавить, что выбор техники может определяться динамически. Определить поддержку Java можно из JavaScript-а: 

Для примеров под FireFox необходимо определять имя браузера:

И в таком духе реализовать комплексную проверку.

Для конечных пользователей можно лишь посоветовать использовать анонимные прокси, отключить поддержку Java и Flash. Не самая радужная перспектива, зато полезная штука для соблюдения корпоративной безопасности. 

Будьте бдительны…

Дополнительные материалы:

Web Application Security Statistics
http://www.webappsec.org/projects/statistics/

My address java applet
http://reglos.de/myaddress/MyAddress.html

Using Java from Javascript
http://www.derkeiler.com/Mailing-Lists/NT-Bugtraq/2003-04/0003.html

Goodbye Applet, Hello NAT’ed IP Address
http://jeremiahgrossman.blogspot.com/2007/01/goodbye-applet-hello-nated-ip-address.html

RFC 2616. Hypertext Transfer Protocol, Method Definitions

Хищение куки при помощи Tracehttp://www.xakep.ru/post/17540/default.asp

Amit Klein. XST Strikes Back
http://www.securityfocus.com/archive/1/423028

Running TRACE on the server using Java
http://myappsecurity.blogspot.com/2007/05/running-trace-on-server-using-java-from.html

Available Options:

or Port to use (defaults to 8080)

Address to use (defaults to 0.0.0.0)

Show directory listings (defaults to )

Display autoIndex (defaults to )

or When enabled (defaults to ) it will serve in place of when a gzipped version of the file exists and the request accepts gzip encoding. If brotli is also enabled, it will try to serve brotli first.

or When enabled (defaults to ) it will serve in place of when a brotli compressed version of the file exists and the request accepts encoding. If gzip is also enabled, it will try to serve brotli first.

or Default file extension if none supplied (defaults to )

or Suppress log messages from output

Enable CORS via the header

Open browser window after starting the server. Optionally provide a URL path to open. e.g.: -o /other/dir/

Set cache time (in seconds) for cache-control max-age header, e.g. for 10 seconds (defaults to ). To disable caching, use .

or Use UTC time format in log messages.

Enable logging of the client’s IP address (default: ).

Username for basic authentication

Password for basic authentication

or Enable https.

or Path to ssl cert file (default: ).

or Path to ssl key file (default: ).

or Provide a /robots.txt (whose content defaults to )

Do not show dotfiles

or Print this list and exit.

or Print the version and exit.

Внешний адрес

Авторизация пользователя на сервере может осуществляется по многим критериям, это может быть идентификатор сессии в HTML-коде, содержимое данных cookie или же внешний IP-адрес клиента. В зависимости от задачи, разработчики выбирают наиболее подходящий им метод, но, независимо от этого, веб-сервер предоставляет им все имеющиеся данные. Для злоумышленника, в данном случае, представляет интерес внешний адрес клиента, который можно легко узнать средствами языка
PHP.

В PHP собранная сервером информация хранится в массиве $_SERVER, сюда входят данные о самом сервере, активной странице и, собственно, о клиенте. Конкретно адрес клиента хранится в переменной REMOTE_ADDR, и если вы посетили страницу хакера, последний без труда вычислит ваш внешний
IP:

Как видно из примера, доступной также является информация о номере порта, через который браузер соединяется с веб-сервером и DNS-имя клиента. Последнее узнается через «Rreverse DNS lookup» относительно IP-адреса клиента. Допустим, мы получили следующий результат:

REMOTE_ADDR: 20.20.20.20
REMOTE_PORT: 37938
REMOTE_HOST: proxy.isp.com

Но что нам дает эта информация? Если разобраться, то не так уж и много. Для атаки на внутреннюю сеть этих данных менее чем достаточно, ведь внешний IP скорее всего не имеет никакого отношения к компании. Вероятнее всего, адрес принадлежит компании, предоставляющей доступ в Интернет…

В самом простом виде схему подключения корпоративного пользователя можно представить как цепь из 4-х систем:

Не считая систему клиента и сам веб-сервер (30.30.30.30), у нас остаются два участника: внутренний сервер компании и внешний сервер провайдера, предоставляющий доступ в Интернет. В прошлом примере мы узнали внешний адрес клиента, но это не его внутренний IP, это, вероятнее всего, адрес прокси-сервера провайдера. Можно делать догадки и точно определить его принадлежность, но такое расследование выходит за рамки этой статьи, мы же будем считать, что 20.20.20.20 — это сервер
ISP. 

На этом наши поиски не закончились, продолжим изучать переменную
$_SERVER.

Custom configuration

for http :

constserver=require('node-http-server');constconfig=newserver.Config;config.errors'404'='These are not the files you are looking for...';config.contentType.mp4='video/mp4';config.port=8005;config.verbose=true;config.root='~/myApp/'server.deploy(config);

for https :

constserver=require('node-http-server');constconfig=newserver.Config;config.errors'404'='These are not the files you are looking for...';config.contentType.mp4='video/mp4';config.port=8005;config.verbose=true;config.root='~/myApp/'config.https.privateKey=`/path/to/your/certs/private/server.key`;config.https.certificate=`/path/to/your/certs/server.pub`;config.https.port=4433;config.https.only=true;server.deploy(config);
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector