Comments 62
Ой зря мне кажется вы выложили это…
Это статья есть на Hacker News. Так что думаю от появляния ее на хабре гораздо хуже не будет
Этой статье несколько лет, читал давным давно где то. Уверен — ничего плохого от этой статьи не произойдет, кому надо и так об этом знал.
В сочетании Google Apps Script это просто готовая «машина DDoS»
Теперь фраза «Do more with Google.» раскрывается в новом свете:)
Теперь фраза «Do more with Google.» раскрывается в новом свете:)
интересно, если вставить ссылку на картинку, хостящуюся на google, он сам себя заддосит? :)
Не думаю, что даже при сильном желании можно хоть как-то заддосить Google :)
По ходу чтения строк
тоже подумал о том, чтобы заставить гугл ддосить себя, до тех пор пока не сочтут это багом. :)
это не уязвимость, и не проходит по программе Bug Bounty.
тоже подумал о том, чтобы заставить гугл ддосить себя, до тех пор пока не сочтут это багом. :)
Не на картинку, а на Google Chrome :)
Don't be evil
Вот Вы кому-то бизнесс накрыли :)
PS. Если с 2012 года гугл об этом знает… возможно это кому-то нужно?
PS. Если с 2012 года гугл об этом знает… возможно это кому-то нужно?
Ну со стороны атакуемого источник атаки в данном случае достаточно легко обнаружить и зафильтровать
Их спредшит разве не умеет for?
И? Как это позволит обойти фильтр по рефереру или по IP (если запросы идут через сервер гугла)?
Меня лично в этой истории больше всего напрягает, что feed fetcher игнорирует robots.txt (why, godgoogle, why?!)
robots.txt — это ж для поиска только.
А тут прямые ссылки.
А тут прямые ссылки.
Скажем так, я не против того чтобы «неиндексирующие» боты «по-особому» читали robots.txt
Но было бы удобнее если бы они его все же читали и могли получать из него особые указания (можно было и предусмотреть для этого бота особые команды. Тогда эта проблема с DDOS решалась бы довольно просто)
Но было бы удобнее если бы они его все же читали и могли получать из него особые указания (можно было и предусмотреть для этого бота особые команды. Тогда эта проблема с DDOS решалась бы довольно просто)
Да, было бы удобнее, но если запрашивает _не поисковик_, зачем его читать?
запрашивает «робот». В конце концов файл называется robots.txt а не searchbots.txt :)
Однако, директивы его, на текущий момент, предназначены именно для поисковых роботов.
Возьмём другую ситуацию. К примеру, у ВКонтакте есть свой парсер статей со сторонних сайтов. Допустим, у вас встала задача написать что-нибудь похожее на такое. Придет ли вам в голову анализировать robots.txt прежде чем обрабатывать ссылку, которую оставил ваш пользователь? Осмелюсь предположить, что скорее всего, нет.
Robots.txt поддерживают не только поисковики, но и некоторые программы (типа Xenu или Teleport Pro). Поэтому, например, для защиты от парсинга имеет смысл добавлять туда соответствующие директивы.
Насколько помню, robots.txt — лишь рекомендация индексирования, к тому же связана с поисковой выдачей.
А этот FeedFetcher ходит с разных ip? Разве нельзя его тупо забанить? Или он ходит оттуда же, откуда и индексатор гугла?
Интересно, сколько своих серверов ляжет из-за тестов?
Сделал по примеру *.pdf файл, замену адреса на *.php файл и получил такой запрос от гугла
10.03.2014 16:34:12
Array
(
[REDIRECT_STATUS] => 200
[HTTP_HOST] => ***
[HTTP_X_SHINDIG_DOS] => on
[HTTP_CACHE_CONTROL] => no-cache, no-store
[HTTP_CONNECTION] => Keep-alive
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible) Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[PATH] => /usr/local/bin:/usr/bin:/bin
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => ***
[SERVER_ADDR] => ***
[SERVER_PORT] => 80
[REMOTE_ADDR] => 66.249.81.232
[DOCUMENT_ROOT] => /var/www/***/www
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /var/www/***/www/somepdf.php
[REMOTE_PORT] => 54687
[REDIRECT_URL] => /some.pdf
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /some.pdf
[SCRIPT_NAME] => /somepdf.php
[PHP_SELF] => /somepdf.php
[REQUEST_TIME] => 1394454852
)
А что если на уровне системы блокировать по USER_AGENT?
10.03.2014 16:34:12
Array
(
[REDIRECT_STATUS] => 200
[HTTP_HOST] => ***
[HTTP_X_SHINDIG_DOS] => on
[HTTP_CACHE_CONTROL] => no-cache, no-store
[HTTP_CONNECTION] => Keep-alive
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible) Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[PATH] => /usr/local/bin:/usr/bin:/bin
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => ***
[SERVER_ADDR] => ***
[SERVER_PORT] => 80
[REMOTE_ADDR] => 66.249.81.232
[DOCUMENT_ROOT] => /var/www/***/www
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /var/www/***/www/somepdf.php
[REMOTE_PORT] => 54687
[REDIRECT_URL] => /some.pdf
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /some.pdf
[SCRIPT_NAME] => /somepdf.php
[PHP_SELF] => /somepdf.php
[REQUEST_TIME] => 1394454852
)
А что если на уровне системы блокировать по USER_AGENT?
nginx. Первая ссылка в гугле.
http {
map $http_user_agent $limit_bots {
default '';
~*(google|bing|yandex|msnbot|Feedfetcher-Google) $binary_remote_addr;
}
limit_req_zone $limit_bots zone=bots:10m rate=1r/m;
server {
location / {
limit_req zone=bots burst=5 nodelay;
}
}
}
Как проверить, что моя таблица на гугл.докс с запросами на картинку + параметр, работает?
Спортивный интерес, Вы не подумайте ничего лишнего: О
Спортивный интерес, Вы не подумайте ничего лишнего: О
Я запускал синатру, она в консоль пишет все запросы и ip (изменить адрес и порт на свои):
Вывод части теста:
ruby -rsinatra -e'set :public_folder, "."; set :bind, "192.168.0.102"; set :port, 8080;'
Вывод части теста:
Скрытый текст
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/157 HTTP/1.1» 404 457 0.0031
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/158 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/159 HTTP/1.1» 404 457 0.0008
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/160 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/161 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/162 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/163 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/164 HTTP/1.1» 404 457 0.0012
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/165 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/166 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/167 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/168 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/169 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/170 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/171 HTTP/1.1» 404 457 0.0016
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/172 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/173 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/174 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/175 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/176 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/177 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/178 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/179 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/180 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/181 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/182 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/183 HTTP/1.1» 404 457 0.0015
^C66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/184 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/158 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:06] «GET /__sinatra__/159 HTTP/1.1» 404 457 0.0008
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/160 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/161 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/162 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:07] «GET /__sinatra__/163 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/164 HTTP/1.1» 404 457 0.0012
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/165 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/166 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:08] «GET /__sinatra__/167 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/168 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/169 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/170 HTTP/1.1» 404 457 0.0015
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/171 HTTP/1.1» 404 457 0.0016
66.249.83.56 — - [10/Mar/2014 19:04:09] «GET /__sinatra__/172 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/173 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/174 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/175 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:10] «GET /__sinatra__/176 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/177 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/178 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/179 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/180 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:11] «GET /__sinatra__/181 HTTP/1.1» 404 457 0.0013
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/182 HTTP/1.1» 404 457 0.0014
66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/183 HTTP/1.1» 404 457 0.0015
^C66.249.83.56 — - [10/Mar/2014 19:04:12] «GET /__sinatra__/184 HTTP/1.1» 404 457 0.0013
А если сюда еще и функцию
GOOGLECLOCK()
добавить…Подскажите а такая схема поможет?
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?masite\.ru/ [nc]
RewriteRule .*\.(gif|jpe?g|png|bmp|pdf|zip|rar|mp3|js)$ — [F]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?masite\.ru/ [nc]
RewriteRule .*\.(gif|jpe?g|png|bmp|pdf|zip|rar|mp3|js)$ — [F]
Никто не любит апач. :)
Во-первых, есть мнение, что при неблагоприятном стечении обстоятельств апач рискует умереть еще до выполнения mod_rewrite.
Во-вторых, эта схема защищает только картинки — но злоумышленник не обязан загружать именно их. Ведь ему не нужен результат в виде картинки на экране — ему нужен запрос к серверу. А значит, он вполне может поставить ссылки на главную страницу сайта.
В-третьих, Referer — это необязательный заголовок. Браузеры для параноиков не будут передавать его вам.
Во-вторых, эта схема защищает только картинки — но злоумышленник не обязан загружать именно их. Ведь ему не нужен результат в виде картинки на экране — ему нужен запрос к серверу. А значит, он вполне может поставить ссылки на главную страницу сайта.
В-третьих, Referer — это необязательный заголовок. Браузеры для параноиков не будут передавать его вам.
А неужели нет никакого заголовка, который бы сообщал браузеру о том, что «данный файл неизменен относительно query-части в location»?
Теоретически можно делать редирект на урл без параметра запроса. А тот урл уже будет говорить not-modified
Нет, таких способов нет. Есть редиректы, есть canonical url, но оба способа работают только после того, как запрос с новой query-частью уже был отправлен. Еще я где-то видел альтернативные url — но там можно указать лишь конечное число записей, злоумышленник же всегда придумает что-то еще.
Надеюсь, писатели облачных хостингов добавят защиту от этого в свои конфиги. Иначе действительно можно высосать сколько угодно трафика (который в облаках оплачивается помегабайтно), и владелец аккаунта получит счет на десятки тысяч баксов.
google уважает robots.txt, не? можно запретить там все большие файлы.
Почти такой же баг есть и у поискового робота
> Вчера я отправил описание этого бага в Google и получил ответ, что это не уязвимость, и не проходит по программе Bug Bounty. Возможно, они заранее знали о нём, и действительно не считают это багом?
Надо тогда натравить Spreadsheet на сервисы Google, пусть отрабатывают фичу :)
Надо тогда натравить Spreadsheet на сервисы Google, пусть отрабатывают фичу :)
К слову говоря — вконтакте тоже забират своим сервером картинки с сайтов…
Вероятно и им можно уложить сайт, чуть позже даже проверю
Даже проверил:
87.240.182.189 — - [11/Mar/2014:12:49:38 +0300] «GET /images/index.jpg HTTP/1.1» 206 80802 "-" «Mozilla/5.0 (compatible; vkShare; +http://vk.com/dev/Share)»
Даже проверил:
87.240.182.189 — - [11/Mar/2014:12:49:38 +0300] «GET /images/index.jpg HTTP/1.1» 206 80802 "-" «Mozilla/5.0 (compatible; vkShare; +http://vk.com/dev/Share)»
Sign up to leave a comment.
DDOS любого сайта с помощью Google Spreadsheet