PHP preg_match 正则绕过实战:%0a换行符在 MRCTF2020 套娃题中的 1 个关键应用 PHP正则绕过实战换行符在CTF中的精妙应用在CTF比赛中PHP的正则表达式绕过一直是Web安全方向的热门考点。今天我们将深入探讨一个经典案例——如何利用%0a换行符绕过preg_match的严格匹配并解析其背后的正则引擎原理。这个技巧曾在MRCTF2020的套娃题目中作为关键突破口帮助众多选手成功通关。1. 理解preg_match的默认匹配模式PHP的preg_match函数是进行正则表达式匹配的核心工具但其默认行为存在一些容易被忽视的特性。让我们先从一个基础示例开始if (preg_match(/^23333$/, $_GET[input])) { echo 匹配成功; }这段代码看似简单却暗藏玄机。关键在于正则表达式中的锚定符^和$^表示匹配字符串的开始$表示匹配字符串的结束默认情况下PHP的PCRE引擎处于单行模式(Single-line mode)这意味着点号.不会匹配换行符$仅匹配字符串末尾不会匹配行尾字符串中的换行符会被视为普通字符这种特性为我们提供了绕过严格匹配的可能性。当输入23333\n时23333匹配模式开头的^23333换行符\n被视为普通字符字符串结尾的$仍然匹配成功2. 换行符绕过的三种实战场景2.1 基础绕过严格字符串匹配在MRCTF2020的题目中关键代码如下if ($_GET[b_u_p_t] ! 23333 preg_match(/^23333$/, $_GET[b_u_p_t])) { echo 进入下一阶段; }这里需要同时满足两个条件值不全等于23333正则匹配^23333$通过添加换行符的payload完美解决?b.u.p.t23333%0a技术要点解析输入内容! 23333preg_match(/^23333$/)结果23333falsetrue不满足23333\ntruetrue满足2.2 进阶应用多行内容注入当正则表达式用于过滤或验证用户输入时换行符可以用于注入额外内容// 假设用于过滤恶意输入 if (!preg_match(/^[a-z]$/i, $_POST[username])) { die(用户名只能包含字母); } // 绕过payload usernameadmin%0aDROP TABLE users--2.3 配合其他特殊字符换行符可以与其他控制字符组合使用%0d%0aWindows换行(CRLF)%0aUnix换行(LF)%0dMac换行(CR)// 检测是否为纯数字 if (preg_match(/^\d$/, $_GET[id])) { process_id($_GET[id]); } // 绕过payload ?id123%0ascriptalert(1)/script3. 本地测试与验证环境搭建为了深入理解这一技术我们搭建一个本地测试环境?php // test.php header(Content-Type: text/plain); $input $_GET[input] ?? ; echo 原始输入: . urlencode($input) . \n; echo 字符串长度: . strlen($input) . \n; if (preg_match(/^23333$/, $input)) { echo 正则匹配成功\n; if ($input ! 23333) { echo 且不全等于23333\n; echo 绕过成功\n; } } // 输出每个字符的ASCII码 echo 字符分析:\n; for ($i 0; $i strlen($input); $i) { printf(位置 %d: %02X\n, $i, ord($input[$i])); }测试方法http://localhost/test.php?input23333%0a输出结果将显示字符串长度为65个数字1个换行符正则匹配成功不全等于23333最后一个字符为0A换行符的ASCII码4. 防御方案与最佳实践了解攻击手段后我们更需要知道如何防御。以下是几种有效的防护策略严格模式修饰符preg_match(/^23333$/D, $input); // 使用D修饰符强制$仅匹配字符串末尾字符串全等比较if ($input 23333) { ... }输入净化处理$clean str_replace([\r, \n], , $input);多维度验证组合if (preg_match(/^23333$/D, $input) strlen($input) 5 ctype_digit($input)) { // 安全处理 }提示在安全敏感的验证场景中建议采用深度防御策略结合多种验证方式而非依赖单一检查点。5. 相关CTF题目扩展除了MRCTF2020这类绕过技巧在其他CTF比赛中也频繁出现BUUCTF 2021 - 简单正则考察点preg_match的多行模式绕过关键payloaddataabc%0a123XCTF 2020 - Regex Master要求绕过/^[a-z0-9]$/i的限制执行命令解法cmdid%0a--Real World CTF - 安全检测场景WAF的正则过滤绕过技巧利用换行符分割恶意负载这些题目都验证了一个核心理念理解底层原理比记忆payload更重要。在CTF赛题设计上出题人常常会基于这些基础技巧进行变形和组合考验选手的灵活应用能力。掌握正则表达式绕过技术不仅对CTF比赛有帮助在实际的代码审计和渗透测试工作中这些知识同样能发挥重要作用。建议读者在理解本文内容后尝试在CTF靶场或实验环境中亲自实践加深对PHP正则引擎行为的理解。