Доброго времени суток! Сегодня я хочу рассказать, что содержат в себе скрытые папки и файлы на веб-сервере.
Скрытые файлы и директории, которые оставляют на веб сервере, могут иметь важную, конфиденциальную информацию. Веб-сервер может содержать много скрытой информации:
Эти данные можно поделить на 3 группы:
Давайте взглянем на все это более детально, что бы узнать какую информацию можно от них ожидать
Исходный код системы контроля версий
Git
Git «является
Недавно созданный Git-репозиторий содержит несколько папок и файлов по умолчанию, в которых хранится вся информация. Вот пример папки .git с уже сделанным комитом:
Все данные хранятся в .git. Эти данные можно поделить на 3 вида: комиты, каталоги файлов либо «Tree», и блобы «Blob»
1. Комит — хранит информацию с текущими хэшами каталогов файлов
2. Tree — содержит информацию о структуре папок и файлов - и каждая отдельная папка или файл имеет свой собственный хэш объекта, хранящийся в объекте каталогов файлов. Это может быть другой каталог(папка на один уровень ниже в структуре папок) или файл.
3. Blob - это объект Git типа, в котором сохраняется содержимое файлов.
Если все же .git папка встретиться на веб сервере, есть легкий путь для получения содержания любого файла — просто скачав и прочив Git объекты. Если повезет, можно скопировать репозиторий используя команду git clone, либо использовать wget с -r опцией. Но иногда все не так просто…
Давайте рассмотрим ситуацию, когда ни один из этих вариантов не выполняется успешно
Что бы убедиться о наличии .git папки на веб сервере, нужно проверить получения HTTP 403 ответа (если 404 — запрашиваемая папка не найдена).
Отражение файлов и папок используя локальную Git репозиторий
Что бы сделать это, стоит создать свою простенькую .git репозиторий с внутренней структурой и скачать Git объекты с веб сервера
Прежде всего, создания репозитория:
$ git init
Эта команда инициализирует пустую Git репозиторий с всеми необходимыми файлами и папками.
Получение и прочтение информации об объектах
Для получения информации о Git репозитории, сперва нужно выяснить стартовую точку. Git сохраняет всю информацию в лог файле, и этот файл доступен в .git/logs/head
Если .git/logs/head не работает, но .git возвращает 403, то нужно попробовать .git/logs/HEAD
Проанализируем внимательнее на строку из файла:
0000000000000000000000000000000000000000 07603070376d63d911f608120eb4b5489b507592 test@gmail.com <test@gmail.com> 1452195279 +0000 commit (initial);
Первые 2 строки являются хэшами объектов, и именно это нам нужно. Так как это самый первый комит, первый хэш имеет только нули (так как предыдущего нет), второй в свою очередь имеет информацию о предыдущем.
Первым делом нужно создать действующий путь к объекту. Путь содержит общий путь ко всем объектам в хранилище, то есть к .git/objects, за которым следуют две части, построенные из хэша - имя каталога (первые два символа хэша) и имя файла (остальная часть хэша, начиная с третьего символа). Таким образом, чтобы получить объект, идентифицированный по хэшу 07603070376d63d911f608120eb4b5489b507592, нужно открыть следующий URL:
localhost/testapp/.git/objects/07/603070376d63d911f608120eb4b5489b507692
И скачивается файл:
Скачанный файл можно увидеть в своей «простой» Git папке:
vasha_prostaya_git_papka/.git/objects/07/603070376d63d911f608120eb4b5489b507692
Команда git cat-gile -t поможет узнать тип объекта:
$ git cat-file -t <хэш>
Что бы отобразить содержание файла, нужно прописать следующую команду:
$ git cat-file -p <хэш>
Теперь можно проверить тип, и прочитать содержание файла, который был сохранен ранее:
При прочтении содержания, можно найти информацию о нынешнем хэше из каталога объектов:
Как вы можете заметить, только index.php остался в папке, также я уже узнал хэш объекта и его тип, который является blob. И это то что нам нужно, для просмотра содержания файла, используя все тот же метод, который до этого я использовал для чтения содержимого комита и объектов каталога (но прежде всего, нужно скачать объект с веб-сервера, как было описано выше):
Так же стоит запомнить, что данное содержание index.php показано такое же, какое оно было при создании комита описанным объектом 07603070376d63d911f608120eb4b5489b507692. Если вы взглянете в файл логов, вы сможете заметить второй комит (идентифицирован хэшем объекта 4db7a14eee2cd3ff529278b75e1653e677fe1d02) и это последний комит, он содержит последние изменения и из-за этого нынешний index.php будет отличаться от предыдущего index.php:
Так как ручной перебор объектов мучительный и нудный, в сетях можно найти автоматизированные скрипты, вот например - тык
.gitignore файл
Есть так же одна вещь, которую стоит описать, если вы нашли .git папку оставленную на веб-сервере, а именно - .gitgnore. Цель таких файлов проста — это место где можно положить имена всех папок и файлов который не стоит комитеть в репозиторий. По этому это самый легкий путь найти файлы, которые по каким-то причинам не должны быть закомиченны:
Subversion (SVN)
Subversion (или SVN) это система контроли системы создана Apache Software Foundation и эта система остается очень популярной и широко используемой.
Пример структуры SVN папок и файлов:
На мой взгляд, wc.db является самым важным файлом базы данных SQLite, pristine/ так же имеет ценную информацию. В wc.db можно найти хэши используемые в pristine/, поэтому стоит начать именно отсюда
Что бы получить информацию из Subversion, прежде всего, нужно убедиться, что нам доступен wc.db. А именно: открыть следующую ссылку в веб-браузере:
Если выскочило уведомление о загрузке — обозначает, что есть шанс, что остальные .svn файлы будут находиться здесь. Сперва, нужно прочитать содержание wc.db что бы получить информацию о хэшах файлов.
Что бы прочитать wc.db файл, можно воспользоваться SQLite утилитой:
Заметили операции INSERT в таблицу NODES? Каждая из этих операций содержит имя файла и SHA1 хэш, который отвечает записке в pristine/:
Что бы отобразить значения из NODES в имя файла, нужно выполнить несколько команд:
При открытии ссылки, нужно будет скачать файл или отобразить содержание прямо в файле:
Так же, запись в таблице REPOSITORIES указывает на настоящий путь в репозиторий, который является:
svn+ssh://192.168.1.4/var/svn-repos/project_wombat
В данной ссылке содержится много информации. Оставляя папку .svn на веб-сервере может быть огромной ошибкой. Это может даже обозначать полную компрометацию исходного кода веб-приложения.
Продолжение темы ждет вас во второй части.
Скрытые файлы и директории, которые оставляют на веб сервере, могут иметь важную, конфиденциальную информацию. Веб-сервер может содержать много скрытой информации:
- исходные коды версии системных папок и файлов (.git, .gitignore, .svn)
- файлы конфигурации (.npmrc, package.json, .htaccess)
- пользовательские файлы конфигурации (.json, .yml, .xml)
- и многое другое
Эти данные можно поделить на 3 группы:
- Файлы конфигурации для IDE (Интегрированная среда разработки)
- Исходный код системы контроля версий
- Проекты и/или файлы конфигурации и настройки для конкретной технологии
Давайте взглянем на все это более детально, что бы узнать какую информацию можно от них ожидать
Исходный код системы контроля версий
Git
Git «является
Ссылка скрыта от гостей
для управления версиями разрабатываемых файлов»Недавно созданный Git-репозиторий содержит несколько папок и файлов по умолчанию, в которых хранится вся информация. Вот пример папки .git с уже сделанным комитом:
Все данные хранятся в .git. Эти данные можно поделить на 3 вида: комиты, каталоги файлов либо «Tree», и блобы «Blob»
1. Комит — хранит информацию с текущими хэшами каталогов файлов
2. Tree — содержит информацию о структуре папок и файлов - и каждая отдельная папка или файл имеет свой собственный хэш объекта, хранящийся в объекте каталогов файлов. Это может быть другой каталог(папка на один уровень ниже в структуре папок) или файл.
3. Blob - это объект Git типа, в котором сохраняется содержимое файлов.
Если все же .git папка встретиться на веб сервере, есть легкий путь для получения содержания любого файла — просто скачав и прочив Git объекты. Если повезет, можно скопировать репозиторий используя команду git clone, либо использовать wget с -r опцией. Но иногда все не так просто…
Давайте рассмотрим ситуацию, когда ни один из этих вариантов не выполняется успешно
Что бы убедиться о наличии .git папки на веб сервере, нужно проверить получения HTTP 403 ответа (если 404 — запрашиваемая папка не найдена).
Отражение файлов и папок используя локальную Git репозиторий
Что бы сделать это, стоит создать свою простенькую .git репозиторий с внутренней структурой и скачать Git объекты с веб сервера
Прежде всего, создания репозитория:
$ git init
Эта команда инициализирует пустую Git репозиторий с всеми необходимыми файлами и папками.
Получение и прочтение информации об объектах
Для получения информации о Git репозитории, сперва нужно выяснить стартовую точку. Git сохраняет всю информацию в лог файле, и этот файл доступен в .git/logs/head
Если .git/logs/head не работает, но .git возвращает 403, то нужно попробовать .git/logs/HEAD
Проанализируем внимательнее на строку из файла:
0000000000000000000000000000000000000000 07603070376d63d911f608120eb4b5489b507592 test@gmail.com <test@gmail.com> 1452195279 +0000 commit (initial);
Первые 2 строки являются хэшами объектов, и именно это нам нужно. Так как это самый первый комит, первый хэш имеет только нули (так как предыдущего нет), второй в свою очередь имеет информацию о предыдущем.
Первым делом нужно создать действующий путь к объекту. Путь содержит общий путь ко всем объектам в хранилище, то есть к .git/objects, за которым следуют две части, построенные из хэша - имя каталога (первые два символа хэша) и имя файла (остальная часть хэша, начиная с третьего символа). Таким образом, чтобы получить объект, идентифицированный по хэшу 07603070376d63d911f608120eb4b5489b507592, нужно открыть следующий URL:
localhost/testapp/.git/objects/07/603070376d63d911f608120eb4b5489b507692
И скачивается файл:
Скачанный файл можно увидеть в своей «простой» Git папке:
vasha_prostaya_git_papka/.git/objects/07/603070376d63d911f608120eb4b5489b507692
Команда git cat-gile -t поможет узнать тип объекта:
$ git cat-file -t <хэш>
Что бы отобразить содержание файла, нужно прописать следующую команду:
$ git cat-file -p <хэш>
Теперь можно проверить тип, и прочитать содержание файла, который был сохранен ранее:
При прочтении содержания, можно найти информацию о нынешнем хэше из каталога объектов:
Как вы можете заметить, только index.php остался в папке, также я уже узнал хэш объекта и его тип, который является blob. И это то что нам нужно, для просмотра содержания файла, используя все тот же метод, который до этого я использовал для чтения содержимого комита и объектов каталога (но прежде всего, нужно скачать объект с веб-сервера, как было описано выше):
Так же стоит запомнить, что данное содержание index.php показано такое же, какое оно было при создании комита описанным объектом 07603070376d63d911f608120eb4b5489b507692. Если вы взглянете в файл логов, вы сможете заметить второй комит (идентифицирован хэшем объекта 4db7a14eee2cd3ff529278b75e1653e677fe1d02) и это последний комит, он содержит последние изменения и из-за этого нынешний index.php будет отличаться от предыдущего index.php:
PHP:
<?php
echo "Hello World!";
$i = 100;
echo "Value of i is $i";
Так как ручной перебор объектов мучительный и нудный, в сетях можно найти автоматизированные скрипты, вот например - тык
.gitignore файл
Есть так же одна вещь, которую стоит описать, если вы нашли .git папку оставленную на веб-сервере, а именно - .gitgnore. Цель таких файлов проста — это место где можно положить имена всех папок и файлов который не стоит комитеть в репозиторий. По этому это самый легкий путь найти файлы, которые по каким-то причинам не должны быть закомиченны:
Subversion (SVN)
Subversion (или SVN) это система контроли системы создана Apache Software Foundation и эта система остается очень популярной и широко используемой.
Пример структуры SVN папок и файлов:
На мой взгляд, wc.db является самым важным файлом базы данных SQLite, pristine/ так же имеет ценную информацию. В wc.db можно найти хэши используемые в pristine/, поэтому стоит начать именно отсюда
Что бы получить информацию из Subversion, прежде всего, нужно убедиться, что нам доступен wc.db. А именно: открыть следующую ссылку в веб-браузере:
Ссылка скрыта от гостей
Если выскочило уведомление о загрузке — обозначает, что есть шанс, что остальные .svn файлы будут находиться здесь. Сперва, нужно прочитать содержание wc.db что бы получить информацию о хэшах файлов.
Что бы прочитать wc.db файл, можно воспользоваться SQLite утилитой:
Код:
$ sqlite3 wc.db
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main /Users/test/wc.db
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE REPOSITORY ( id INTEGER PRIMARY KEY AUTOINCREMENT, root TEXT UNIQUE NOT NULL, uuid TEXT NOT NULL );
INSERT INTO "REPOSITORY" VALUES(1,'svn+ssh://192.168.1.4/var/svn-repos/project_wombat','88dcec91-39c3-4b86-8627-702dd82cfa09');
(...)
INSERT INTO "NODES" VALUES(1,'trunk',0,'',1,'trunk',1,'normal',NULL,NULL,'dir',X'2829','infinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'',0,NULL,1,'',1,'normal',NULL,NULL,'dir',X'2829','infinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test.txt',0,'trunk',1,'trunk/test.txt',2,'normal',NULL,NULL,'file',X'2829',NULL,'$sha1$945a60e68acc693fcb74abadb588aac1a9135f62',NULL,2,1456056344886288,'bl4de',38,1456056261000000,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test2.txt',0,'trunk',1,'trunk/test2.txt',3,'normal',NULL,NULL,'file',NULL,NULL,'$sha1$6f3fb98418f14f293f7ad55e2cc468ba692b23ce',NULL,3,1456056740296578,'bl4de',27,1456056696000000,NULL,NULL);
(...)
Заметили операции INSERT в таблицу NODES? Каждая из этих операций содержит имя файла и SHA1 хэш, который отвечает записке в pristine/:
Код:
$ ls -lA pristine/94/
total 8
-rw-r--r--@ 1 sor staff 38 Feb 31 12:05 945a60e68acc693fcb74abadb588aac1a9135f62.svn-base
Что бы отобразить значения из NODES в имя файла, нужно выполнить несколько команд:
- удалить префикс $sha1$
- добавить постфикс .svn-base
- использовать первые два знака как имя папки внутри директории pristine/ (в этом случае это 94)
- создать полный путь, который в этом примере будет:
Ссылка скрыта от гостей
При открытии ссылки, нужно будет скачать файл или отобразить содержание прямо в файле:
Так же, запись в таблице REPOSITORIES указывает на настоящий путь в репозиторий, который является:
svn+ssh://192.168.1.4/var/svn-repos/project_wombat
В данной ссылке содержится много информации. Оставляя папку .svn на веб-сервере может быть огромной ошибкой. Это может даже обозначать полную компрометацию исходного кода веб-приложения.
Продолжение темы ждет вас во второй части.