使用OWASP和ESAPI解决它

时间:2015-12-28 08:52:56

标签: owasp esapi

攻击向量:java.io.PrintWriter.write

描述:对java.io.PrintWriter.write()的此调用包含跨站点脚本(XSS)缺陷。应用程序使用用户提供的输入填充HTTP响应,允许攻击者嵌入恶意内容,例如Javascript代码,这些内容将在受害者的浏览器环境中执行。 XSS漏洞通常被利用来窃取或操纵cookie,修改内容的呈现以及危害机密信息,并定期发现新的攻击媒介。 write()的第一个参数包含污染数据。受污染的数据源自之前对javax.servlet.servletrequest.getparameter的调用。被污染的数据被定向到org.apache.jasper.runtime.pagecontextimpl.getout返回的输出流。

它是在writer.write(arg1)的代码第一个参数中..请帮助我解决这个问题

1 个答案:

答案 0 :(得分:1)

我认为这是指您可以使用未经过清理的用户输入。

例如,在下面简化的servlet中,用户可以通过传入参数来打印他/她自己的名字。

http://xxx/servlet/vulnerable?someuserinput=Bob

但是假设攻击者通过电子邮件发送了一个链接中存在令人讨厌的内容的链接。

http://xxx/servlet/vulnerable?someuserinput=alert(“你好!我正在做一些令人讨厌的事情!”);

经验法则总是消毒你的输入

@WebServlet(name = "vulnerable", urlPatterns = {"/vulnerable"})
public class NewServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String someUserInput = request.getParameter("someuserinput");

        try (PrintWriter out = response.getWriter()) {

            out.write("<!DOCTYPE html>");
            out.write("<html>");
            out.write("<head>");       
            out.write("</head>");
            out.write("<body>");
            out.write("<h1>Hello " + someUserInput + "</h1>");//something bad can happen here 
            out.write("</body>");
            out.write("</html>");
        }
    }

我知道你在询问ESAPI,但OWASP有HTML简单的Sanitizer。

https://github.com/OWASP/java-html-sanitizer

HTML上下文中的ESAPI(如上所述)

String safer = ESAPI.encoder().encodeForHTML( request.getParameter( "someuserinput" ) );

在Javascript

的上下文中的ESAPI
String safer = ESAPI.encoder().encodeForJavaScript( request.getParameter( "someuserinput" ) );