对于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*/
有谁知道我怎么做?
感谢和抱歉蹩脚的英语
答案 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,}.*