“有限状态自动机”,其拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行
哪个状态的迁移。
而常见的正则引擎,又被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)。
他们匹配输入的过程分别是:
DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移
状态,直到匹配不上或走完整个输入
NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不
上,则进行回溯,尝试其他状态
由于NFA的执行过程存在回溯,所以其性能会劣于DFA,但它支持更多功能。大多数程序语言都使用了
NFA作为正则引擎,其中也包括PHP使用的PCRE库。
\d就是数字概括字符集 \d
\D非数字 \D
\d也可以用字符集表示[0-9]
\D也可以用字符集表示[^0-9]
\w表示字母数字,也就是单词字符
\w字符集表示[A-Za-z0-9_]
\W匹配非单词字符\n\t\r#$%^空格
\s匹配\n\t\r空格 匹配空白字符 不包括%$#特殊字符
\S匹配非空白字符
. 表示匹配除换行符\n以外的所有字符
{m} :匹配m次 次
{m,n} :至少m ,至多n次
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ..
引用前面的分组括号中的模式所匹配字符,而非模式本身
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\2 表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
& 表示前面的分组中所有字符**
^ : 行首
• $ : 行尾
• <, \b : 语首
• >, \b : 语尾
• 分组:()
• 后向引用:\1, \2, …
直接注入语句
?id=-1’ union select 1,(select user()),3–+
但是如果继续注入是不可以的,因为我们对于传来的语句进行了正则过滤
当我们继续注入
为此我们找到了一个方法,利用科学计数法进行绕过
?id=-1’ union select 1,group_concat(username,0x3a,password),1e1from users–+
目标实现输入匹配字符
符合内容有数字,字母大小写与特殊字符,并且所有字符总数控制在8-16
正则测试网站:https://regex101.com/
首先匹配数字,字母大小写,特殊符号
^ $
开头 结尾
首先!is_array判断是否为数组,不是则判断能不能经过正则匹配,如果不能满足这个函数则去进行strpos()判断,成功则获得flag
定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos() 函数对大小写敏感。
注释:该函数是二进制安全的。
如果满足第一个判断就不能满足第二个,所以我们通过php的正则回溯上限绕过,在PHP中有1000000次的回溯次数限制。在PHP中利用的正则表达式的.*是匹配任意字符任意次数
贪婪模式:贪婪模式下会直接匹配所有字符,然后从最后一个字符向前回溯,直到匹配成功