HTTP绕WAF之浅尝辄止

news2025/1/19 14:13:40

0X00前言

最近参加重保,和同事闲聊时间,谈起来了外网,彼时信心满满,好歹我也是学了几年,会不少的。结果,扭头看完do9gy师傅的《腾讯 WAF
挑战赛回忆录》,就啪啪打脸了。说来惭愧,最近一段时间,拿到offer就开始飘起来了,现在悔不当初,于是就想写一篇关于这篇Http首部字段文章的"训诂篇"出来,一来当做知识巩固,二来算是完善些和首部字段相关的知识点(可会因为见识不足,导致遗漏)。毕竟,小白可能这方面了解不多,只了解Cookie和Agent这种常见类型的首部字段,却很少听过Accept-
Encoding和Content-Encoding这类不太常用的首字部。

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,发现上传成功。

加密绕过

1667308600_63611c38329ce40150a1f.png!small?1667308599245

分块传输绕过

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

1667308631_63611c5782aac5723cc7b.png!small?1667308630632

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

0X03首字部Pipeline

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

1667308978_63611db2b83522be735ef.png!small?1667308978523

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功底好的师傅,可能就直接测试一些漏洞点了。所以,这方面大家可以多看看,其他师傅写的文章,平时多学习多做笔记了。

1667308665_63611c7989dcfea1dd1ea.png!small?1667308664776

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);  
?>

双写上传描述行绕过

1667308846_63611d2e0c4434a472b81.png!small?1667308845115

双写整个Part开头绕过

1667308860_63611d3c703aaff2ca521.png!small?1667308859736

构造假的Part绕过1667308876_63611d4c69085eb7b3d53.png!small?1667308875464

双写Boundary绕过1667308886_63611d5695958664d9a00.png!small?1667308885770

构造空Boundary绕过1667308897_63611d618f8c34ffa268c.png!small?1667308896552

构造空格+Boundary绕过1667308907_63611d6bef7f4188df51b.png!small?1667308907139

双写Content-

Type绕过1667308915_63611d73dc89795e6a9e4.png!small?1667308915139

Boundary+逗号绕过1667308921_63611d79c0bc91cbc33bf.png!small?1667308920836

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

0X06首字部Filename

截断Filename绕过

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

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

空格+filename绕过

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

双引号+filename绕过

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

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

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

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

相关文章

【数据结构(5)】2.3 线性表的类型定义

文章目录1. 线性表的抽象数据类型定义2. 线性表的基本操作1. 线性表的抽象数据类型定义 数据对象&#xff1a;就是一些元素&#xff0c;元素的个数大于等于 0。数据关系&#xff1a;ai-1 是 ai 的前驱&#xff0c;同时 ai 是 ai-1 的后继&#xff0c;他们都属于集合 D 2. 线性…

1月的碎碎念,但是很有必要

从今年开始每个月会整理一个我生活的琐碎但觉得有必要的事&#xff0c;一来方便年底回顾&#xff0c;二来也希望这些事情对大家有也有些参考。 不高大上&#xff0c;但是希望某一天再看到的时候会觉得充满趣味。1.新的1年的1月开始了&#xff0c;想了很多计划&#xff0c;搬新办…

rocketmq源码-consumerQueue和indexFile文件写入

前言 在rocketmq的文件中&#xff0c;除了commitLog文件&#xff0c;还有两个重要的文件&#xff0c;分别是indexFile文件和consumerQueue文件&#xff0c;这篇笔记主要记录这两个文件的数据是怎么写进去的 consumeQueue文件中对应topic下的一个queue&#xff0c;在consumeQue…

ubuntu22.04安装kalibr

前言 首先ros1目前目前在ubuntu支持的最高版本是20.04。当时我是在ubuntu22.04上编译安装的ros1。过程也十分坎坷&#xff0c;手动下载了很多包&#xff0c;具体就不累赘了。 再者目前网上的资料也都是kalibrros1, 所以推荐安装ros1之后再来安装kalibr。其次这次安装主要 参考…

关于splitChunks的一次原理探索

前言 前端时间在做项目加载优化时用到了splitChunks自动拆包&#xff0c;后了解了一下原理写下了此文。 Modules和Chunks Modules简单来理解就是我们写的功能模块&#xff0c;不管是CommonJS还是ESM都算是一个Module&#xff0c;而Chunks则是webpack根据我们的规则/默认规则…

spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

目录 前言&#xff1a; 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseResult 3.4ResponseStatus 3.5RsaUtils 四.UserDetailServiceImpl 五.成功处理器 六.SecurityConfig 七. filter 前言&#xff1a; 前后…

多个路由器的局域网终端设备的资源访问

多个路由器之间资源的访问 本质是将路由设备放置到一个网段 中继路由 中继的路由可以看作是另一个路由中的一个终端设备&#xff0c;只是为了延长传递wifi&#xff0c;在使用ipcofig中的网关和主路由的网关一样&#xff0c;一般都是主路由的IP。 无线桥接的中继路由 无论是…

车-电-路网时空分布负荷预测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用c语言连接mysql数据库并且批量插入数据

​ 使用从c连接数据库需要在本机安装数据库&#xff0c;或者拿到数据库所在主机的IP地址。先说明我使用的是mysql8.0 64位的数据库&#xff0c;使用的vs是vs2019。 1.配置环境 首先打开vs2019&#xff0c;创建一个空项目&#xff0c;让后右击下图所示位置&#xff0c;然…

网络编程套接字之UDP

文章目录一、网络编程二、UDP数据报套接字编程DatagramSocketDatagramPacket实现客户端服务器程序EchoServer客户端一、网络编程 我们网络编程的核心: Socket API&#xff0c;操作系统为我们应用程序提供的API&#xff0c;我们的Socket是和传输层密切相关的。 我们传输层为我…

SpringBoot+Vue+Wx健康上报系统

简介&#xff1a;本项目采用了基本的springbootvueWx设计健康上报系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx健康上报系统源码作者LHL项目类型Java EE项目 &#xff08;前…

多线程初阶——线程状态

多线程初阶——线程状态 文章目录多线程初阶——线程状态1.Thread类及常见构造方法2.Thread常见的方法3.线程相关的重要操作3.1启动线程—start()3.2中断线程3.3 等待线程— join()3.4 获取线程引用3.5休眠线程—sleep()4.线程的状态1.Thread类及常见构造方法 方法说明Thread(…

前端js实现根据文件url批量压缩下载成zip包

前言 项目开发中&#xff0c;产品经理提了这样一个需求&#xff1a;将系统中的附件实现批量打包下载功能。本来系统中是有单个下载及批量下载功能&#xff0c;现在应业务方的需求&#xff0c;需要多加个批量打包下载。 初步设想是&#xff1a;由后端编写接口实现。但后来经过思…

从事测试开发8年,聊聊我是怎么从0基础到年薪40万的

本人从事测试开发8年多&#xff0c;之前在猪场工作&#xff0c;年薪突破40W&#xff0c;算是一个生活过得去的码农。&#xff08;仅代表本人&#xff09;目前从事软件测试行业的薪资待遇还是很不错的&#xff0c;所以如果朋友们真的对软件测试感兴趣的话可以坚持学下去&#xf…

Java native agent学习笔记-从加载到log4j漏洞检测

记录一下java native agent的学习过程,也顺便造一个检测log4j漏洞的轮子: java native agent相比java agent最大的好处是快,C写的,快的一笔,但是最大的坏处是非常麻烦,毕竟你拿个面过程的语言怼面对象的肯定是比较麻烦的。 本次学习的目的是做个加载器,动态加载agent,然后再实…

研究人员发布 VMware vRealize Log RCE 漏洞,立即打补丁

Horizon3 攻击团队的安全研究人员将于下周发布一个针对漏洞链的漏洞利用程序&#xff0c;以在未打补丁的 VMware vRealize Log Insight 设备上获得远程代码执行。 vRealize Log Insight 现在称为 VMware Aria Operations for Logs&#xff0c;它使 VMware 管理员可以更轻松地分…

每日学术速递2.4

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG、cs.AI 1.Neuro Symbolic Continual Learning: Knowledge, Reasoning Shortcuts and Concept Rehearsal 标题&#xff1a;神经象征性的持续学习&#xff1a;知识、推理捷径和概念排练…

必须掌握的网络安全知识

没有网络安全&#xff0c;就没有国家安全。网络安全和保密防护&#xff0c;是机关单位日常工作中不可忽视的重要问题。尤其在涉密单位工作的人员&#xff0c;因工作性质特殊&#xff0c;不仅要了解非涉密网络的安全操作常识&#xff0c;更要重点了解涉密网络的规范行为要点&…

2021年上半年信息系统项目管理师真题与答案完整版(综合知识、案例分析、论文)

1、 国家信息化体系包括六个要素&#xff0c;其中&#xff08;&#xff09;是信息化体系六要素中的龙头&#xff0c;是国家信息化建设的主阵地&#xff0c;集中体现了国家信息化建设的需求和效益。A、信息资源 B、信息技术应用 C、信息网络 D、信息化政策法规和标准规范0参考答…

若依代码生成器------数据库篇

继上一篇《若依代码自动生成器研究-表查询篇》&#xff0c;我们继续来学习若依系统中的代码生成逻辑。 导入表之Sql查询 在菜单栏点击“代码生成”&#xff0c;在右侧栏中点击“导入”按钮&#xff0c;在文章若依中的代码自动生成器研究-表查询篇中&#xff0c;我们已经一直…