pcre中的终止问题

时间:2018-06-18 14:14:42

标签: regex xml pcre rules snort

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

<!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个ENTITY行,并且至少有4个&amp; -parameters。如果所有5行都是一个接一个地跟着,那就没问题, 但是ENTITY-lines不需要一个接一个地来。因此,我必须在两个ENTITY行之间捕获所有其他内容,这使得整个事情成为一个大的终止问题,因为[^]] *捕获除了a之外的所有内容,并且还捕获整个ENTITY行并使我的量词{5,完全没用。实际上我无法找到解决问题的好方法。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用

(?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模式,.现在可以匹配任何字符
  • <!ENTITY-文字<!ENTITY子字符串
  • \s-空格
  • [a-z0-9]*-0个字母/数字
  • \s-空格
  • "-一个"
  • (&[a-zA-Z0-9]+;){4,}-4个或更多重复的&,1个以上字母数字字符和;
  • ">-一个">子字符串
  • (?:-开始非捕获组匹配。
    • .*?-任意0个以上的字符,尽可能少
    • <!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">-与上面相同的模式
  • ){4,}-... 4次或更多次。