关于发布的CVE-2013-2251漏洞,strust远程代码执行漏洞

(*该漏洞影响版本:Struts 2.0.0 – Struts 2.3.15)

(*该博客仅仅只是记录我工作学习时遇到的问题,仅供参考!)

(*如果,描述中可能存在错误,请多指教!)

在昨天在对我目前负责的那个项目进行日常维护的时候,系统被别人攻克,上传了一个.txt文件,他人可以直接访问这个项目下txt文件,就可以获取到txt文件内的内容。

首先,介绍下我目前维护的项目,使用的是strust2.1+hibernate3.0架构模式,也就是javaweb+SSH框架,不过为了简化,并没有添加spring框架。也并没有使用现在的springMVC模式!

至于数据库,运用的是Mysql,因为mysql的轻便,深受国内用户的喜好!服务器,使用的是tomcat,也没什么好介绍的!

接下来,我先演示我所负责的项目,是如何被攻克的!

首先,打开strust漏洞监测工具:将我目前项目网址放在action框中:

如下:

一般,使用SSH框架,都是由通过strust.xml文件定义的action进行控制,然后进行,验证,如果验证通过,会跳转到success.jsp,如果没有通过验证,则会回退到login.jsp。

当然,通过这个检测工具可以看到,我所负责的项目,存在strust2远程代码执行漏洞,编号S-016!

这里我上传一个test文件,结尾是.txt文件的后缀名。然后点击上传:

等工具提示上传成功之后,在访问该目录下的test.txt文件,就可以显示到这个

当时遇到这个问题,顿时头都大了,前段时间,我和别人讨论过php通过上传文件漏洞,上传一个被截断的.JPG格式的木马,获取服务器权限的一个例子。

后来我上网查了下资料,原来这个漏洞,早已在2013年7月份,就公布出来,该漏洞具体情况如下:

Bugtraq ID:61189
CVE ID:CVE-2013-2251
CNCVE ID:CNCVE-20132251

漏洞发布时间:2013-07-16
漏洞更新时间:2013-07-16

漏洞起因
输入验证错误
危险等级
高

影响系统
Apache Struts 2.0.0-2.3.15

不受影响系统

危害
远程攻击者利用漏洞以应用程序上下文执行任意代码。
CVSSv2:

攻击所需条件
攻击者必须访问Struts应用。

漏洞信息
Apache Struts框架是一个基于Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web应用框架的开源项目。
Apache Struts 2 DefaultActionMapper在处理短路径重定向参数前缀"action:"/"redirect:"/"redirectAction:"时存在命令执行漏洞,由于对"action:"/"redirect:"/"redirectAction:"后的URL信息使用OGNL表达式处理,远程攻击者可以利用漏洞提交特殊URL可用于执行任意Java代码。

测试方法
1,简单表达式
http://host/struts2-blank/example/X.action?action:%25{3*4}
http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}
2,命令执行
http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command‘,‘goes‘,‘here‘})).start()}
http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command‘,‘goes‘,‘here‘})).start()}
http://host/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command‘,‘goes‘,‘here‘})).start()}
安全建议

厂商解决方案
Apache Struts 2.3.15.1已经修复此漏洞,建议用户下载更新:
http://struts.apache.org/

漏洞提供者
Takeshi Terada of Mitsui Bussan Secure Directions, Inc.

漏洞消息链接
http://struts.apache.org/release/2.3.x/docs/s2-016.html
http://struts.apache.org/release/2.3.x/docs/version-notes-23151.html
http://packetstormsecurity.com/files/122442/Apache-Struts-2-Open-Redirection-Command-Execution.html
文章来源:http://www.venustech.com.cn/

当然,解决办法,也很简单,要么打补丁,要么提升strust的版本,当然,这两种方法带来的工作量都是很大的,不是那么容易去做,再说以我目前的技术,很难快速的把这个问题解决掉!

后来,我发现,该漏洞是通过访问上传的文件,其后缀名是.txt,格式,如果我不让他访问这个文件,是不是可以解决掉这个问题,只要通过strust拦截器进行拦截就好。(当然,该项目中也是加入了拦截器,但是该拦截器只是拦截.jsp格式的文件,并没有将其他格式的文件,进行拦截!)

当 有了这个想法之后,接下来的一切都好解决了,对项目拦截器,进行优化就好!

首先,贴上我原本没有优化的web.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>WebJourManage</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
    <welcome-file>login.htm</welcome-file>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>loginauth</filter-name>
    <filter-class>LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginauth</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
</web-app>

可以看到,在这一块代码中,我只进行了对.jsp文件的拦截,并没有对其他文件进行拦截验证:

  <filter>
    <filter-name>loginauth</filter-name>
    <filter-class>LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginauth</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

至于在LoginFilter.class中,我是这样写的:

package Filter;

import javax.servlet.Filter;
 import java.io.IOException;

 import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter
{
         public void init(FilterConfig filterConfig) throws ServletException {
                 // TODO Auto-generated method stub

         }
         public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
                          HttpServletRequest servletRequest = (HttpServletRequest) request;
                          HttpServletResponse servletResponse = (HttpServletResponse) response;
                          HttpSession session = servletRequest.getSession();

                          String path = servletRequest.getRequestURI();

                          String empId = (String) session.getAttribute("username");
                          if(path.indexOf("/login.jsp") > -1) {
                              chain.doFilter(servletRequest, servletResponse);
                             return;
                          }

                          if (empId == null || "".equals(empId)) {
                             servletResponse.sendRedirect("/login.jsp");
                          } else {
                             chain.doFilter(request, response);
                         }

                     }

                      @Override
                      public void destroy() {
                         // TODO Auto-generated method stub

                      }

}

这个文件会回去session中的username,即登录的用户名,如果该用户名不存在,就是跳转到login.jsp上,如果存在。(该功能就是为了验证用户是否登录。)

接下来就是在web.xml中,将

  <filter>
    <filter-name>loginauth</filter-name>
    <filter-class>LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginauth</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

这段代码改成

  <filter>
    <filter-name>loginauth</filter-name>
    <filter-class>LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginauth</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>

其中:

<url-pattern>*</url-pattern>

这一块,是对所有文件进行验证!不过这样写后,还是有个问题,就是当你登录完成之后,会跳转到login.action。该login.action也被拦截,然后跳转到login.jsp上!

后来,我看了下LoginFilter.class的代码,发现这一块。

     if(path.indexOf("/login.jsp") > -1) {
         chain.doFilter(servletRequest, servletResponse);
        return;
     }

当页面为login.jsp时候,会执行:chain.doFilter(servletRequest, servletResponse);

只要在这里对login.action加入到判断语句中,就可以避免这个问题,代码如下:

     if(path.indexOf("/login.jsp") > -1||path.indexOf("/login.action") > -1) {
         chain.doFilter(servletRequest, servletResponse);
        return;
     }

就这样,问题结局了,但是该漏洞还在,文件依旧可以上传,但是如果没有登录,在访问上传的那个文件,会发现会直接跳转到login.jsp上。

总结:虽然这并不是一个很好解决这个问题的方法,但是使用访问地址重新定向到login.jsp,用一种很简单的方式,避免了服务器 提权的问题!

时间: 2025-01-02 22:08:02

关于发布的CVE-2013-2251漏洞,strust远程代码执行漏洞的相关文章

隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)

Preface 这几天关于Office的一个远程代码执行漏洞很流行,昨天也有朋友发了相关信息,于是想复现一下看看,复现过程也比较简单,主要是简单记录下. 利用脚本Github传送地址 ,后面的参考链接都有成功的比较详细的案例了. 主要是要用到如图中的两个脚本,example文件夹中有个doc,应该直接打开就能弹计算器了. 复现过程 国外最先发布的poc地址:https://github.com/embedi/CVE-2017-11882 这里我们使用的是Ridter师傅改进过的脚本:https:

[EXP]CVE-2019-0604微软SharePoint远程代码执行漏洞利用

研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这句话后,才发这现里的字全是都乱的. 剑桥大学的研究结果,当单词的字母顺序颠倒时,你仍旧可以明白整个单词的意思.其中重要的是:只要单词的第一个字母和最后一个子字母位置正确即可.其他的可以是完全的乱码,你仍旧可以清楚的完全没有问题的阅读.原因是因为人脑在认知单词的过程中不是依靠辨识字母的顺序,而是从整体来看.同理,汉字的阅读也会受到大脑先入为主的分析.如果你所看到的句子在大脑中事先有过印象,那么你就能顺利的将它读出.如果句子是大脑之前没有处理过的

Linux内核竞争条件漏洞-导致远程代码执行

导读 *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能受到一个内核竞争条件漏洞的影响,并导致系统无法抵御远程网络攻击.潜在的攻击者可以利用Linux内核中net/rds/tcp.c的rds_tcp_kill_sock TCP/IP实现缺陷,从而触发设备的拒绝服务(DoS)状态,并在受影响的设备上实现远程代码执行.攻击者可以通过特制的TCP数据包对存在漏

Office CVE-2017-8570远程代码执行漏洞复现

实验环境 操作机:Kali Linux IP:172.16.11.2 目标机:windows7 x64 IP:172.16.12.2 实验目的 掌握漏洞的利用方法 实验工具 Metaspliot:它是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计,Web应用程序扫描,社会工程,团队合作. 实验内容 Office CVE-2017-8570 CVE-2017-8570漏

Struts2再爆远程代码执行漏洞(S2-016)

Struts又爆远程代码执行漏洞了!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行.  描述 影响版本 Struts 2.0.0 - Struts 2.3.15 报告者 Takeshi Terada of Mitsui Bussan Secure Directions, Inc. CVE编号 CVE-2013-2251 漏洞证明 参数会以OGN

Portable OpenSSH GSSAPI远程代码执行漏洞(CVE-2006-5051)漏洞解决方案

漏洞的名称为Portable OpenSSH GSSAPI远程代码执行漏洞(CVE-2006-5051)及OpenSSH J-PAKE授权问题漏洞(CVE-2010-4478),厂家给出的解决方案很笼统.经过各方查找资料,大致的解决方案是升级到高版本的openssh,目前最新版本是openssh 6.7p1. 下载地址:http://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/ 可以根据自己的需要选择下载升级,其实没别要升级到最新版本

Apache Tomcat CVE-2017-12615远程代码执行漏洞分析

2017年9月19日, Apache Tomcat官方发布两个严重的安全漏洞, 其中CVE-2017-12615为远程代码执行漏洞,通过put请求向服务器上传恶意jsp文件, 再通过jsp文件在服务器上执行任意代码, 且最新的补丁未完全修复漏洞.中新网安将对该漏洞进行持续关注, 并第一时间为您更新相关漏洞信息. 漏洞编号 CVE-2017-12615 漏洞名称 Apache Tomcat 远程代码执行漏洞 漏洞评级 严重 影响范围 Apache Tomcat 7.0.0 - 7.0.79 漏洞分

EOS节点远程代码执行漏洞细节

这是一个缓冲区溢出越界写漏洞 漏洞存在于在 libraries/chain/webassembly/binaryen.cpp文件的78行, Function binaryen_runtime::instantiate_module: for (auto& segment : module->table.segments) { Address offset = ConstantExpressionRunner<TrivialGlobalManager>(globals).visit

Samba远程代码执行漏洞(CVE-2017-7494) 复现

漏洞背景:Samba是在Linux和UNIX系统上实现SMB协议的一个软件,2017年5月24日Samba发布了4.6.4版本,中间修复了一个严重的远程代码执行漏洞,漏洞编号CVE-2017-7494,漏洞影响了Samba 3.5.0 之后到4.6.4/4.5.10/4.4.14中间的所有版本,,确认属于严重漏洞,可以造成远程代码执行. 环境准备×××机:kali2018靶机:Centos6.5(samba 3.6.9) 靶机部分: [[email protected] ~]# yum inst