实际上我正在为我的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,完全没用。实际上我无法找到解决问题的好方法。
感谢您的帮助!
答案 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次或更多次。