/* TEMPLATE GENERATED TESTCASE FILE Filename: CWE80_XSS__CWE182_Servlet_URLConnection_08.java Label Definition File: CWE80_XSS__CWE182_Servlet.label.xml Template File: sources-sink-08.tmpl.java */ /* * @description * CWE: 80 Cross Site Scripting (XSS) * BadSource: URLConnection Read data from a web server with URLConnection * GoodSource: A hardcoded string * BadSink: Display of data in web page after using replaceAll() to remove script tags, which will still allow XSS (CWE 182: Collapse of Data into Unsafe Value) * Flow Variant: 08 Control flow: if(privateReturnsTrue()) and if(privateReturnsFalse()) * * */ package testcases.CWE80_XSS.s01; import testcasesupport.*; import javax.servlet.http.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.util.logging.Level; public class CWE80_XSS__CWE182_Servlet_URLConnection_08 extends AbstractTestCaseServlet { /* The methods below always return the same value, so a tool * should be able to figure out that every call to these * methods will return true or return false. */ private boolean privateReturnsTrue() { return true; } private boolean privateReturnsFalse() { return false; } /* uses badsource and badsink */ public void bad(HttpServletRequest request, HttpServletResponse response) throws Throwable { String data; if (privateReturnsTrue()) { data = ""; /* Initialize data */ /* read input from URLConnection */ { URLConnection urlConnection = (new URL("http://www.example.org/")).openConnection(); BufferedReader readerBuffered = null; InputStreamReader readerInputStream = null; try { readerInputStream = new InputStreamReader(urlConnection.getInputStream(), "UTF-8"); readerBuffered = new BufferedReader(readerInputStream); /* POTENTIAL FLAW: Read data from a web server with URLConnection */ /* This will be reading the first "line" of the response body, * which could be very long if there are no newlines in the HTML */ data = readerBuffered.readLine(); } catch (IOException exceptIO) { IO.logger.log(Level.WARNING, "Error with stream reading", exceptIO); } finally { /* clean up stream reading objects */ try { if (readerBuffered != null) { readerBuffered.close(); } } catch (IOException exceptIO) { IO.logger.log(Level.WARNING, "Error closing BufferedReader", exceptIO); } try { if (readerInputStream != null) { readerInputStream.close(); } } catch (IOException exceptIO) { IO.logger.log(Level.WARNING, "Error closing InputStreamReader", exceptIO); } } } } else { /* INCIDENTAL: CWE 561 Dead Code, the code below will never run * but ensure data is inititialized before the Sink to avoid compiler errors */ data = null; } if (data != null) { /* POTENTIAL FLAW: Display of data in web page after using replaceAll() to remove script tags, which will still allow XSS with strings like ipt> (CWE 182: Collapse of Data into Unsafe Value) */ response.getWriter().println("
bad(): data = " + data.replaceAll("(