Блокировать доступ к localhost в lynx - PullRequest
0 голосов
/ 24 июня 2019

Я использую BBS, который в основном состоит из сценариев bash.

Просто случайно я сегодня вошел в Lynx, нажал "/" и нажал ENTER. Представьте мой ужас, когда он выплевывает содержимое моего корневого каталога! Я делаю это в Windows все время (обращаясь к локальным файлам в браузере), но мне никогда не приходило в голову подумать об этом здесь.

По иронии судьбы, существует флаг lynx для отключения местоположений без локального хоста, но здесь мне нужно сделать наоборот. На локальном компьютере хранятся секретные пароли базы данных и другая защищенная информация. Я слышал о нескольких подобных машинах, которые были заложены таким образом, используя эту уязвимость, когда Lynx работает на удаленной машине, в данном случае BBS.

Я попытался обойти это, настроив оператор if-else. К сожалению, ввод «/» для URL все еще работает.

    read -r -p "Web Address: " url
    if [ "${url:0:4}" == "http" ] || [ "${url:0:5}" == "https" ]
    then
        lynx $url -accept_all_cookies
    else
        $url="http://$url"
        lynx $url -accept_all_cookies
    fi

Учитывая природу этого, я хочу убедиться, что у нас есть пуленепробиваемое решение, так как это промышленная машина. Можно ли как-нибудь надежно очистить ввод пользователя 100% времени, чтобы предотвратить доступ к локальным файлам?

Доступ к localhost и 127.0.0.1 в порядке; не нужно, но все, что нужно, это открыть страницу успешно установленного Apache.

Я думал так:

  • Заблокировать доступ к любому пути, начинающемуся с "/"

Это несколько сложно, так как при вводе "/" Lynx, кажется, перенаправляет его на URL, ныет, а затем перенаправляет на локальный URL:

Web Address: /
/home/com/file.sh: line 109: /=http:///: No such file or directory
                                                           / directory (p1 of 2)
Current directory is /

И затем он продолжает выводить список моего корневого каталога.

  • Если первые 4 символа не являются http ИЛИ первые 5 не являются https, автоматически добавляется http: // - это по-прежнему позволяет пользователям пропускать часть URL http: //.

Однако я понимаю, что этого будет недостаточно. Пользователи по-прежнему могут вводить имена локальных файлов в каталоге. Я набрал имя сценария оболочки в каталоге, из которого вызывается этот сценарий, и Lynx выплюнул содержимое сценария bash.

Кроме того, у меня есть опция "перейти к" в Lynx, как только страница уже загружена , чтобы беспокоиться о ней! Я могу отключить это, как lynx $url -goto, но лучше не делать этого, если я смогу избежать этого.

Отключение веб-утилиты не вариант, так есть ли способ сделать это снова безопасным?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Например, если вы передадите /home, ˜/ и file://, Lynx отобразит ваш домашний каталог. Но если вы передадите home, Lynx перепишет его на www.home.com . Итак:

  1. Удалите ведущие /, ˜/ и file://, если необходимо (если оно есть)

Но давайте рассмотрим, что у вас есть файл с именем home в том же каталоге, из которого вы назвали Lynx; это покажет ваш файл. Итак:

  1. Prepend http(s)://, если необходимо (если его там нет)

Фактически вы можете решить все свои проблемы, просто добавив префикс http:// ко всем URL-адресам, так как http://file:// или http://˜/ не имеет смысла.

Посмотрите , как Lynx обрабатывает различные типы URL и URL_DOMAIN_PREFIXES / SUFFIXES .

0 голосов
/ 24 июня 2019

После дополнительных испытаний я смог найти следующее решение:

Это не красиво, но работает без снижения функциональности:

read -r -p "Web Address: " url
if [ "$url" == "" ]
then
    lynx "https://analogfiles.ml" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:1}" == "/" ] || [ "${url:0:1}" == "~" ] || [ "${url:0:7}" == "file://" ]
then
    lynx "~http" -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
elif [ "${url:0:7}" == "http://" ] || [ "${url:0:8}" == "https://" ]
then
    lynx $url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
else
    lynx "http://"$url -accept_all_cookies -restrictions=bookmark,bookmark_exec,chdir,disk_save,dired_support,dotfiles,editor,exec,file_url,inside_ftp,lynxcfg_info,lynxcgi,mail,outside_telnet,print
fi

Первая часть обрабатывает домашнюю страницу (которую я установил на одном из нескольких Lynx-дружественных сайтов). С введенными ограничениями нажатие клавиши ENTER больше не приводит к работе домашней страницы.

Вторая часть не позволяет Lynx даже получать URL-адрес, который можно считать локальным. Это связано с тем, что даже при включенных ограничениях с помощью флагов , Lynx не вводит их в действие для данного URL! Это означает, что если Lynx получит локальный для компьютера URL-адрес, такой как file://home/, он разрешит его, даже если он отключен с помощью флагов. Я создал файл сообщения об ошибке http, но пользователи просто видят сообщение об ошибке FTP, которое мне подходит.

В противном случае, если URL отсутствует http: // или https://,, я добавлю http: // on.

Ограничения, которые вы видите здесь, можно просмотреть, набрав lynx -restrictions, который предоставляет дополнительную информацию.

Наиболее релевантное ограничение, которое вы видите, это dired_support, которое запрещает переход к локальным файлам (другие ограничения не имеют прямого отношения, но я не видел причин разрешать их, поэтому для безопасности я их запретил). Это означает, что я могу продолжать разрешать использование GoTo, не беспокоясь о том, что таким образом можно получить доступ к локальным файлам, обходя проверки if-else, которые я здесь использую. Фактически, проверки if / else необходимы только потому, что Lynx не может должным образом применить ограничения для первого URL-адреса, доступного из сценария оболочки.

Другими словами, я должен вручную запретить доступ к локальным файлам с помощью моих операторов if-else, а затем доверять Lynx, чтобы запретить доступ к локальным файлам по ним.

...