gpt4 book ai didi

捕获组的java正则表达式减法

转载 作者:行者123 更新时间:2023-11-30 10:34:48 25 4
gpt4 key购买 nike

对于 java 1.8 中的安全 PoC (java.util.regex.*),我尝试在日志文件中检测到类似“union select from”的 sql 注入(inject)攻击,即使它被编码为绕过 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,}.*

关于捕获组的java正则表达式减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com