Комментарии 62
Ой зря мне кажется вы выложили это…
+55
Это статья есть на Hacker News. Так что думаю от появляния ее на хабре гораздо хуже не будет
+41
Этой статье несколько лет, читал давным давно где то. Уверен — ничего плохого от этой статьи не произойдет, кому надо и так об этом знал.
+1
В сочетании Google Apps Script это просто готовая «машина DDoS»
Теперь фраза «Do more with Google.» раскрывается в новом свете:)
Теперь фраза «Do more with Google.» раскрывается в новом свете:)
+18
интересно, если вставить ссылку на картинку, хостящуюся на google, он сам себя заддосит? :)
+13
Не думаю, что даже при сильном желании можно хоть как-то заддосить Google :)
+1
По ходу чтения строк
тоже подумал о том, чтобы заставить гугл ддосить себя, до тех пор пока не сочтут это багом. :)
это не уязвимость, и не проходит по программе Bug Bounty.
тоже подумал о том, чтобы заставить гугл ддосить себя, до тех пор пока не сочтут это багом. :)
+3
Не на картинку, а на Google Chrome :)
-1
Don't be evil
-3
Вот Вы кому-то бизнесс накрыли :)
PS. Если с 2012 года гугл об этом знает… возможно это кому-то нужно?
PS. Если с 2012 года гугл об этом знает… возможно это кому-то нужно?
0
Ну со стороны атакуемого источник атаки в данном случае достаточно легко обнаружить и зафильтровать
+5
Их спредшит разве не умеет for?
0
И? Как это позволит обойти фильтр по рефереру или по IP (если запросы идут через сервер гугла)?
0
Меня лично в этой истории больше всего напрягает, что feed fetcher игнорирует robots.txt (why, godgoogle, why?!)
-1
robots.txt — это ж для поиска только.
А тут прямые ссылки.
А тут прямые ссылки.
+6
Скажем так, я не против того чтобы «неиндексирующие» боты «по-особому» читали robots.txt
Но было бы удобнее если бы они его все же читали и могли получать из него особые указания (можно было и предусмотреть для этого бота особые команды. Тогда эта проблема с DDOS решалась бы довольно просто)
Но было бы удобнее если бы они его все же читали и могли получать из него особые указания (можно было и предусмотреть для этого бота особые команды. Тогда эта проблема с DDOS решалась бы довольно просто)
-1
Да, было бы удобнее, но если запрашивает _не поисковик_, зачем его читать?
+3
запрашивает «робот». В конце концов файл называется robots.txt а не searchbots.txt :)
+10
Однако, директивы его, на текущий момент, предназначены именно для поисковых роботов.
-1
Возьмём другую ситуацию. К примеру, у ВКонтакте есть свой парсер статей со сторонних сайтов. Допустим, у вас встала задача написать что-нибудь похожее на такое. Придет ли вам в голову анализировать robots.txt прежде чем обрабатывать ссылку, которую оставил ваш пользователь? Осмелюсь предположить, что скорее всего, нет.
0
Robots.txt поддерживают не только поисковики, но и некоторые программы (типа Xenu или Teleport Pro). Поэтому, например, для защиты от парсинга имеет смысл добавлять туда соответствующие директивы.
+1
Насколько помню, robots.txt — лишь рекомендация индексирования, к тому же связана с поисковой выдачей.
+2
А этот FeedFetcher ходит с разных ip? Разве нельзя его тупо забанить? Или он ходит оттуда же, откуда и индексатор гугла?
0
Интересно, сколько своих серверов ляжет из-за тестов?
+1
Сделал по примеру *.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?
+8
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;
}
}
}
+23
Как проверить, что моя таблица на гугл.докс с запросами на картинку + параметр, работает?
Спортивный интерес, Вы не подумайте ничего лишнего: О
Спортивный интерес, Вы не подумайте ничего лишнего: О
0
Я запускал синатру, она в консоль пишет все запросы и 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
0
А если сюда еще и функцию
GOOGLECLOCK()
добавить…+4
Подскажите а такая схема поможет?
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]
+1
Никто не любит апач. :)
+23
Во-первых, есть мнение, что при неблагоприятном стечении обстоятельств апач рискует умереть еще до выполнения mod_rewrite.
Во-вторых, эта схема защищает только картинки — но злоумышленник не обязан загружать именно их. Ведь ему не нужен результат в виде картинки на экране — ему нужен запрос к серверу. А значит, он вполне может поставить ссылки на главную страницу сайта.
В-третьих, Referer — это необязательный заголовок. Браузеры для параноиков не будут передавать его вам.
Во-вторых, эта схема защищает только картинки — но злоумышленник не обязан загружать именно их. Ведь ему не нужен результат в виде картинки на экране — ему нужен запрос к серверу. А значит, он вполне может поставить ссылки на главную страницу сайта.
В-третьих, Referer — это необязательный заголовок. Браузеры для параноиков не будут передавать его вам.
+9
А неужели нет никакого заголовка, который бы сообщал браузеру о том, что «данный файл неизменен относительно query-части в location»?
0
Теоретически можно делать редирект на урл без параметра запроса. А тот урл уже будет говорить not-modified
0
Нет, таких способов нет. Есть редиректы, есть canonical url, но оба способа работают только после того, как запрос с новой query-частью уже был отправлен. Еще я где-то видел альтернативные url — но там можно указать лишь конечное число записей, злоумышленник же всегда придумает что-то еще.
0
Надеюсь, писатели облачных хостингов добавят защиту от этого в свои конфиги. Иначе действительно можно высосать сколько угодно трафика (который в облаках оплачивается помегабайтно), и владелец аккаунта получит счет на десятки тысяч баксов.
0
google уважает robots.txt, не? можно запретить там все большие файлы.
-1
Почти такой же баг есть и у поискового робота
-2
> Вчера я отправил описание этого бага в Google и получил ответ, что это не уязвимость, и не проходит по программе Bug Bounty. Возможно, они заранее знали о нём, и действительно не считают это багом?
Надо тогда натравить Spreadsheet на сервисы Google, пусть отрабатывают фичу :)
Надо тогда натравить Spreadsheet на сервисы Google, пусть отрабатывают фичу :)
+1
К слову говоря — вконтакте тоже забират своим сервером картинки с сайтов…
Вероятно и им можно уложить сайт, чуть позже даже проверю
Даже проверил:
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)»
+2
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
DDOS любого сайта с помощью Google Spreadsheet