CTF中正则注入技巧有哪些?

11 人参与

CTF比赛中,正则表达式注入是web安全方向中一个精妙而危险的技术。与传统的SQL注入或命令注入不同,正则注入直接针对正则引擎本身,通过精心构造的输入消耗系统资源或绕过匹配逻辑。这种攻击方式在PHP的preg_match、Python的re模块等常见正则函数中都有可能出现。

正则表达式回溯攻击

回溯攻击是最经典的正则注入手法。当正则引擎遇到量词(如.*、.+)和可选分支时,会尝试所有可能的匹配路径。攻击者可以构造特定的字符串,诱导引擎进行指数级增长的匹配尝试。比如面对正则/^(a+)+$/时,输入"aaaaaaaaax"会让引擎检查2^10种可能的匹配组合,直接导致服务器CPU资源耗尽。

锚点位置利用

聪明的选手会利用锚点字符改变匹配逻辑。比如正则/^key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i这种复杂模式,通过精心设计输入顺序,可以让前段匹配快速成功,而后段匹配触发异常。曾经有个真实案例,选手用"key123key1234key:/1/123keya-"成功绕过了看似严密的防护,就是因为准确抓住了字符类[[::punct:]]的匹配特性。

反向引用技巧

当正则中使用捕获组和反向引用时,攻击面会进一步扩大。比如/(w+)1/这样的模式,输入"aaaaaaaa"会触发大量回溯计算。在DEF CON CTF中就出现过利用反向引用导致正则引擎崩溃的实例,迫使组委会临时调整题目设置。

绕过长度限制的手法

有些题目会限制输入长度,这时候就需要更精巧的构造。利用嵌套量词如(a|a)+,即使很短的输入也能产生巨大的状态空间。去年HackTheBox上有道题,仅用15个字符就实现了正则拒绝服务,靠的就是这种深度嵌套的表达式设计。

说到底,正则注入考验的是对正则引擎工作原理的深刻理解。每个量词、每个锚点、每个字符类都可能成为攻击的入口点,这种在规则边缘游走的技巧,正是CTF最吸引人的魅力所在。

参与讨论

11 条评论
  • BlackthornAssassin

    ^和$锚点还能这么玩?一直以为就是首尾限定

    回复
  • 狐仙附体

    之前搞过正则dos,那个嵌套量词真能雪崩式消耗cpu

    回复
  • CuddlyPanda

    (a+)+ 这种表达式看着就危险,实际比赛中见过好几次

    回复
  • 微光记事

    反向引用居然也能成漏洞点,学到了(不是)

    回复
  • 布丁布丁

    输入才15个字符就能打穿?现在出题都这么阴间吗

    回复
  • 轻音

    这回溯攻击太狠了,试过一次直接把靶机干崩😂

    回复
  • 雪落心

    这个punct字符类容易踩坑,之前绕了半天没绕过去

    回复
  • 酸菜鱼不酸

    PHP的preg_match函数这么容易中招吗?有点意外。

    回复
  • 影舞者

    Python的re模块会不会也有类似风险?

    回复
    1. 糖醋小排骨

      @ 影舞者 Python的re模块也有类似风险,需要小心。

      回复
  • 黑夜独行

    嵌套量词这招太秀了,短小精悍

    回复