终止问题以 pcre 为单位



实际上,我正在为我的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次或更多次。

最新更新