对于Java 1.8中的安全PoC(java.util.regex。*),我尝试在日志文件中检测到诸如“ union select from”之类的sql注入攻击,即使它被编码为绕过waf。
OWASP中的示例:

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


由于使用了正则表达式,一种肮脏的检测方法是在字符类[unio],[selct]和[from]中检测3个连续的字母。

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

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

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

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

有人知道我该怎么做吗?

谢谢,抱歉英语不好

最佳答案

如果我正确地理解了您的规范,那么应该采取以下措施:

(([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,}.*

10-04 11:05