Skip to content

Latest commit

 

History

History
217 lines (97 loc) · 5.02 KB

[回忆飘如雪]-2021-8-24-Java反序列化数据绕WAF之延时分块传输.md

File metadata and controls

217 lines (97 loc) · 5.02 KB

Java反序列化数据绕WAF之延时分块传输

回忆飘如雪

回忆飘如雪

微信号 gh_31665e4938a5

功能介绍 记录工作生活所思所想


__

收录于话题

编者荐语:

本文首发奇安信攻防社区 https://forum.butian.net/share/427

以下文章来源于补天平台 ,作者c0ny1

补天平台 补天平台

补天漏洞响应平台旨在建立企业与白帽子之间的桥梁,帮助企业建立SRC(安全应急响应中心),让企业更安全,让白帽子获益。

** 0x01 **

背景

**
**

**
**

chunked-coding-converter 在0.2.1以及之前版本是不支持对二进制数据进行分块的。这个问题实验室的darkr4y师傅今年3月份的时候就已经反馈了多次,由于懒癌在身一直没有更新。直到我自己遇到一个站点,反序列化带大量脏数据没有绕成功,于是又想起了分块传输。花了一点时间让插件支持了二进制数据,然而这样依然被拦截了!

这也在意料之中,分块传输被公开已经有两年之久,很多WAF已经支持检测。那有没有办法让这个姿势重振往日雄风呢?

** 0x02 **

延时分块

通过测试,WAF一般是如下应对分块传输的。

1. 发现数据包是分块传输,启动分块传输线程进行接收

2. 分块传输线程不断接收客户端传来的分块,直到接收到0\r\n\r\n

3. 将所有分块合并,并检测合并之后的内容。

当时和darkr4y师傅交流时,我们曾做过一个设想, 在上一块传输完成后,sleep一段时间,再发送下一块。 目的是在2阶段延长WAF分块传输线程的等待时间,消耗WAF性能。这时有没有可能WAF为自身性能和为业务让步考虑,而放弃等待所有分块发送完呢? **** 。这次正好遇到适合的环境来验证一下想法。

当然了,我们块与块之间发送的间隔时间必须要小于后端中间件的post timeout,Tomcat默认是20s,weblogic是30s。

** 0x03 **

编码实现

为了加大WAF的识别难度,我们可以考虑以下3点。

1. 延时时间随机化

2. 分块长度随机化

3. 垃圾注释内容与长度随机化[可选]

首先我们需要对原始request header进行处理。需要把Content-Length删除,分块传输不需要发送body长度,然后加上Transfer- Encoding: chunked头。

其实调用HttpURLConnection.setChunkedStreamingMode(int chunkedLen)就可以实现分块发包。不过这个接口只能设置固定分块长度,而且无法直接控制分块时间间隔。于是我打算用socket来模拟发送http/https分块传输包,这样要灵活的多。以下是实现的简化代码。

为了方便日后使用,我给chunked-coding-converter插件添加了sleep chunked sender,并添加很多细节功能,比如预估分块数量范围和延时范围,显示每一块发送的内容,长度,延时时间以及发送状态等等。

这里我直接使用最新版本,将被拦截的数据分成218块,共延时1分46秒发送,最终成功绕过WAF。

**0x04 **

一些零碎

**
**

**
**

最后列一点边边角角的东西,当餐后” 甜点“,需要请自取。

1. 只有HTTP/1.1支持分块传输

2. POST包都支持分块,不局限仅仅于反序列化和上传包

3. Transfer-Encoding: chunked大小写不敏感

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读原文

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

Java反序列化数据绕WAF之延时分块传输

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

微信扫一扫
使用小程序


取消 允许


取消 允许

知道了

长按识别前往小程序