java正则表达式减去捕获组

时间:2017-01-06 11:41:08

标签: java regex

对于java 1.8(java.util.regex。*)中的安全PoC,我尝试在日志文件中检测sql注入攻击,例如" union select from",即使它是"编码绕过一个waf。 OWASP的示例:

/*!%55NiOn*/ /*!%53eLEct*/
REVERSE(noinu)+REVERSE(tceles)
un?+un/**/ion+se/**/lect+

由于正则表达式而检测它的脏方法是检测字符类中的3个连续字母,[unio],[selct]和[from]。

所以一个非常简单的正则表达式几乎没有误报就像:

([unio])([unio&&[^\\1])[unio&&[^\\1\\2]] =>与uni

不符

[unio][unio&&[^u][unio&&[^un]] =>匹配uni

所以我使用减法,但在减法中使用捕获组或命名捕获组似乎是不可能的,但我需要它来检测REVERSE(noinu)+REVERSE(tceles)以及/*!%55NiOn*/ /*!%53eLEct*/

有谁知道我怎么做?

感谢和抱歉蹩脚的英语

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的规范,那么应该遵循以下规则:

(([unio]|[selct]|[from])\2?(?!\2)){3,}+

有关详细说明,请参阅this Regex 101,但简而言之:

  • 匹配其中一个组
  • 展望其他成员
  • 寻找至少三名成员

这将从组中混合匹配(即,它将找到rio)。如果你想只从特定的组中获得匹配,那么无需混合匹配然后作为第一次尝试,我建议使用三个不同的正则表达式(每个匹配组一个),因为尽管这样做肯定是可行的与单一正则表达式匹配,问题是它的可读性如何?

修改:我的回答基于this SO answer

Edit2:根据OP的评论,解决方案将是:

(([unio])\2?(?!\2)){3,}.*(([selct])\4?(?!\4)){3,}.*(([from])\6?(?!\6)){3,}.*