对于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,}.*