记一次简单的HTTP绕WAF

news2024/11/24 22:57:29

0X01 基础知识

关于WAF的问题?

它是我们日常攻防演练必会遇见的,在IOS七层模型中,WAF分为网络层、应用层的,当然还有云 WAF(CDN+WAF)这新型类场景的。不同环境下我们绕过WAF的思路也是有所区别的,例如,对于传统的网络层 WAF,采用chunked编码(即对内容进行所谓的"加密")即可绕过,下次遇见的时候,我们仍然尝试在网络层这一类型上进行尝试和探索。

存在于应用层的WAF,它们的处理引擎是经过前端到达Apache(或者是Nginx)完成 HTTP协议初步解析后,再转交给引擎处理的,这个时候网络层的绕过技术是无效的。这就需要我们去研究:对于一个 HTTP 请求,Nginx 解析了什么内容?交给后面的 PHP、ASP 又解析了什么内容?(探究到这个深度,就需要有良好的编程基础和协议基础,否则,后面及其吃力)。

至于最后的云WAF,我们可以简单的看成CDN加上软件WAF的结合体,既可以抗住DDos攻击,也可以过滤出部分简单的Payload攻击代码,甚至对流量也有一定的清洗作用。

HTTP首部的利用方式?

HTTP 请求头Content-Type的charset编码可以指定内容编码,在国内大多数都是UTF-8编码,但是攻击者在攻击的时候可以替换为 ibm037、 ibm500、cp875等不常用的"偏门"编码来绕过WAF的检测。我们也可以通过设置Content-Type头的值为application/x-www-form或者multipart/form-data;charset=ibm500,boundary=blah等进行绕过。

0X02 首字部Encoding

关于Encoding,整个名称应该为Accept-Encoding;它在http协议中的作用是可以对内容(也就是body部分)进行编码。Accept-Encoding: gzip:表示它可以采用gzip这样的编码,从而达到压缩的目的。这样的话关于网络层的WAF是可以被绕过的,当然我们也可以使用其他的编码把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。当服务端接收到请求,并且从Header里拿到编码标识时,就可以选择其中一种方式来进行编码压缩,然后返给客户端。

浏览器发给服务器,声明浏览器(客户端)支持的编码类型解释

Accept-Encoding设置在请求头当中,会告诉服务器,我可以接受哪种编码压缩

Content-Encoding设置在响应头中,会告诉客户端,我用的是哪种编码压缩

小提示Encoding的大概意思是:决定文件接收方将以什么形式、什么编码读取这个文件,指定服务器响应的 HTTP 内容类型;这两个header头都会影响服务器对于数据内容的传输格式类型(压缩算法);

小提示:Accept-Encoding: deflate但发现这种方法已经过时了,我们可以换成Accept-Encoding: gzip,发现上传成功。

【一一帮助安全学习,所有资源获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部教程

加密绕过

image.png

分块传输绕过

如果在HTTP首字部中加入Transfer-Encoding: chunked。我们就可以利用这个报文采用了分块编码的方式绕过应用层面的WAF。原因的这时是通过POST请求报文中的数据部分,并对数据进行分块传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束(同时末尾需要以两个换行结束)。
image.png

小提示:上传失败的原因是没有分好考块,这种可以在绕过SQL注入或者XSS的时候进行尝试,不建议和上图一样对图片马进行尝试(关键是不好分块,效率低下)。

0X03 首字部Pipeline

众所周知,HTTP协议是由TCP协议封装而来,当浏览器发起一个HTTP请求时,浏览器先与服务器通过TCP协议建立连接,然后发送HTTP 数据包给它,但是这里包含了一个Connection的字段,正常情况下该段的值为close。而且Apache等Web容器会根据这个字段决定是保持该 TCP 连接或是断开。当发送的内容太大,超过一个 HTTP 包容量,需要分多次发送时,值会变成keep-alive,即本次发起的 HTTP 请求所建立的TCP连接不断开,直到所发送内容结束Connection为close时停止。
image.png

0X04 首字部Disposition

Content-Disposition的具体原理:它是WAF的一个规则,针对文件上传主要是对那个地方去做防护的,所以需要混淆去绕过!!!

由于该协议对 PHP 对解析存在缺陷、使得如果一行有多个 filename 字段值,则PHP构造的Web Server会取最后的filename值进行解析。Web Server最终可以得到的文件名是1.php,但是某些WAF只会判新第一个filename的值,因此 WAF 对上传的文件的过滤检测功能会被黑客绕过,并且这里的form-data是可有可无的类型,就是去掉它也不会影响Web Server获取filename的名称(如下所示):

Content-Disposition: form-data; name="file1"; filename="1.txt";filename="1.php";

虽是如此,但filename的编码还会被HTTP请求Content-Type头中charset所影响;Web Server可以根据这个值进行响应的解码处理。这些都有可能被一些人稍微做点手脚,便可以绕过不少WAF的文件上传过滤检测。可能有的师傅会说,那怎么测试啊?这个其实就见仁见智了,我通常会自己搭建一个环境进行Fuzzing字典的黑盒测试;如果是代码审计和CTF功底好的师傅,可能就直接测试一些漏洞点了。所以,这方面大家可以多看看其他师傅写的文章,平时多学习多做笔记。
image.png

0X05 首字部Typer

Content-Type:一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

特殊编码绕过

HTTP头里的Content-Type请求头一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。当 WAF 没有规则匹配该协议传输的数据时则可被绕过。

利用特殊编码对payload进行转义,从而绕过WAF对特殊关键词的过滤。该方法的思路主要围绕: multipart/form-data进行,主要针对于 POST 参数的,对于需要在GET参数位置触发的恶意漏洞影响不大。说起multipart/form-data 的作用,我们知道HTTP 协议POST请求,除了常规的 application/x-www-form-urlencoded 以外,还有 multipart/form-data 这种形式,就是为了解决上传文件场景的问题下文件内容较大且内置字符不可控的问题而准备的。multipart/form-data 格式也是可以传递POST参数的。对于Nginx+PHP的架构,Nginx 实际上是不负责解析 multipart/form-data 的 body 部分的,而是交由 PHP 来解析,因此 WAF 所获取的内容就很有可能与后端的 PHP 发生不一致。

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

<?php
//用于将文件的内容读入到一个字符串中
echo file_get_contents("php://input");
//打印显示,一个变量的内容与结构
var_dump($_POST);
//打印显示,一个变量的类型的信息
var_dump($_FILES);
?>

双写上传描述行绕过

image.png

双写整个Part开头绕过

image.png

构造假的Part绕过

image.png

双写Boundary绕过

image.png

构造空Boundary绕过

image.png

构造空格+Boundary绕过

image.png

双写Content-Type绕过

image.png

Boundary+逗号绕过

image.png

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

0X06 首字部Filename

截断Filename绕过

首先将原始的带有脏数据的 payload 转换成文件上传包格式的协议:multipart/form-data,然后进行截断,如下图所示:
image.png

以上环境并未演示到另外一种基于 HTTP 协议特性绕过 WAF 的方法(实际上是基于 “协议未覆盖绕过” 方法,属于它的升级改造版)——filename 文件名混淆绕过。下面直接看漏洞银行大佬在视频中的实战利用演示。

空格+filename绕过

为了让 Payload 能够顺利解析,可以在 fliename="1.jpg"的等号前面添加空格,让 fliename 文件名无法解析,从而使得后面的php参数可被服务器解析执行,最终达到绕过 WAF 同时执行 pqyload 注入的目的:
image.png

双引号+filename绕过

另外此处也可以在 filename 前方添加双引号,也可以实现上述执行 payload 的目的:
image.png

0X07 小结

通过上述学习,我们知道了关于HTTP首字部的一些知识点,进而通过利用该首字部的特点进行Fuzzing,最终达到绕过WAF的目的。当然上述结论难免存在不足,希望师傅们斧正。经过这几天的资料查找,我发现这些东西在CTF领域的研究,以及达到了登峰造极的地步。而且我们真正的去理解这些东西,可能需要掌握好一门语言和对HTTP协议有所了解(导致我的解释可能过于牵强dog),希望大家不要介意!

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

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

相关文章

mybatis单框架通用mapper使用(二)

mybatis单框架通用mapper使用(二) 1 查询 1.1 简单查询 1.1.1 查多条 a 用法 接口引用.select(实体类对象引用); //里面实体类对象,里面不为null值的部分就会作为条件被查询,多个条件使用and进行拼接起来 //传入为null就是查询全部的值b 测试代码 Testpublic void t2(){Sq…

直播带货系统源码,居家“神器”不出门就能购物

如今&#xff0c;直播带货的火爆程度已经超出了人们的想象。线下销售行业的卖家也开启了直播带货模式&#xff0c;直播带货的的火爆归根到底还是消费者的购物方式发生的变化。从传统的线下购物到电商购物&#xff0c;再到今天的直接直播带货。从各大数据可以总结&#xff0c;消…

应用密码学期末速通复习

文章目录模运算分数求模负数求模gcd最大公约数逆元分组密码DES加密AES加密操作模式ECB电子密码本CBC分组链接CFB密码反馈OFB输出反馈序列密码A5-1算法RC4算法Hash函数Md5算法SHA-1算法消息认证数字信封公钥密码背包公钥算法RSA公钥算法Rabin公钥算法ElGamal公钥算法ECC公钥算法…

C/C++刷题DAY2

1.第一题 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a;对于此题&#xff0c;我们使用双指针的方式去写它&#xff0c;需要注意空间复杂度是O&#xff08;1&#xff09;&#xff0c;时间复杂度也是尽量的越低越好&#xff0c;要去需要原地修改数组&a…

Matplotlib设置刻度和刻度标签

Matplotlib在我们之前的所有例子中都自动接管了轴上间隔点的任务。Matplotlib的默认刻度定位器和格式化器在很多常见情况下通常都足够了。可以明确提及刻度线的位置和标签以满足特定要求。 xticks()和yticks()函数将列表对象作为参数。列表中的元素表示将显示刻度的相应操作的位…

nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇

文章目录前言一、对上一篇博文的分析二、配置文件分析1. nginx 官方网址&#xff08;很详细&#xff09;2、配置文件&#xff08;全&#xff09;3、配置文件&#xff08;去掉注释&#xff09;4、讲解a、nginx 配置文件有三部分组成b、全局块c、events块d、http块5、http块中loc…

无脚本自动化测试

在当今的企业环境中&#xff0c;软件测试不再被视为不必要的投资&#xff1b;相反&#xff0c;它已经上升到一种需要而不是奢侈品的水平。随着市场的不断变化和竞争的加剧&#xff0c;企业必须做一些让他们与竞争对手区分开来的事情。 为了使自己与众不同&#xff0c;公司必须…

Dockerfile

Dockerfile指令集 对于Dockerfiel而言&#xff0c;是在学习docker工具里面&#xff0c;最重点的内容&#xff0c;它可以帮助我们生成自己想要的基础镜像。部署一个容器最重要的就是镜像&#xff0c;指令都已经内置好了。 FROM 这个镜像的妈妈是谁&#xff1f;&a…

数据结构每日亿题(四)

复制带随机指针的链表 原题传送门&#xff1a;力扣 题目&#xff1a; 这题的大概意思就是&#xff1a; 有这样一个链表&#xff0c;他比普通的链表多一个成员变量&#xff1a;random指针&#xff0c;这个random指针指向的是这个链表中随机一个地方&#xff0c;这个地方是其它节…

NetSim网络仿真使用及静态路由配置

&#x1f370; 个人主页:__Aurora__ &#x1f35e;如果文章有什么需要改进的地方还请各位大佬指正。 &#x1f349;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ NetSim网络仿真使用及静态路由配置。 实验要求及其步骤 使用Boson N…

Java面试笔记:Java线程安全的集合类有哪些?线程不安全的集合类有哪些?ArrayList为什么会发生并发修改异常?

一、Java的集合类有哪些&#xff1f; 二、如何定义集合是线程不安全的&#xff1f; 当多个并发同时对线程不安全的集合进行增删改的时候会破坏这些集合的数据完整性&#xff0c;例如&#xff1a;当多个线程访问同一个集合或Map时&#xff0c;如果有超过一个线程修改了A…

3A企业认定有哪些好处?

企业参与申报和认证有什么益处&#xff1f;这个问题可能应该是广大企业参与前最为关心的问题之一了 1、可快速有效提升企业资质、获得国家政府的认可&#xff1b;并将获得由商务部颁发的具有统一编号的牌匾和证书。 2、是企业履约能力、投标信誉、综合实力与竞争力的体现&…

数学建模--优化类模型

目录 一、根据目标函数约束条件类型分类 1、线性规划 ①线性规划模型的一般形式 ​②用MATLAB优化工具箱解线性规划 ③模型分析 2、非线性规划 ①非线性规划的基本概念 ②非线性规划的基本解法 ③二次规划 ④一般非线性规划 二、控制变量类型分类 1、整数规划 …

总结线程安全问题的原因和解决方案

一. 线程安全问题 概念 首先, 线程安全的意思就是在多线程各种随机调度的情况下, 代码不出现 bug 的情况. 如果在多线程调度的情况下, 出现 bug, 那么就是线程不安全. 二. 观察线程不安全的情况 下面我们用多线程来累加一个数, 观察线程不安全的情况: 用两个线程, 每个线程…

树--堆和优先权队列

数据结构中的堆和栈与操作系统内存划分中的堆和栈没有关系 一、堆的定义 一个大小为n的堆是一棵包含n个结点的完全二叉树&#xff0c;其根节点称为堆顶。 根据堆中亲子结点的大小关系&#xff0c;分为大堆和小堆&#xff1a; &#xff08;1&#xff09;最小堆&#xff1a;树中…

高斯原型网络原论文高质量翻译

论文地址&#xff1a;Gaussian Prototypical Networks for Few-Shot Learning on Omniglot 文章目录摘要1 引言1.1 Few-shot learning1.2 高斯原型网络2 相关工作3 方法3.1 编码器3.2 偶发性训练3.3 定义一个类3.4 评估模型4 数据集5 实验5.1 协方差估计的用法6 结论摘要 我们…

万字长文解读计算机视觉中的注意力机制(附论文和代码链接)

文中论文和代码已经整理&#xff0c;如果需要&#xff0c;点击下方公众号关注&#xff0c;领取&#xff0c;持续传达瓜货 所向披靡的张大刀 注意力机制是机器学习中嵌入的一个网络结构&#xff0c;主要用来学习输入数据对输出数据贡献&#xff1b;注意力机制在NLP和CV中均有使…

目标检测算法——YOLOv5/YOLOv7改进之结合无参注意力SimAM

目录 &#xff08;一&#xff09;前言介绍 1.摘要 2.不同注意力步骤比较 &#xff08;二&#xff09;相关实验 &#xff08;三&#xff09;YOLOv5结合无参注意力SimAM 1.配置.yaml文件 2.配置common.py 3.修改yolo.py SimAM&#xff1a;无参数Attention助力分类/检测/分…

点云应用——三维空间边界点排序+机器人轨迹引导(1)

三维空间边界点排序机器人轨迹引导一、前言二、思路一&#xff1a;利用重建思路三、思路二&#xff1a;利用PCL边界提取方法三维空间点排序四、后续一、前言 最近做了点云边界提取、并实时发送至机器人进行引导的研究&#xff0c;主要遇到了两个问题&#xff1a; 1&#xff09;…

Python画爱心——一颗会跳动的爱心~

节日就快到来了&#xff0c;给你的Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧&#xff0c;利用Python制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心&#xff0c;从里到外形成一个立体状&#xff0c;给人视觉上的冲击感&#xff01;浪漫极了↓ 微信扫码添加&a…