从业者-操纵WebSocket握手以利用漏洞
# 实验室:操纵WebSocket握手以利用漏洞
# 题目
这个在线商店有一个使用 WebSockets 实现的实时聊天功能。
它具有一个激进但存在缺陷的 XSS 过滤器。
若要解决实验室问题,请使用 WebSocket 消息在支持代理的浏览器中执行alert()
并弹出窗口。
提示
- 如果你正在努力绕过 XSS 过滤器,请尝试我们的XSS实验室 (opens new window)。
- 有时候,你可以使用像
X-Forwarded-For
这样的 HTTP 标头来绕过基于 IP 的限制。
- name: 实验室-从业者
desc: 操纵WebSocket握手以利用漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/websockets/lab-manipulating-handshake-to-exploit-vulnerabilities
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
先启用 BurpSuite 代理,然后再点击 “Live chat” 进入聊天室。
进入聊天室后,成功捕获到了 WebSockets 握手请求以及该连接内的消息。
发送一条聊天消息。
捕获成功。
将刚刚的消息转发至 Repeater 功能模块。
和上个实验室一样,尝试在消息中注入 XSS 载荷。
发送请求后,服务端没有返回响应消息。而且 “Send” 按钮变成灰色了,说明当前 WebSockets 连接已断开。
回到网页,刷新一下看看。好家伙,IP 地址已经被列入黑名单。
正如题目中所说的那样,“激进” 的 XSS 过滤器......
但题目中也给出了提示,这个过滤器存在缺陷,可以通过X-Forwarded-For
标头来绕过这种 IP 限制。
# 重发WebSockets握手请求
那么对于 Repeater 中已经断开连接的 WebSockets 请求,该如何实现重发呢?
BurpSuite 很贴心,点击上方的 “Reconnect” 按钮。
点击按钮之后,会弹出一个重新连接的对话框。你可以编辑请求参数,然后重新发送用于 WebSockets 握手的 HTTP 请求,如果握手成功,则会建立一个新的 WebSockets 消息连接。
我们在新的握手请求中加上X-Forwarded-For
标头,随意指定一个 IP 地址。然后点击 “Connect” 进行连接。
成功握手并建立新的连接,我们可以继续发送 WebSockets 消息。
经过测试,每当你发送一次 XSS 载荷时,你当前的 IP 地址就会被封禁,这时候你需要重新 “Reconnect”。
一些被禁止的字符:
检测到攻击:事件
onerror
...
检测到攻击:JavaScript
<script>
javascript
alert(
...
...
2
3
4
5
6
7
8
9
10
11
每次被禁,都需要在握手请求中更换标头的 IP 地址。
# 绕过过滤器
经过一段时间的测试,我发现可以通过 “大小写” 的方式来绕过 XSS 过滤器:
<Img Src=1 Onerror=Alert(5)>
尴尬的是,虽然 HTML 标签和属性不区分大小写,但 JavaScript 是区分大小写的。Alert()
是无法使用的。
然后我再次进行了测试,发现可以通过两种方式避开对alert(
字符的过滤。
# 解决方案1
第一种方式:
<Img Src=1 Onerror=abc=alert;abc(5)>
将alert
函数赋值给另一个变量abc
,然后通过变量abc
来执行弹框操作。
完美!
# 解决方案2
第二种方式:
<Img Src=1 Onerror=alert(6)>
HTML 中的 ASCII 编码,将字符a
编码为a
。
一样完美!
不管使用以上哪种方式,都可以完成实验。
# 解决方案3(答案)
这是答案提供的解决方案,通过反引号来代替括号,这同样可以正确执行函数。
(我明明会的,我咋没想到)
<Img Src=1 Onerror=alert`1`>