第一部分:正则表达式和回溯基础
1、正则表达式概述 正则表达式是一种用于匹配字符串模式的工具。其在文本搜索、数据验证等方面具有强大的应用。在匹配的过程中,会使用有限状态自动机的概念,包括确定性有限状态自动机(DFA)和非确定性有限状态自动机(NFA)。
2、回溯的过程 正则引擎使用回溯来尝试所有可能的匹配方式,以找到一个满足条件的匹配结果。回溯的过程可能会在某些情况下引发性能问题,并且还有可能被攻击者利用来绕过安全限制。
3、PHP的pcre.backtrack_limit限制 PHP中的pcre.backtrack_limit参数用于限制正则引擎的回溯次数,以防止由于恶意构造的输入导致性能问题。然而,攻击者可以利用此特性来绕过某些安全限制,例如在某些情况下,让服务器消耗过多的时间来进行正则匹配。
第二部分:实战案例分析
例题一:绕过正则限制
1、回溯绕过步骤 在这个例子中,我们假设有一个正则表达式:/^(a+)+$/,它在一般情况下可以用来匹配连续的字母"a"。然而,由于回溯限制,它不能匹配过多的"a"。攻击者可以构造一个字符串,使得由于回溯次数过多,服务器会消耗过多的时间。
2、攻击者的思路和解决方案 攻击者可以构造字符串如:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!",通过这个字符串,攻击者可以让服务器在尝试匹配时陷入大量的回溯,从而导致服务器响应变慢甚至崩溃。为了解决这个问题,服务器应该设置合理的pcre.backtrack_limit值,同时避免在正则表达式中使用容易导致回溯的模式。
$pattern = '/^(a+)+$/';
$input = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!';
if (preg_match($pattern, $input)) {
echo "匹配成功!";
} else {
echo "无法匹配。";
}