实际上,我正在为我的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>
这是我的实际规则:
(<!ENTITYs[a-zA-Z0-9]*s"(&[a-zA-Z0-9]+;){4,}">(s?)[^]]*){5,}
解释一下我想要实现的目标:
只要至少有 5 个实体行和至少 4 个 &-参数,规则必须触发。如果所有 5 条线一个接一个地遵循,则没有问题, 但是实体线不需要一个接一个。所以我必须捕获两个实体行之间的其他所有内容,这使得整个事情成为一个大的终止问题,因为 [^]]* 捕获除 ] 之外的所有内容,并且还捕获整个实体行并使我的量词 {5,} 完全无用。实际上,我找不到任何好的解决方案来解决我的问题。
谢谢你们的帮助!
您可以使用
(?s)<!ENTITYs[a-z0-9]*s"(&[a-zA-Z0-9]+;){4,}">(?:.*?<!ENTITYs[a-z0-9]*s"(&[a-zA-Z0-9]+;){4,}">){4,}
查看正则表达式演示
详
(?s)
- DOTALL 模式开启,.
现在匹配任何字符<!ENTITY
- 文本<!ENTITY
子字符串s
- 空格[a-z0-9]*
- 0+ 字母/数字s
- 空格"
-"
(&[a-zA-Z0-9]+;){4,}
- 4 次或更多次重复&
、1+ 字母数字字符,然后;
">
-">
子字符串(?:
- 非捕获组匹配的开始.....*?
- 任何 0+ 字符,尽可能少<!ENTITYs[a-z0-9]*s"(&[a-zA-Z0-9]+;){4,}">
- 与上述模式相同
){4,}
- ...4次或更多次。