长亭WAF绕过测试

news2024/9/22 20:30:58

本文的Bypass WAF 的核心思想在于,一些 WAF 产品处于降低误报考虑,对用户上传文件的内

容不做匹配,直接放行

0、环境

环境:两台服务器,一台配置宝塔面板,一台配置长亭雷池WAF

思路主要围绕:multipart/form-data,也就是主要针对于 POST 参数,对于漏洞点在 GET 参数位置则用处不大。

我们知道,HTTP 协议 POST 请求,除了常规的application/x-www-form-urlencoded以外,还有multipart/form-data这种形式,主要是为了解决上传文件场景下文件内容较大且内置字符不可控的问题。multipart/form-data格式也是可以传递 POST 参数的。对于 Nginx+PHP 的架构,Nginx 实际上是不负责解析multipart/form-data的body部分的,而是交由 PHP 来解析,因此 WAF 所获取的内容就很有可能与后端的 PHP 发生不一致。

1、multipart/form-data特性

以 PHP 为例,我们写一个简单的测试脚本:

<?php
echo "POST Content:\n";
echo file_get_contents("php://input");

echo "\n\n";
echo "\$_POST Content:  \n";
var_dump($_POST);

echo "\n\n";
echo "\$_FILES Content: \n";
var_dump($_FILES);
?>

先使用BP来进行一些测试,以便了解一些特性

这是在Content_Type:application/x-www-form-urlencoded情况下的一个request和response

然后,在观察一下Content-Type:multipart/form-data的情况:

参数并没有进入$_FILES 数组,而是进入了$_POST 数组。

可以发现将Content-Type改成传输文件,并且在没有filename参数的情况下,我们是可以将文件内容传输为POST参数的。而正常情况下,传输文件还需要有一个filename参数,有了个参数,才会将文件内容装载成文件

那么,何时是上传文件?何时是 POST 参数呢?这个关键点在于有没有一个完整的 filename=。这 9 个字符是经过反复测试的,缺一个字符不可,替换一个字符也不可,在其中添加一个字符更不可。

加上了 filename=以后的效果:

Bypass WAF 的核心思想在于,一些 WAF 产品处理降低误报考虑,对用户上传文件的内容不做匹配,直接放行。事实上,这些内容在绝大多数场景也无法引起攻击。但关键问题在于,WAF 能否准确有效识别出哪些内容是传给$_POST 数组的,哪些传给$_FILES 数组?如果不能,那我们是否就可以想办法让 WAF 以为我们是在上传文件,而实际上却是在 POST 一个参数,这个参数可以是命令注入、SQL 注入、SSRF 等任意的一种攻击,这样就实现了通用 WAF Bypass。

小结:通过上传文件时,不使用filename=,来使文件内容传递给$_POST数组,通过这样就可以达到POST传参并且不会绕过WAF的目的

2、基础绕过

可以看到当我们进行sql注入时,是会对我们进行阻拦的

可以考虑某些绕过去进行单一规则绕过,但是进行到下一条语句时,很有可能需要重新去尝试绕过的规则。所以我们可以想象通用性绕过。

那么利用multipart/form-data的特性来绕过,但是发现WAF还是检测到了。

尝试一下其他方法

0x00截断filename

在 filename 前加入了 0x00,因为有些 WAF 在检测前会删除 HTTP 协议中的 0x00、空格,这样就导致了 WAF 认为是含有 filename 的普通上传,而后端 PHP 则认为是 POST 参数。空格也可以试试

但是在长亭的雷池WAF中并没有绕过

双写上传描述行

双写描述行后,一些 WAF 会取第二行,而实际 PHP 会获取第一行。

在没有\t,00,20的破坏下,WAF取第二行,而PHP取第一行

可以看到使用双写描述行的方法成功绕过了WAF

双写整个 part 开头部分

原理与双写上传描述行类似,但是可惜的是并没有绕过

但是当两个part头中的空格去除时,就能成功

个人理解为有空格的情况下,那么这两个part头是分开的个体,而当空格去除时,这两个part头就合成一个part头了,只是它们的赋值语句重复了,那么就取决于赋值语句的选取第一个还是第二个

需要注意的是,如果双写part头能成功,那么就需要考虑它的一些垃圾数据的影响,因为该参数会引入一些垃圾数据,在命令注入及 SQL 注入的攻击场景,需要尽可能将前面的内容闭合。

构造假的 part 部分 1

原理都是相似的

可以看到POST内容的开始是由--a决定的,而结束是由--a--决定的,那么是否可以构造两个开始来影响WAF的决定呢?

通过测试可以发现雷池WAF取得是第二个,还是覆盖那一套。而php则是取得第一个

当然,php取得第一个开始,那么第二个开始是会成为垃圾数据,所以需要注意引号的闭合

构造假的 part 部分 2

与构造part部分1相比缺少了一个空行,但是我觉得这还是将两个开始合成一个开始,考虑的是对于语句的复写选择,但相比于构造1的好处是数据会纯净许多

两个 boundary

写两个boundary,思路是考虑WAF与PHP后端的选择差异

测试发现,PHP后端选择的是第一个boundary,那么思考的点就是WAF的取值是否是第二个

很遗憾,WAF的取值貌似也是第一个,并不能绕过。

有一点疑惑是PHP取得是第一个boundary,即a,那么WAF不管取得是第一个还是第二个,它的参数应该是都含有-1' union select user(),database()#这个危险语句的。只是取一个是该语句,而取第二个只是包含该语句。因此在我看来这个方法无论如何都是无法成功

解决了,第二个boundary是具有filename的,也就是如果WAF取第二个那就不会检测内容

两个 Content-Type

与两个boundary类似,使用了两个Conten-Type

可以看到PHP取得还是第一个并且WAF也是第一个,所以没有成功

空 boundary

也就是说boundary并不设值,而结束符是分号;,那么是否可以引起歧义。因为作为最后一个

参数,它有没有分号都是不影响的。

这边的原理是让WAF认为boundary为分号,而PHP是将boundary认为是空

很遗憾,并没有成功

空格 boundary

原理与空boundary类似,想让WAF认为是空

但是也没有成功

boundary 中的逗号

boundary遇到逗号,结束,同理是否可以让WAF认为是a,b

或者以逗号,,来让WAF认为分界为逗号,,而实际是空值

失败

3、进阶绕过

0x00截断进阶

从前面可知,0x00对于一些WAF来说可能会先删除在检测,而PHP又是自动选择第一行,所以在基础的0x00截断中并没有成功将filename=截断

进阶的内容就是,当我们在适当的地方加入0x00、空格和\t后,就会破坏第一行,让PHP反以第二行为主

这三个位置为首选:替换成0x00、0x20同理

此外还有:

最容易被忽视的是参数名中的 0x00

由此测试还有一个十分鸡肋的方式,用处不大,但有意思。只有当网站获取全部 POST 数组

后以参数前缀来取值的场景才可利用,因为参数名后缀部分不可控。

在三个首选位置中,最后一个位置成功了

boundary 进阶

boundary 的名称是可以前后加入任意内容的,WAF 如果严格按 boundary 去取,又要上当了。

通过空格去破坏Content-Type,使PHP取第二个,WAF取一个。但是比较吃Nginx的版本

很可惜的是WAF并没有取后面的b

单双引号混合进阶

通过不规范的单双引号破坏,使PHP取第二个,WAF取第一个

WAF也取了第二个,失败

urlencoded 伪装成为 multipart

这个 poc 很特殊。实际上是 urlencoded,但是伪装成了 multipart,通过&来截取前后装饰部分,保留 id 参数的完整性。理论上 multipart/form-data 下的内容不进行 urldecoded,一些 WAF 也正是这样设计的,这样做本没有问题,但是如果是 urlencoded 格式的内容,不进行 url 解码就会引入%0a 这样字符,而这样的字符不解码是可以直接绕过防护规则的,从而导致了绕过。

也就是说,它想要通过urlencoded去传递参数,而传递的这三个参数构成了form-data的一个样子

由于版本限制,并不能直接按照上图做

猜测它的想法应该是想要利用WAF自动去补齐,然后去第二个Content-Type,那我直接补齐试试

很遗憾没有成功。

4、高阶绕过

skip_upload 进阶 1

在 PHP 中,实际上是有一个 skip_upload 来控制上传行是否为上传文件的。来看这样一个例子:

前面内容中我们介绍了,如果在第一行的 Content-Disposition 位置添加\0,是有可能引起第一行失效,从而从上传文件变为 POST 参数的。

除此以外,我们来看一下php源码 php-5.3.3/main/rfc1867.c,其中 line: 991 有这样一段内容

if (!skip_upload) {
 char *tmp = param;
 long c = 0;
 while (*tmp) {
   if (*tmp == '[') {
     c++;
   } else if (*tmp == ']') {
     c--;
     if (tmp[1] && tmp[1] != '[') {
       skip_upload = 1;
       break;
     }
   }
   if (c < 0) {
     skip_upload = 1;
     break;
   }
 tmp++; }
}

其中的 param 参数是 name="f" 也就是 id 这个参数,那么请问,如何能让它 skip_upload

呢?

没错,一些理解代码含义的同学应该已经有答案了。通过想办法进入 c < 0,c 原本是0,遇到[就自增 1,遇到]就减一。那么,我们构造 name="f]" 即可让 c=-1 。

事实上,只要参数中有不成对匹配的左右中括号都可以引发 skip_upload。

但是长亭WAF还是没有绕过

skip_upload 进阶 2

在 php 源码 rfc1867.c line 909

/* If file_uploads=off, skip the file part */
if (!PG(file_uploads)) {
skip_upload = 1;
} else if (upload_cnt <= 0) {
skip_upload = 1;
sapi_module.sapi_error(E_WARNING, "Maximum number of allowable file uploads has been exceeded");
}

Maximum number of allowable file uploads has been exceeded ,已超过允许的最大文件上传数

如何达到 Maximum?发现在 php 5.2.12 和以上的版本,有一个隐藏的文件上传限制是在 php.ini 里没有的,就是这个 max_file_uploads 的设定,该默认值是 20, 在 php 5.2.17 的版本中该值已不再隐藏。

文件上传限制最大默认设为 20,所以一次上传最大就是 20 个文档,所以超出 20 个就会出错了。即skip_upload

那么:

看看是否能绕过,还是失败了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…

20240922 每日AI必读资讯

OpenAI 首席科学家 MIT演讲&#xff01; - 揭示 o1模型训练核心秘密&#xff1a; 通过激励模型学习是培养 AGI 系统通用技能的最佳方式。 - 提出了类比“教人钓鱼”的方式&#xff0c;强调激励学习的重要性&#xff1a;“授人以鱼&#xff0c;不如授人以渔”&#xff0c;但是…

机器视觉OpenCV

1. 环境配置 1.1 安装Python https://www.python.org/downloads/windows/ python-3.9.13-amd64 pip下载加速&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com1.2 安装Ope…

串口RS232,485

RS232和RS485都是串口通信的变种 TTL 串口的波特率/频率&#xff1a;9600&#xff0c;115200等&#xff0c;表示在1s内&#xff0c;串口可以传输9600个高低电平 那串口通信时&#xff0c;高低电压的范围&#xff1a;TTL电平 TTL 的电平标准&#xff0c;理想状态下&#xff0…

通信工程学习:什么是NFV网络功能虚拟化

NFV&#xff1a;网络功能虚拟化 NFV&#xff08;Network Function Virtualization&#xff09;&#xff0c;即网络功能虚拟化&#xff0c;是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构&#xff0c;将传统的网络硬件设备如路由器、交换机、防火墙、负载…

SOMEIP_ETS_123: SD_Length_of_Entry_Array_longer_than_message_allows

测试目的&#xff1a; 验证DUT能够拒绝一个条目数组长度超出消息总长度的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个条目数组长度超出消息总长度的SubscribeEventgroup…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653&#xff1a;两数之和IV - 输入二叉搜索树 1.1 题目&#xff1a; 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 true。 示例 1&#xff1a; 输入: root [5,3,6,2,4,null,7…

【Python从入门到进阶】65、Pandas如何批量拆分与合并Excel文件

接上篇《64、Pandas如何实现数据的Concat合并》 上一篇我们学习了Pandas如何实现数据的Concat合并&#xff0c;本篇我们来继续学习Pandas如何批量拆分与合并Excel文件。 一、引言 在当今数据驱动的时代&#xff0c;Excel文件作为数据处理和分析的基石&#xff0c;扮演着不可或…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

SpringBoot 3.4.0还没来之前,又又又更新啦!SpringBoot 3.3.4版本依赖升级,性能与稳定性再提升!

为什么要使用SpringBoot在现代开发中&#xff0c;高效与灵活性是每个开发团队追求的核心目标。然而&#xff0c;如何在不牺牲灵活性的前提下&#xff0c;快速构建复杂的应用程序&#xff0c;常常成为开发者的难题。SpringBoot的出现&#xff0c;正是为了解决这个矛盾。它以“约…

【Linux】【Hadoop】大数据基础实验一

实验一&#xff1a;熟悉常用的Linux操作和Hadoop操作 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验平台 操作系统…

从 Affine Particle-In-Cell (APIC) 到 Material Point Method (MPM 物质点法)

APIC与MPM Particle-In-Cell (PIC)Affine Particle-In-Cell (APIC)Material Point Method (MPM)关于边界投影等额外操作 Material Point Method (MPM 物质点法)是一种混合欧拉-拉格朗日视角物理仿真方法。 欧拉视角即网格视角&#xff0c;将空间划分为网格&#xff0c;通过表示…

【永磁同步电机(PMSM)】 5. PMSM 的仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 5. PMSM 的仿真模型 1. 基于 Simulink 的仿真模型1.1 PMSM 的数学模型1.2 Simulink 仿真模型1.3 模块封装&#xff08;mask&#xff09;1.4 三相PMSM矢量控制仿真模型 2. Simscape 的 PMSM 模块2.1 PMSM 模块的配置2.2 PMSM 模块…

秃头篇——二叉树进阶算法题

一、根据二叉树创建字符串 题目&#xff1a; 思路&#xff1a;这个题很明显需要我们采用二叉树的递归实现&#xff08;前序遍历&#xff09;&#xff0c;但有一个注意的点&#xff1a;空括号能不能省略的问题&#xff0c;其实我们发现只要左为空&#xff0c;右不为空不能省略括…

[JavaEE] 网络初识(网络通信 及 TCP / UDP / IP 封装分用 )

Author&#xff1a;MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 文章目录 目录 文章目录 一. 网络通信基础 1. 局域网LAN 2. ⼴域⽹WAN 3. IP地址 4. 端口号 二.协议 1. 五元组 2. 协议分层 协议分层的优点: 3. OSI七层协…

OJ在线评测系统 后端开发数据库初始化工作 开发库表 建立数据库索引 Mybatis映射初始化接口开发

后端接口开发库表设计 项目主业务流程的开发 1.用户模块 注册&#xff08;后端已实现&#xff09; 登录&#xff08;后端已实现 前端已实现&#xff09; 2.题目模块 创建题目&#xff08;管理员&#xff09; 删除题目&#xff08;管理员&#xff09; 修改题目&#xff0…

基于SpringBoot+Vue+MySQL的校园一卡通系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的快速发展&#xff0c;校园一卡通已成为大学生活中不可或缺的一部分。它不仅承载着校园消费的功能&#xff0c;还集成了学生身份证明、图书馆借阅、门禁系统等多种服务。然而&#xff0c;传统的一卡通管理系统往往…

阿里HPN-用于大型语言模型训练的数据中心网络

阿里巴巴HPN:用于大型语言模型训练的数据中心网络 探索大规模语言模型训练新方法&#xff1a;阿里巴巴HPN数据中心网络论文。 摘要 本文介绍了阿里云用于大型语言模型(LLM)训练的数据中心网络HPN。由于LLM和一般云计算之间的差异(例如&#xff0c;在流量模式和容错性方面)&…

【机器学习】12-决策树1——概念、特征选择

机器学习10-决策树1 学习样本的特征&#xff0c;将样本划分到不同的类别&#xff08;分类问题&#xff09;或预测连续的数值&#xff08;回归问题&#xff09;。 选择特征&#xff0c;划分数据集&#xff0c;划分完成形成模型&#xff08;树结构&#xff09;&#xff0c;一个…