几年之前关于一种“新类型”的漏洞——重定向后代码执行的白皮书,被发布在~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 让我们可以这样进行请求:
<jsp:forward page=”any.jsp”></jsp:forward>
2)JSTL 让我们可以这样重定向给用户:
<c:redirect url=”any.jsp”/>
但是在这两种情况中,web应用不能继续执行之后的代码。为什么呢?如果我们查看JSP文件转换成对应的java classes的时候,我们发现:
1) For “forward”:
if (true) {
_jspx_page_context.forward(“any.jsp”);
return;
}
2) For “redirect”:
if (_jspx_meth_c_005fredirect_005f0(_jspx_page_context))
return;
因此,web应用停止继续往下执行了。
原文地址:%20review