最近参加羊城杯,遇到了一道题本来的思路是绕过preg_match()函数读取secret.php文件,然后从secret.php中给的函数构造pop链使用反序列化的知识点进行命令执行,从而得到flag

但是问题是第一步就出现了问题,绕过preg_match()就绕不过去记录一下:
我搜索到的常用的绕过方法有:
1.数组绕过,即传入的参数为数组

源代码如下:

preg_match()绕过的问题总结_换行符

 

 

 效果:
preg_match()绕过的问题总结_php_02

 

 

成功绕过preg_match()

2.利用PCRE回溯次数限制绕过

源代码:

 

 preg_match()绕过的问题总结_函数返回_03

如何绕过呢,让回溯次数超过最大限制就可以使preg_match()函数返回false,从而绕过限制,中文的回溯次数在100万次就会崩溃,这个回溯保护使PHP为了防止关于正则表达式的DDOS

结果:

POC:

preg_match()绕过的问题总结_数组_04

 

 preg_match()绕过的问题总结_正则表达式_05

 

 

成功绕过了preg_match()

3.换行符绕过
.不会匹配换行符

源代码:

preg_match()绕过的问题总结_数组_06

 

结果:
preg_match()绕过的问题总结_正则表达式_07

 

 成功绕过,Hacking attempt detected<br/><br/>没有输出