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

漏洞利用链

完整的利用链如下:

  1. StringSubstitutor#replace
  2. StringSubstitutor#substitute
  3. StringSubstitutor#resolveVariable
  4. ScriptStringLookup#lookup

前置知识

JavaScript脚本引擎执行代码

Java可以通过ScriptEngine执行JavaScript代码:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.eval("java.lang.Runtime.getRuntime().exec(\"calc\")");

这段代码可以弹出计算器,展示了Java中执行系统命令的基本方法。

漏洞详细分析

字符串插值处理流程

  1. StringSubstitutor#replace:

    • 入口函数,开始处理包含插值表达式的字符串
  2. StringSubstitutor#substitute:

    • 处理字符串中的变量替换
    • 识别${}格式的表达式
  3. StringSubstitutor#resolveVariable:

    • 解析变量名
    • 提取${}中间的内容
    • 这部分逻辑与Log4j漏洞非常相似

关键触发点

当处理类似${script:javascript:java.lang.Runtime.getRuntime().exec("calc")}的字符串时:

  1. 系统会匹配第一个:前的字符串(script),然后从stringLookupMap中获取对应的lookup处理器(这里是ScriptStringLookup)

  2. 剩余部分(javascript:java.lang.Runtime.getRuntime().exec("calc"))会传入ScriptStringLookup#lookup方法

  3. ScriptStringLookup#lookup会根据:分割字符串并执行相应的脚本

漏洞利用方式

攻击者可以构造如下形式的字符串实现RCE:

${script:javascript:java.lang.Runtime.getRuntime().exec("恶意命令")}

其他潜在利用方式

除了script外,Commons Text还提供了其他可能被利用的lookup:

  1. URL:

    • 可以用于URLClassLoader加载远程代码
    • 虽然文章提到没有实例化URLClassLoader,但仍可能用于探测
  2. DNS:

    • 主要用于信息探测
    • 相关方法:
      • inetAddress.getHostAddress() - 获取IP地址
      • inetAddress.getHostName() - 获取主机名
      • inetAddress.getCanonicalHostName() - 获取规范主机名

漏洞修复

修复措施包括:

  1. InterpolatorStringLookup#lookup中缩短了stringLookupMap
  2. 删除了危险的lookup key:
    • script (脚本执行)
    • dns (DNS查询)
    • url (URL处理)

防御建议

  1. 升级到Apache Commons Text最新版本
  2. 禁用或限制字符串插值功能
  3. 对用户输入进行严格过滤,特别是包含${的字符串
  4. 使用安全策略限制脚本引擎的执行权限

总结

Apache Commons Text漏洞展示了字符串插值功能可能带来的安全风险,与Log4j漏洞类似。理解其利用链有助于开发者更好地防范此类漏洞,同时也提醒我们在使用类似功能时需要格外谨慎。

Apache Commons Text 漏洞分析与利用教学文档 漏洞概述 Apache Commons Text 在1.9.x及以下版本中存在远程代码执行漏洞,类似于著名的Log4j漏洞(CVE-2021-44228)。该漏洞允许攻击者通过构造特定的字符串,利用字符串插值功能执行任意代码。 影响版本 Apache Commons Text <= 1.9.x 漏洞利用链 完整的利用链如下: StringSubstitutor#replace StringSubstitutor#substitute StringSubstitutor#resolveVariable ScriptStringLookup#lookup 前置知识 JavaScript脚本引擎执行代码 Java可以通过ScriptEngine执行JavaScript代码: 这段代码可以弹出计算器,展示了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 外,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漏洞类似。理解其利用链有助于开发者更好地防范此类漏洞,同时也提醒我们在使用类似功能时需要格外谨慎。