CTF中正则注入技巧有哪些?
Bugku-字符?正则?
在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最吸引人的魅力所在。

参与讨论
暂无评论,快来发表你的观点吧!