(JSON :: ParserError)“{N}:'alihack<%eval request(\”alihack.com \“)%>的意外标记

时间:2014-08-12 21:13:00

标签: ruby-on-rails ruby json ruby-on-rails-3

我有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”=&gt;我认为“10.93.15.235”和“10.123.66.198”以及其他代理商都是伪造的IP。

这里的a link家伙在同一个IP地址(23.27.103.106)的网站上遇到了同样的问题。

总而言之,所有错误的常见ip是23.27.103.106,他们尝试使用ruby的eval运行脚本。

所以我的问题是: 他们试图找到哪种类型的漏洞? 该怎么办?阻止ip?

提前谢谢。

4 个答案:

答案 0 :(得分:65)

为什么会这样?

这似乎是尝试至少测试或利用远程代码执行漏洞。可能是通用的(针对Rails以外的平台),或者早期版本中存在的平台。

然而,实际错误源于请求是带有HTTP PUT标头的application/json这一事实,但正文不是有效的json。

要在您的开发环境中重现这一点:

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。

可能的解决方案

我不完全确定处理此问题的最佳策略是什么。有几种可能性:

  1. 您可以使用iptables
  2. 阻止IP地址
  3. PUT/ali.txt配置中过滤nginx或全部} apache请求。
  4. 使用像rack-attack gem这样的工具并在那里应用过滤器。 (见rack-attack issue
  5. 使用request_exception_handler gem捕获错误并在Rails中处理它(请参阅this SO answerthis github issue
  6. 阻止PUT在Rails'routes.rb内对所有网址的请求,但是明确允许的请求。看起来在这种情况下,错误甚至在它到达Rails的路由之前就会引发 - 所以这可能是不可能的。
  7. 使用rack-robustness中间件并使用config/application.rb
  8. this configuration之类的内容捕获json解析错误
  9. 编写自己的中间件。 this post
  10. 上的内容

    我目前倾向于选择#3,#4或#6。对于其他类型的机器人/扫描仪或将来可能弹出的其他无效请求,所有这些都可以派上用场......

    很高兴听到人们对各种替代解决方案的看法

答案 1 :(得分:10)

我在自己的网站上看到了一些奇怪的日志条目[它们没有使用Ruby],谷歌把我带到了这个帖子。我的参赛作品的IP不同。 [120.37.236.161]

经过多一点探讨之后,这是我大多猜测/受过教育的猜测:

首先,在我自己的日志中,我看到了http://api.alihack.com/info.txt的引用 - 检查了这个链接;看起来像是注入PHP的尝试。

还有一个&#34; register.php&#34;那里的页面 - 提交将您带到&#34; invite.php&#34;页。

对此域名的进一步审核将我带到了http://www.alihack.com/2014/07/10/168.aspx(页面是中文,但Google翻译帮助了我)

我希望这个&#34;黑蜘蛛&#34;工具已被脚本小子修改,并被用作地毯轰炸机,试图找到任何易受攻击的网站。&#34;

谨慎地添加一个自动拒绝任何尝试,包括&#34; alihack&#34;子串到您的配置。

答案 2 :(得分:2)

我的Rollbar日志中出现了类似的问题,是对/ali.txt的PUT请求

最好只是阻止那个IP,我只看到一个请求就此错误。我收到的请求来自法国 - &gt; http://whois.domaintools.com/37.187.74.201

如果您使用nginx,请将其添加到您的nginx conf文件中;

deny 23.27.103.106/32;
deny 199.27.133.183/32;

答案 3 :(得分:0)

对于Rails-3,有一个特殊的解决方法-gem:https://github.com/infopark/robust_params_parser