高级JavaScript注入技术
字数 1728 2025-08-27 12:33:48

高级JavaScript注入技术详解

1. 基本概念

JavaScript注入是一种XSS攻击技术,攻击者通过在网页中注入恶意JavaScript代码来执行未经授权的操作。当网站未对用户输入进行适当过滤时,这种攻击就可能发生。

1.1 简单注入示例

最基本的JavaScript注入形式包括:

  • '-alert(1)-'
  • \'-alert(1)//

这些简单的payload在脚本块内触发输入反射时,通常无需HTML注入就能使易受攻击的页面弹出警报框。

2. 复杂场景下的JS注入

当注入点位于复杂的JS代码结构中时(如函数内部、条件语句内部或嵌套结构中),简单的注入技术可能不再有效。

2.1 示例场景分析

以提供的测试页面为例:

https://brutelogic.com.br/tests/jsfix.php?keyword=xss

在这个场景中:

  1. 注入点位于JS代码中间(keyword=aaaaa
  2. 双引号前的反斜杠会被转义

2.2 初始尝试

Payload 1: " - confirm 1 - "

问题:双引号前的反斜杠被转义,导致payload无法正确执行。

解决方案:在第一个引号前添加反斜杠来"实现对转义的转义",并注释掉其余代码。

Payload 2: \" - confirm 1 //

这个payload在用户交互(改变页面上的select元素)时有效,但有以下限制:

  • 并非在所有情况下都可用
  • 需要用户交互

3. 高级注入技术

3.1 基本思路

  1. "括住"所有嵌套的函数/条件
  2. 插入自定义代码(如confirm 1``)
  3. 修复剩余代码中的语法问题

3.2 逐步构建payload

初始尝试
\" }})}) - confirm 1 //

这个payload只完成了一半工作,浏览器控制台的错误信息可以指导后续调整。

3.3 处理双重反射

当存在双重反射时,可以通过:

  1. 在第一个反射中打开注释
  2. 在第二个反射中关闭注释

JS多行注释使用/**/

Payload 3: \" }})}) - confirm 1 /* /

3.4 解决后续语法问题

  1. 添加分号结束语句
  2. 添加//注释掉行尾

Payload 4: \" }})}) - confirm 1 ; /*/ //

  1. 添加{来修复挂起的语法结构

Payload 5: \" }})}) - confirm 1 ;{ /*/ //

  1. 添加({来匹配语法顺序

Payload 6: \" }})}) - confirm 1 ;({{ /*/ //

  1. 添加if ()修复语法

Payload 7: \" }})}) - confirm 1 ;({ if (){ /*/ //

  1. 添加另一个({结构

Payload 8: \" }})}) - confirm 1 ;({({ if (){ /*/ //

  1. 添加function()修复新问题

Payload 9: \" }})}) - confirm 1 ;( function (){({ if (){ /*/ //

4. 优化最终payload

通过简化语法结构可以得到更简洁的payload:

  1. 删除分号(虽然会抛出错误但仍可执行)
  2. if()替换为标签b:
  3. function()替换为箭头函数a=>

最终Payload:
\" }})}) - confirm 1 ( a =>{({ b : { /*/ //

5. 关键要点总结

  1. 理解上下文:分析注入点所处的JS代码结构(函数、条件语句等)
  2. 逐步构建:从简单payload开始,根据错误信息逐步调整
  3. 注释技巧:利用/* */处理双重反射和多行代码
  4. 语法修复:通过添加匹配的结构修复JS语法错误
  5. 简化优化:最终payload可以通过替换语法结构来精简

6. 防御建议

  1. 对用户输入进行严格的过滤和转义
  2. 使用CSP(内容安全策略)限制脚本执行
  3. 避免将用户输入直接嵌入到JS代码中
  4. 使用现代前端框架的安全实践
  5. 定期进行安全审计和渗透测试

通过理解这些高级JS注入技术,安全研究人员可以更好地识别和修复此类漏洞,而开发人员则可以采取更有效的防御措施。

高级JavaScript注入技术详解 1. 基本概念 JavaScript注入是一种XSS攻击技术,攻击者通过在网页中注入恶意JavaScript代码来执行未经授权的操作。当网站未对用户输入进行适当过滤时,这种攻击就可能发生。 1.1 简单注入示例 最基本的JavaScript注入形式包括: '-alert(1)-' \'-alert(1)// 这些简单的payload在脚本块内触发输入反射时,通常无需HTML注入就能使易受攻击的页面弹出警报框。 2. 复杂场景下的JS注入 当注入点位于复杂的JS代码结构中时(如函数内部、条件语句内部或嵌套结构中),简单的注入技术可能不再有效。 2.1 示例场景分析 以提供的测试页面为例: 在这个场景中: 注入点位于JS代码中间( keyword=aaaaa ) 双引号前的反斜杠会被转义 2.2 初始尝试 Payload 1 : " - confirm 1 - " 问题:双引号前的反斜杠被转义,导致payload无法正确执行。 解决方案 :在第一个引号前添加反斜杠来"实现对转义的转义",并注释掉其余代码。 Payload 2 : \" - confirm 1 // 这个payload在用户交互(改变页面上的select元素)时有效,但有以下限制: 并非在所有情况下都可用 需要用户交互 3. 高级注入技术 3.1 基本思路 "括住"所有嵌套的函数/条件 插入自定义代码(如 confirm 1 `` ) 修复剩余代码中的语法问题 3.2 逐步构建payload 初始尝试 : \" }})}) - confirm 1 // 这个payload只完成了一半工作,浏览器控制台的错误信息可以指导后续调整。 3.3 处理双重反射 当存在双重反射时,可以通过: 在第一个反射中打开注释 在第二个反射中关闭注释 JS多行注释使用 /* 和 */ 。 Payload 3 : \" }})}) - confirm 1 /* / 3.4 解决后续语法问题 添加分号结束语句 添加 // 注释掉行尾 Payload 4 : \" }})}) - confirm 1 ; /*/ // 添加 { 来修复挂起的语法结构 Payload 5 : \" }})}) - confirm 1 ;{ /*/ // 添加 ({ 来匹配语法顺序 Payload 6 : \" }})}) - confirm 1 ;({{ /*/ // 添加 if () 修复语法 Payload 7 : \" }})}) - confirm 1 ;({ if (){ /*/ // 添加另一个 ({ 结构 Payload 8 : \" }})}) - confirm 1 ;({({ if (){ /*/ // 添加 function() 修复新问题 Payload 9 : \" }})}) - confirm 1 ;( function (){({ if (){ /*/ // 4. 优化最终payload 通过简化语法结构可以得到更简洁的payload: 删除分号(虽然会抛出错误但仍可执行) 将 if() 替换为标签 b: 将 function() 替换为箭头函数 a=> 最终Payload : \" }})}) - confirm 1 ( a =>{({ b : { /*/ // 5. 关键要点总结 理解上下文 :分析注入点所处的JS代码结构(函数、条件语句等) 逐步构建 :从简单payload开始,根据错误信息逐步调整 注释技巧 :利用 /* */ 处理双重反射和多行代码 语法修复 :通过添加匹配的结构修复JS语法错误 简化优化 :最终payload可以通过替换语法结构来精简 6. 防御建议 对用户输入进行严格的过滤和转义 使用CSP(内容安全策略)限制脚本执行 避免将用户输入直接嵌入到JS代码中 使用现代前端框架的安全实践 定期进行安全审计和渗透测试 通过理解这些高级JS注入技术,安全研究人员可以更好地识别和修复此类漏洞,而开发人员则可以采取更有效的防御措施。