(JSON:: ParserError) "{N}: неожиданный токен в 'alihack <% eval request (\" alihack.com\")%>
У меня есть сайт на Ruby on Rails 3.2.11 и Ruby 1.9.3.
Что может вызвать следующую ошибку:
(JSON::ParserError) "{N}: unexpected token at 'alihack<%eval request(\"alihack.com\")%>
У меня есть несколько ошибок, подобных этому в журналах. Все они пытаются выполнить запрос (\ "alihack.com \" ).
Часть файла журнала:
"REMOTE_ADDR" => "10.123.66.198",
"REQUEST_METHOD" => "PUT",
"REQUEST_PATH" => "/ali.txt",
"PATH_INFO" => "/ali.txt",
"REQUEST_URI" => "/ali.txt",
"SERVER_PROTOCOL" => "HTTP/1.1",
"HTTP_VERSION" => "HTTP/1.1",
"HTTP_X_REQUEST_START" => "1407690958116",
"HTTP_X_REQUEST_ID" => "47392d63-f113-48ba-bdd4-74492ebe64f6",
"HTTP_X_FORWARDED_PROTO" => "https",
"HTTP_X_FORWARDED_PORT" => "443",
"HTTP_X_FORWARDED_FOR" => "23.27.103.106, 199.27.133.183".
199.27.133.183 - это CLoudFlare IP.
"REMOTE_ADDR" = > "10.93.15.235" и "10.123.66.198" и другие, я думаю, являются поддельными IP-адресами прокси.
Здесь ссылка у парня такая же проблема со своим веб-сайтом с того же ip-адреса (23.27.103.106).
Подводя итог, общий ip из всех ошибок составляет 23.27.103.106, и они пытаются запустить script с использованием ruby eval.
Итак, мои вопросы:
Какую уязвимость они пытаются найти?
Что делать? Заблокировать ip?
Спасибо заранее.
Ответы
Ответ 1
Почему это происходит?
Похоже на попытку хотя бы протестировать или использовать уязвимость удаленного выполнения кода. Потенциально общий (ориентированный на платформу, отличный от Rails), или тот, который существовал в более ранних версиях.
Фактическая ошибка, однако, связана с тем, что запрос является заголовком HTTP PUT
с application/json
, но тело не является допустимым json.
Чтобы воспроизвести это в своей среде dev:
curl -D - -X PUT --data "not json" -H "Content-Type: application/json" http://localhost:3000
Подробнее
Rails action_dispatch пытается разобрать любые json-запросы, передавая тело, подлежащее декодированию
# lib/action_dispatch/middleware/params_parser.rb
def parse_formatted_parameters(env)
...
strategy = @parsers[mime_type]
...
case strategy
when Proc
...
when :json
data = ActiveSupport::JSON.decode(request.body)
...
В этом случае он не является допустимым JSON, и возникает ошибка, заставляя сервер сообщать 500.
Возможные решения
Я не совсем уверен, какая лучшая стратегия для решения этой проблемы. Существует несколько возможностей:
- вы можете заблокировать IP-адрес, используя
iptables
- (
PUT
или все) запрашивает /ali.txt
в конфигурациях nginx
или apache
.
- используйте такой инструмент, как
rack-attack
gem и примените там фильтр. (см. этот проблема в стойке)
- используйте
request_exception_handler
gem, чтобы поймать ошибку и обработать ее из Rails (см. этот ответ SO и этот вопрос github)
-
заблокировать PUT
запросы в Rails 'routes.rb
ко всем URL-адресам, но те, которые явно разрешены. Похоже, что в этом случае ошибка возникает еще до того, как она достигнет маршрутов Rails - так что это может быть невозможно.
- Используйте
rack-robustness
промежуточное программное обеспечение и поймайте ошибку разбора json с чем-то вроде эту конфигурацию в config/application.rb
- Напишите свое собственное промежуточное программное обеспечение. Что-то вроде строк на этот пост
В настоящее время я склоняюсь к вариантам # 3, # 4 или # 6. Все это может пригодиться для других типов ботов/сканеров или других недопустимых запросов, которые могут появиться в будущем...
Счастлив услышать, что люди думают о различных альтернативных решениях
Ответ 2
Я увидел некоторые странные записи журнала на моем собственном сайте [который не использует Ruby], и Google взял меня в эту тему. IP в моих записях был другим. [120.37.236.161]
После того, как ты немного окурился, вот моя главным образом предположение/образованное предположение:
Во-первых, в моих собственных журналах я увидел ссылку на http://api.alihack.com/info.txt - проверил эту ссылку; была похожа на попытку инъекции PHP.
Там также есть страница "register.php" - отправка приведет вас к странице "invite.php".
Дальнейшее изучение этого домена привело меня к http://www.alihack.com/2014/07/10/168.aspx (страница на китайском языке, но Google Translate помог мне здесь)
Я ожидаю, что этот инструмент "Черный паук" был изменен script детишками и используется в качестве коврового бомбардировщика, чтобы попытаться найти любые уязвимые сайты.
Возможно, разумно просто добавить автоматическое отрицание любой попытки, включая подстроку "alihack" в вашей конфигурации.
Ответ 3
У меня была аналогичная проблема, обнаруженная в моих журналах Rollbar, запрос PUT на /ali.txt
Лучше всего заблокировать этот IP-адрес, я только видел один запрос на моем конце с этой ошибкой. Я получил запрос от Франции → http://whois.domaintools.com/37.187.74.201
Если вы используете nginx, добавьте это в свой файл конфига nginx;
deny 23.27.103.106/32;
deny 199.27.133.183/32;
Ответ 4
Для Rails-3 существует специальный обходной камень: https://github.com/infopark/robust_params_parser