【问题标题】:Termination issue in pcrepcre 中的终止问题
【发布时间】:2018-11-27 10:01:50
【问题描述】:

实际上,我正在为我的 Snort IDS 制定规则并尝试解决 Billion Laughs 攻击的问题。它只不过是对预定义变量的递归调用。 Snort 规则可能包含 pcre,因此我尝试为这种攻击构建智能规则。这可能是这种攻击的一种简单形式,在实体线之间有随机线。

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a1 "&a2;&a2;&a2;&a2;&a2;&a2;">
test
<!ENTITY a1 "&a2;&a2;&a2;&ertertert;&a2;&a2;">
<!ENTITY a1 "&a2;&a2;&a2;&ertertert;&a2;&a2;">


<!ENTITY a1 "&a2;&a2;&a2;&a2;&a2;&a2;">
d
dd

<html abc>
a

<!ENTITY a2 "&a3;&a3;&a3;&a3;&a3;">
<!ENTITY a1 "&a0;&a0;&a0;&a0;&d5;">
]>
<data>&a2;</data>

这是我的实际规则:

(<!ENTITY\s[a-zA-Z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">(\s?)[^]]*){5,}

解释我想要达到的目标:

只要有至少 5 个实体行和至少 4 个 & 参数,就必须触发该规则。如果5行一个接一个就没有问题, 但是实体行不需要一个接一个。所以我必须在两个实体行之间捕获其他所有内容,这使得整个事情成为一个大的终止问题,因为 [^]]* 捕获了除 ] 之外的所有内容,并且还捕获了整个实体行并使我的量词 {5, } 完全没用。实际上我找不到任何好的解决方案来解决我的问题。

感谢你们的帮助!

【问题讨论】:

  • 这乍一看很完美。现在我必须明白了!

标签: regex xml pcre rules snort


【解决方案1】:

你可以使用

(?s)<!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">(?:.*?<!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">){4,}

regex demo

详情

  • (?s) - DOTALL 模式开启,. 现在匹配任何字符
  • &lt;!ENTITY - 文字 &lt;!ENTITY 子字符串
  • \s - 一个空格
  • [a-z0-9]* - 0+ 个字母/数字
  • \s - 一个空格
  • " - 一个"
  • (&amp;[a-zA-Z0-9]+;){4,} - &amp; 4 次或更多重复,1+ 字母数字字符,然后 ;
  • "&gt; - "&gt; 子字符串
  • (?: - 非捕获组匹配的开始......
    • .*? - 任何 0+ 个字符,尽可能少
    • &lt;!ENTITY\s[a-z0-9]*\s"(&amp;[a-zA-Z0-9]+;){4,}"&gt; - 与上述相同的模式
  • ){4,} - ... 4 次或更多次。

【讨论】:

  • 我只是没有得到非捕获组的功能。离开 (?: out?
  • @Mischu 如果您需要使用捕获的值,请仅使用捕获组。当您只需要对一系列模式进行分组(量化它们,或者当您需要交替时)时,请使用非捕获模式。
  • 为什么需要非捕获组?
  • @Bacon 用{4,}量化子模式的序列。
  • 嗬,我明白了。第一个 {4,0} 是实体中的引用数,最后一个是实体数。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多