【问题标题】:Is there any way to grok parse URIPATHPARAM when the URL contains invalid characters当 URL 包含无效字符时,有什么方法可以解析 URIPATHPARAM
【发布时间】:2016-06-03 10:04:49
【问题描述】:

快速背景:使用来自 HAProxy 的访问日志并使用 grok 解析它。 HAProxy 的 %{+Q}r 日志变量打印 "<http verb> <uri> <HTTP version>" 我们正在使用

进行解析
"%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}"

这对大多数请求都很好,但是当我们遇到各种扫描器试图通过在 URL 中发送垃圾来进行注入攻击等时,grok 无法解析 uri。以下是一些导致此 grok 过滤器崩溃的示例:

"GET /index.html?14068'#22><bla> HTTP/1.1"
"GET /index.html?fName=\Windows\system.ini%00&lName=&guestEmail= HTTP/1.1"

任何人都可以想出一个解决方案,它可以更好地解析无效的 URI 或至少不会崩溃,即尽可能多地解析 URL 并丢弃垃圾?

【问题讨论】:

  • 有趣的是,你的第一个例子并没有打破我的认知,但我明白你的意思

标签: logstash haproxy grok


【解决方案1】:

是的,通过使用grok的多重匹配能力。

https://groups.google.com/forum/#!topic/logstash-users/H3_3gnWY2Go

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-match

当与break_on_match =&gt; true(默认)结合使用时,您可以指定多个模式供grok尝试,并在找到匹配的模式并应用后停止。

在这里,如果第一个模式不起作用,它将尝试使用 NOTSPACE 的下一个模式,这会吃掉那些坏字符,并标记字段 bad_url 而不是 url

filter {
  grok { 
    match => { 
      "message" => [ 
        "%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}", 
        "%{WORD:method} %{NOTSPACE:bad_url} HTTP/%{NUMBER:httpversion}" 
      ]
    }
    break_on_match => true
  }
}

【讨论】:

  • 如果您想保留名为 url 的字段,您可以稍后使用 mutate 过滤器将 bad_url 重命名为 url 并添加一个标签,如果 bad_url 存在,则它是一个错误的 url跨度>
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2011-07-21
  • 2011-08-22
  • 2011-08-19
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多