web-dev-qa-db-ja.com

(JSON :: ParserError) "{N}: 'alihack <%eval request(\" alihack.com \ ")%>の予期しないトークン

Ruby on Rails 3.2.11 and Ruby 1.9.3。

次のエラーの原因は何ですか:

(JSON::ParserError) "{N}: unexpected token at 'alihack<%eval request(\"alihack.com\")%>

ログにこのようなエラーがいくつかあります。それらはすべて、request(\ "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であると思います。

リンク guyは同じIPアドレス(23.27.103.106)からの彼のWebサイトで同じ問題を抱えています。

要約すると、すべてのエラーの共通IPは23.27.103.106であり、Rubyのevalを使用してスクリプトを実行しようとします。

だから私の質問は次のとおりです。彼らはどのタイプの脆弱性を見つけようとしますか?何をすべきか? IPをブロックしますか?

前もって感謝します。

54
Igor Markelov

なぜ起こるのですか?

リモートコード実行の脆弱性を少なくともテストするか、悪用する試みのようです。潜在的に一般的なもの(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を使用してIPアドレスをブロックできます
  2. PUTまたはnginx構成内の/ALi.txtへの要求(Apacheまたはすべて)をフィルターします。
  3. rack-attack gemのようなツールを使用して、そこにフィルターを適用します。 (こちらをご覧ください rack-attack issue
  4. request_exception_handler gemを使用してエラーをキャッチし、Rails内から処理します( this SO =回答 および このgithubの問題
  5. railsのroutes.rb内のPUTリクエストを、明示的に許可されているURL以外のすべてのURLにブロックします。この場合、エラーはRailsのルートに到達する前でも発生しているように見えるため、これは不可能な場合があります。
  6. rack-robustness ミドルウェアを使用し、json解析エラーを this configuration in config/application.rbのようなものでキャッチします
  7. 独自のミドルウェアを作成します。 this post の内容に沿ったもの

私は現在、オプション#3、#4または#6に傾いています。これらはすべて、他の種類のボット/スキャナー、または将来ポップアップする可能性のあるその他の無効なリクエストに役立つ可能性があります...

人々がさまざまな代替ソリューションについてどう思うか聞いて幸せ

65
gingerlime

自分のサイト(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翻訳が助けてくれました)

この「ブラックスパイダー」ツールはスクリプトキディによって変更され、「脆弱」なサイトを見つけようとするカーペット爆撃機として使用されていると思います。

構成に「alihack」サブストリングを含むすべての試みの自動拒否を追加するのが賢明かもしれません。

10
CRZ

同様の問題がロールバーログに表示されました。/ALi.txtへのPUTリクエスト

そのIPをブロックするのに最適なのは、このエラーで最後に1つの要求しか見なかったことです。私が受け取ったリクエストはフランスから来ました-> http://whois.domaintools.com/37.187.74.201

Nginxを使用する場合、これをnginx confファイルに追加します。

deny 23.27.103.106/32;
deny 199.27.133.183/32;
2
Jamsi

Rails-3には、特別な回避策ジェムがあります: https://github.com/infopark/robust_params_parser

0
Kostia