针对J2EE的重定向后代码执行

几年之前关于一种“新类型”的漏洞——重定向后代码执行的白皮书,被发布在http://cs.ucsb.edu/~bboe/public/pubs/fear-the-ear-ccs2011.pdf.这是一种“逻辑“型漏洞,关于EAR的原理也很简单。就是当一个web应用返回重定向头给用户时,没有停止而是继续执行之后的代码。因此,有可能绕过授权并且在web 应用中执行一些动作或者窃取一些重要信息。

下面的例子更清晰的解释了EAR:

            if (!(request.getParameter(“pass”).equals(adminPswd))) {

                       response.sendRedirect(“login.jsp”);  }

            admin.critFunc();

如果一个用户输入了错误的密码,web应用发送一个跳转到登入页面的重定向头。在此之后,web应用继续执行了一些重要的方法。因此EAR这种漏洞,就是web应用继续执行甚至当重定向发生以后。实际上,EAR漏洞出现的可能性取决于web应用所采用的框架或者平台的特点。在上述的那份白皮书中有一份关于不同的EAR漏洞的框架清单。

同时 blind EAR是EAR 的一种子类型。就是当跳转发生以后web应用没有返回任何输出给用户,而且这种类型的EAR只可能发生在J2EE应用中。

一些新东西?

我将分享一些针对J2EE的EAR的微小的研究,因为这种问题普遍存在。通常我们用以下代码进行重定向:

              response.sendRedirect(“any.jsp”);

一个WEB应用在这个跳转之后将继续往下执行。

但是还有一种forward功能(当一个用户在web应用内部从一个servlet或者script 跳转到另一个servlet或者script)

               request.getRequestDispatcher(“any.jsp”).forward(request, response);

我们也会返回一个错误页面给用户:

                   response.sendError(500, “Text of Error”);

在以上的这三个例子中,web应用也继续往下执行了。因此,我们有Execution After Forward 和 Execution After Error这两种类型的漏洞。

我很感兴趣检查JSP 和 JSTL在这方面的独有特点:

1)JSP 让我们可以这样进行请求:

      

2)JSTL 让我们可以这样重定向给用户:

       

但是在这两种情况中,web应用不能继续执行之后的代码。为什么呢?如果我们查看JSP文件转换成对应的java classes的时候,我们发现:

  1. For “forward”:

if (true) {
_jspx_page_context.forward(“any.jsp”);
return;
}

  1. For “redirect”:

if (_jspx_meth_c_005fredirect_005f0(_jspx_page_context))
return;

因此,web应用停止继续往下执行了。

http://www.45zq.cn/portal/article/index/id/193.html

你可能感兴趣的:(针对J2EE的重定向后代码执行)