高级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
在这个场景中:
- 注入点位于JS代码中间(
keyword=aaaaa) - 双引号前的反斜杠会被转义
2.2 初始尝试
Payload 1: " - confirm 1 - "
问题:双引号前的反斜杠被转义,导致payload无法正确执行。
解决方案:在第一个引号前添加反斜杠来"实现对转义的转义",并注释掉其余代码。
Payload 2: \" - confirm 1 //
这个payload在用户交互(改变页面上的select元素)时有效,但有以下限制:
- 并非在所有情况下都可用
- 需要用户交互
3. 高级注入技术
3.1 基本思路
- "括住"所有嵌套的函数/条件
- 插入自定义代码(如
confirm1``) - 修复剩余代码中的语法问题
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注入技术,安全研究人员可以更好地识别和修复此类漏洞,而开发人员则可以采取更有效的防御措施。