Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
366 changes: 366 additions & 0 deletions AIfixtest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,366 @@
/**
* OWASP Benchmark v1.2
*
* <p>This file is part of the Open Web Application Security Project (OWASP) Benchmark Project. For
* details, please see <a
* href="https://owasp.org/www-project-benchmark/">https://owasp.org/www-project-benchmark/</a>.
*
* <p>The OWASP Benchmark is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation, version 2.
*
* <p>The OWASP Benchmark is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* @author Dave Wichers
* @created 2015
*/
package org.owasp.benchmark.testcode;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/cmdi-00/BenchmarkTest00006")
public class bad1 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// some code
response.setContentType("text/html;charset=UTF-8");
String param = "";
if (request.getHeader("BenchmarkTest00006") != null) {
param = request.getHeader("BenchmarkTest00006");
}
// URL Decode the header value since req.getHeader() doesn't. Unlike req.getParameter().
param = java.net.URLDecoder.decode(param, "UTF-8");
java.util.List<String> argList = new java.util.ArrayList<String>();
String osName = System.getProperty("os.name");
if (osName.indexOf("Windows") != -1) {
argList.add("cmd.exe");
argList.add("/c");
} else {
argList.add("sh");
argList.add("-c");
}
// deepsemgrep-ruleid: tainted-cmd-from-http-request-deepsemgrep
argList.add("echo " + param);
ProcessBuilder pb = new ProcessBuilder();
pb.command(argList);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Command Injection

Unsanitized input from an HTTP header flows into command, where it is used as a shell command. This may result in a Command Injection vulnerability.

Line 67 | CWE-78 | Priority score 415 | Learn more about this vulnerability
Data flow: 11 steps

Step 1 - 3

param = request.getHeader("BenchmarkTest00006");

Step 4 - 6 AIfixtest.java#L50

Step 7 - 9 AIfixtest.java#L63

Step 10 - 11

pb.command(argList);

try {
Process p = pb.start();
org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println(
"Problem executing cmdi - java.lang.ProcessBuilder(java.util.List) Test Case");
throw new ServletException(e);
}
}
}
@WebServlet(value = "/cmdi-00/BenchmarkTest00007")
public class bad2 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// some code
response.setContentType("text/html;charset=UTF-8");
String param = "";
if (request.getHeader("BenchmarkTest00007") != null) {
param = request.getHeader("BenchmarkTest00007");
}
// URL Decode the header value since req.getHeader() doesn't. Unlike req.getParameter().
param = java.net.URLDecoder.decode(param, "UTF-8");
String cmd =
org.owasp.benchmark.helpers.Utils.getInsecureOSCommandString(
this.getClass().getClassLoader());
String[] args = {cmd};
String[] argsEnv = {param};
Runtime r = Runtime.getRuntime();
try {
// ruleid: tainted-cmd-from-http-request-deepsemgrep
Process p = r.exec(args, argsEnv);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Indirect Command Injection via User Controlled Environment

Unsanitized input from an HTTP header flows into exec, where it is used to build a shell command with environment variables. It is important to properly validate and sanitize all input parameters, to prevent potential command injection attacks via tainted environment variables.

Line 115 | CWE-78 | Priority score 215 | Learn more about this vulnerability
Data flow: 11 steps

Step 1 - 3

param = request.getHeader("BenchmarkTest00007");

Step 4 - 6 AIfixtest.java#L103

Step 7 - 9 AIfixtest.java#L109

Step 10 - 11

Process p = r.exec(args, argsEnv);

// ruleid: tainted-cmd-from-http-request-deepsemgrep
Runtime.getRuntime().exec(args, argsEnv);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Indirect Command Injection via User Controlled Environment

Unsanitized input from an HTTP header flows into exec, where it is used to build a shell command with environment variables. It is important to properly validate and sanitize all input parameters, to prevent potential command injection attacks via tainted environment variables.

Line 117 | CWE-78 | Priority score 215 | Learn more about this vulnerability
Data flow: 11 steps

Step 1 - 3

param = request.getHeader("BenchmarkTest00007");

Step 4 - 6 AIfixtest.java#L103

Step 7 - 9 AIfixtest.java#L109

Step 10 - 11

Runtime.getRuntime().exec(args, argsEnv);

org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println("Problem executing cmdi - TestCase");
response.getWriter()
.println(org.owasp.esapi.ESAPI.encoder().encodeForHTML(e.getMessage()));
return;
}
}
}
@WebServlet(value = "/cmdi-00/BenchmarkTest00091")
public class bad3 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
javax.servlet.http.Cookie userCookie =
new javax.servlet.http.Cookie("BenchmarkTest00091", "FOO%3Decho+Injection");

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Sensitive Cookie Without 'HttpOnly' Flag

Cookie misses a call to setHttpOnly. Set the HttpOnly flag to true to protect the cookie from possible malicious code on client side.

Line 138 | CWE-1004 | Priority score 410

⚡ Fix this issue by replying with the following command: @snyk /fix

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@snyk /fix

userCookie.setMaxAge(60 * 3); // Store cookie for 3 minutes
userCookie.setSecure(true);
userCookie.setPath(request.getRequestURI());
userCookie.setDomain(new java.net.URL(request.getRequestURL().toString()).getHost());
response.addCookie(userCookie);
javax.servlet.RequestDispatcher rd =
request.getRequestDispatcher("/cmdi-00/BenchmarkTest00091.html");
rd.include(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
javax.servlet.http.Cookie[] theCookies = request.getCookies();
String param = "noCookieValueSupplied";
if (theCookies != null) {
for (javax.servlet.http.Cookie theCookie : theCookies) {
if (theCookie.getName().equals("BenchmarkTest00091")) {
param = java.net.URLDecoder.decode(theCookie.getValue(), "UTF-8");
break;
}
}
}
String bar = param;
String cmd =
org.owasp.benchmark.helpers.Utils.getInsecureOSCommandString(
this.getClass().getClassLoader());
String[] args = {cmd};
String[] argsEnv = {bar};
Runtime r = Runtime.getRuntime();
try {
// ruleid: tainted-cmd-from-http-request-deepsemgrep
Process p = r.exec(args, argsEnv);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Indirect Command Injection via User Controlled Environment

Unsanitized input from cookies flows into exec, where it is used to build a shell command with environment variables. It is important to properly validate and sanitize all input parameters, to prevent potential command injection attacks via tainted environment variables.

Line 178 | CWE-78 | Priority score 215 | Learn more about this vulnerability
Data flow: 14 steps

Step 1 - 2

javax.servlet.http.Cookie[] theCookies = request.getCookies();

Step 3 AIfixtest.java#L158

Step 4 - 7 AIfixtest.java#L160

Step 8 - 9 AIfixtest.java#L166

Step 10 - 12 AIfixtest.java#L172

Step 13 - 14

Process p = r.exec(args, argsEnv);

org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println("Problem executing cmdi - TestCase");
response.getWriter()
.println(org.owasp.esapi.ESAPI.encoder().encodeForHTML(e.getMessage()));
return;
}
}
}
@WebServlet(value = "/cmdi-00/BenchmarkTest00077")
public class bad4 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
javax.servlet.http.Cookie userCookie =
new javax.servlet.http.Cookie("BenchmarkTest00077", "ECHOOO");

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Sensitive Cookie Without 'HttpOnly' Flag

Cookie misses a call to setHttpOnly. Set the HttpOnly flag to true to protect the cookie from possible malicious code on client side.

Line 199 | CWE-1004 | Priority score 410

⚡ Fix this issue by replying with the following command: @snyk /fix

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@snyk /fix

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@snyk /fix

userCookie.setMaxAge(60 * 3); // Store cookie for 3 minutes
userCookie.setSecure(true);
userCookie.setPath(request.getRequestURI());
userCookie.setDomain(new java.net.URL(request.getRequestURL().toString()).getHost());
response.addCookie(userCookie);
javax.servlet.RequestDispatcher rd =
request.getRequestDispatcher("/cmdi-00/BenchmarkTest00077.html");
rd.include(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
javax.servlet.http.Cookie[] theCookies = request.getCookies();
String param = "noCookieValueSupplied";
if (theCookies != null) {
for (javax.servlet.http.Cookie theCookie : theCookies) {
if (theCookie.getName().equals("BenchmarkTest00077")) {
param = java.net.URLDecoder.decode(theCookie.getValue(), "UTF-8");
break;
}
}
}
String bar;
String guess = "ABC";
char switchTarget = guess.charAt(2);
// Simple case statement that assigns param to bar on conditions 'A', 'C', or 'D'
switch (switchTarget) {
case 'A':
bar = param;
break;
case 'B':
bar = "bobs_your_uncle";
break;
case 'C':
case 'D':
bar = param;
break;
default:
bar = "bobs_your_uncle";
break;
}
java.util.List<String> argList = new java.util.ArrayList<String>();
String osName = System.getProperty("os.name");
if (osName.indexOf("Windows") != -1) {
argList.add("cmd.exe");
argList.add("/c");
} else {
argList.add("sh");
argList.add("-c");
}
// deepsemgrep-ruleid: tainted-cmd-from-http-request-deepsemgrep
argList.add("echo " + bar);
ProcessBuilder pb = new ProcessBuilder(argList);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Command Injection

Unsanitized input from cookies flows into java.lang.ProcessBuilder, where it is used as a shell command. This may result in a Command Injection vulnerability.

Line 261 | CWE-78 | Priority score 415 | Learn more about this vulnerability
Data flow: 14 steps

Step 1 - 2

javax.servlet.http.Cookie[] theCookies = request.getCookies();

Step 3 AIfixtest.java#L219

Step 4 - 7 AIfixtest.java#L221

Step 8 - 9 AIfixtest.java#L234

Step 10 - 12 AIfixtest.java#L259

Step 13 - 14

ProcessBuilder pb = new ProcessBuilder(argList);

try {
Process p = pb.start();
org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println(
"Problem executing cmdi - java.lang.ProcessBuilder(java.util.List) Test Case");
throw new ServletException(e);
}
}
}
@WebServlet(value = "/cmdi-00/BenchmarkTest00006")
public class bad5 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// some code
response.setContentType("text/html;charset=UTF-8");
String param = "";
if (request.getHeader("BenchmarkTest00006") != null) {
param = request.getHeader("BenchmarkTest00006");
}
// URL Decode the header value since req.getHeader() doesn't. Unlike req.getParameter().
param = java.net.URLDecoder.decode(param, "UTF-8");
ProcessBuilder pb = new ProcessBuilder("echo" + param);

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  Command Injection

Unsanitized input from an HTTP header flows into java.lang.ProcessBuilder, where it is used as a shell command. This may result in a Command Injection vulnerability.

Line 299 | CWE-78 | Priority score 415 | Learn more about this vulnerability
Data flow: 9 steps

Step 1 - 3

param = request.getHeader("BenchmarkTest00006");

Step 4 - 6 AIfixtest.java#L297

Step 7 - 9

ProcessBuilder pb = new ProcessBuilder("echo" + param);

builder.redirectErrorStream(true);
final Process process = builder.start();
try {
// ruleid: tainted-cmd-from-http-request-deepsemgrep
Process p = pb.start();
org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println(
"Problem executing cmdi - java.lang.ProcessBuilder(java.util.List) Test Case");
throw new ServletException(e);
}
}
}
@WebServlet(value = "/cmdi-00/BenchmarkTest00006")
public class ok1 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// some code
response.setContentType("text/html;charset=UTF-8");
String param = "";
if (request.getHeader("BenchmarkTest00006") != null) {
param = request.getHeader("BenchmarkTest00006");
}
// URL Decode the header value since req.getHeader() doesn't. Unlike req.getParameter().
param = java.net.URLDecoder.decode(param, "UTF-8");
java.util.List<String> argList = new java.util.ArrayList<String>();
String osName = System.getProperty("os.name");
if (osName.indexOf("Windows") != -1) {
argList.add("cmd.exe");
argList.add("/c");
} else {
argList.add("sh");
argList.add("-c");
}
// ok: tainted-cmd-from-http-request-deepsemgrep
argList.add("echo " + "param");
ProcessBuilder pb = new ProcessBuilder();
pb.command(argList);
try {
Process p = pb.start();
org.owasp.benchmark.helpers.Utils.printOSCommandResults(p, response);
} catch (IOException e) {
System.out.println(
"Problem executing cmdi - java.lang.ProcessBuilder(java.util.List) Test Case");
throw new ServletException(e);
}
}
}