Apache Commons Text
字数 1519 2025-08-26 22:11:35
Apache Commons Text 漏洞分析与利用教学文档
漏洞概述
Apache Commons Text 在1.9.x及以下版本中存在远程代码执行漏洞,类似于著名的Log4j漏洞(CVE-2021-44228)。该漏洞允许攻击者通过构造特定的字符串,利用字符串插值功能执行任意代码。
影响版本
- Apache Commons Text <= 1.9.x
漏洞利用链
完整的利用链如下:
StringSubstitutor#replaceStringSubstitutor#substituteStringSubstitutor#resolveVariableScriptStringLookup#lookup
前置知识
JavaScript脚本引擎执行代码
Java可以通过ScriptEngine执行JavaScript代码:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.eval("java.lang.Runtime.getRuntime().exec(\"calc\")");
这段代码可以弹出计算器,展示了Java中执行系统命令的基本方法。
漏洞详细分析
字符串插值处理流程
-
StringSubstitutor#replace:
- 入口函数,开始处理包含插值表达式的字符串
-
StringSubstitutor#substitute:
- 处理字符串中的变量替换
- 识别
${}格式的表达式
-
StringSubstitutor#resolveVariable:
- 解析变量名
- 提取
${}中间的内容 - 这部分逻辑与Log4j漏洞非常相似
关键触发点
当处理类似${script:javascript:java.lang.Runtime.getRuntime().exec("calc")}的字符串时:
-
系统会匹配第一个
:前的字符串(script),然后从stringLookupMap中获取对应的lookup处理器(这里是ScriptStringLookup) -
剩余部分(
javascript:java.lang.Runtime.getRuntime().exec("calc"))会传入ScriptStringLookup#lookup方法 -
ScriptStringLookup#lookup会根据:分割字符串并执行相应的脚本
漏洞利用方式
攻击者可以构造如下形式的字符串实现RCE:
${script:javascript:java.lang.Runtime.getRuntime().exec("恶意命令")}
其他潜在利用方式
除了script外,Commons Text还提供了其他可能被利用的lookup:
-
URL:
- 可以用于URLClassLoader加载远程代码
- 虽然文章提到没有实例化URLClassLoader,但仍可能用于探测
-
DNS:
- 主要用于信息探测
- 相关方法:
inetAddress.getHostAddress()- 获取IP地址inetAddress.getHostName()- 获取主机名inetAddress.getCanonicalHostName()- 获取规范主机名
漏洞修复
修复措施包括:
- 在
InterpolatorStringLookup#lookup中缩短了stringLookupMap - 删除了危险的lookup key:
script(脚本执行)dns(DNS查询)url(URL处理)
防御建议
- 升级到Apache Commons Text最新版本
- 禁用或限制字符串插值功能
- 对用户输入进行严格过滤,特别是包含
${的字符串 - 使用安全策略限制脚本引擎的执行权限
总结
Apache Commons Text漏洞展示了字符串插值功能可能带来的安全风险,与Log4j漏洞类似。理解其利用链有助于开发者更好地防范此类漏洞,同时也提醒我们在使用类似功能时需要格外谨慎。