Skip to content

Commit eac265a

Browse files
committed
cleanup and add header/jndi injection vulns
1 parent 53d542a commit eac265a

File tree

8 files changed

+119
-46
lines changed

8 files changed

+119
-46
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ buildNumber.properties
2525
.project
2626
# JDT-specific (Eclipse Java Development Tools)
2727
.classpath
28+
.dccache

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
</dependencyManagement>
3838

3939
<dependencies>
40+
<dependency>
41+
<groupId>javax.servlet</groupId>
42+
<artifactId>servlet-api</artifactId>
43+
<version>2.5</version>
44+
<scope>provided</scope>
45+
</dependency>
4046
<dependency>
4147
<groupId>jakarta.ws.rs</groupId>
4248
<artifactId>jakarta.ws.rs-api</artifactId>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.acme.headerinjection;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.QueryParam;
6+
7+
import javax.servlet.http.HttpServletResponse;
8+
9+
@Path("/unsafe-header-injection")
10+
public class HeaderInjectionVuln {
11+
12+
@GET
13+
public String lookupResource(HttpServletResponse response, @QueryParam("q") final String q) {
14+
response.setHeader("X-Last-Search", q);
15+
return "ok";
16+
}
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.acme.headerinjection;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.QueryParam;
6+
7+
import javax.servlet.http.HttpServletResponse;
8+
9+
@Path("/unsafe-header-injection")
10+
public class HeaderInjectionVulnFixed {
11+
12+
@GET
13+
public String lookupResource(HttpServletResponse response, @QueryParam("q") final String q) {
14+
response.setHeader("X-Last-Search", stripNewlines(q));
15+
return "ok";
16+
}
17+
18+
private static String stripNewlines(final String q) {
19+
return q.replaceAll("[\n\r]", "");
20+
}
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.acme.jndi;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.QueryParam;
6+
7+
import javax.naming.Context;
8+
import javax.naming.InitialContext;
9+
import javax.naming.NamingException;
10+
11+
@Path("/unsafe-jndi-lookup")
12+
public class JNDIVuln {
13+
14+
@GET
15+
public String lookupResource(@QueryParam("resource") final String resource) throws NamingException {
16+
Context ctx = new InitialContext();
17+
Object obj = ctx.lookup(resource);
18+
return String.valueOf(obj);
19+
}
20+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.acme.jndi;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.QueryParam;
6+
7+
import javax.naming.Context;
8+
import javax.naming.InitialContext;
9+
import javax.naming.NamingException;
10+
import java.util.Set;
11+
12+
@Path("/unsafe-jndi-lookup")
13+
public class JNDIVulnFixed {
14+
15+
@GET
16+
public String lookupResource(@QueryParam("resource") final String resource) throws NamingException {
17+
Context ctx = new InitialContext();
18+
validateResourceName(resource);
19+
Object obj = ctx.lookup(resource);
20+
return String.valueOf(obj);
21+
}
22+
23+
private static void validateResourceName(final String name) {
24+
if (name != null) {
25+
Set<String> illegalNames = Set.of("ldap://", "rmi://", "dns://");
26+
String canonicalName = name.toLowerCase().trim();
27+
if (illegalNames.stream().anyMatch(canonicalName::startsWith)) {
28+
throw new SecurityException("Illegal JNDI resource name: " + name);
29+
}
30+
}
31+
}
32+
}
Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
package com.acme;
1+
package com.acme.xxe;
2+
3+
import org.w3c.dom.Document;
4+
import org.xml.sax.InputSource;
5+
import org.xml.sax.SAXException;
6+
import org.xml.sax.XMLReader;
7+
import org.xml.sax.helpers.XMLReaderFactory;
28

3-
import java.io.IOException;
4-
import java.io.StringReader;
5-
import java.io.StringWriter;
6-
import java.sql.Connection;
7-
import java.sql.DriverManager;
8-
import java.sql.SQLException;
99
import javax.xml.parsers.*;
1010
import javax.xml.transform.Transformer;
1111
import javax.xml.transform.TransformerException;
1212
import javax.xml.transform.TransformerFactory;
1313
import javax.xml.transform.dom.DOMSource;
1414
import javax.xml.transform.stream.StreamResult;
15-
import org.w3c.dom.Document;
16-
import org.xml.sax.InputSource;
17-
import org.xml.sax.SAXException;
18-
import org.xml.sax.XMLReader;
19-
import org.xml.sax.helpers.XMLReaderFactory;
15+
import java.io.IOException;
16+
import java.io.StringReader;
17+
import java.io.StringWriter;
2018

2119
/** Holds various XXE vulns for different APIs. */
2220
public class XXEVuln {
@@ -25,25 +23,15 @@ public static void main(String[] args)
2523
throws TransformerException,
2624
ParserConfigurationException,
2725
IOException,
28-
SAXException,
29-
SQLException {
26+
SAXException {
3027
docToString(null);
3128
saxTransformer(args[0]);
3229
withDom(args[1]);
3330
withDomButDisabled(args[2]);
3431
withReaderFactory(args[3]);
35-
36-
String sql = "select * from users where name= '" + args[0] + "'";
37-
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test");
38-
conn.createStatement().executeQuery(sql);
3932
}
4033

4134
public static String docToString(final Document poDocument) throws TransformerException {
42-
if (true) {
43-
int a = 1;
44-
return "foo";
45-
}
46-
4735
TransformerFactory transformerFactory = TransformerFactory.newInstance();
4836
Transformer transformer = transformerFactory.newTransformer();
4937
DOMSource domSrc = new DOMSource(poDocument);

src/main/java/com/acme/XXEVulnFixed.java renamed to src/main/java/com/acme/xxe/XXEVulnFixed.java

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
package com.acme;
1+
package com.acme.xxe;
2+
3+
import org.w3c.dom.Document;
4+
import org.xml.sax.InputSource;
5+
import org.xml.sax.SAXException;
6+
import org.xml.sax.XMLReader;
7+
import org.xml.sax.helpers.XMLReaderFactory;
28

3-
import java.io.IOException;
4-
import java.io.StringReader;
5-
import java.io.StringWriter;
6-
import java.sql.Connection;
7-
import java.sql.DriverManager;
8-
import java.sql.SQLException;
99
import javax.xml.XMLConstants;
1010
import javax.xml.parsers.*;
1111
import javax.xml.transform.Transformer;
1212
import javax.xml.transform.TransformerException;
1313
import javax.xml.transform.TransformerFactory;
1414
import javax.xml.transform.dom.DOMSource;
1515
import javax.xml.transform.stream.StreamResult;
16-
import org.w3c.dom.Document;
17-
import org.xml.sax.InputSource;
18-
import org.xml.sax.SAXException;
19-
import org.xml.sax.XMLReader;
20-
import org.xml.sax.helpers.XMLReaderFactory;
16+
import java.io.IOException;
17+
import java.io.StringReader;
18+
import java.io.StringWriter;
2119

2220
/** Holds various XXE vulns for different APIs. */
2321
public class XXEVulnFixed {
@@ -26,25 +24,15 @@ public static void main(String[] args)
2624
throws TransformerException,
2725
ParserConfigurationException,
2826
IOException,
29-
SAXException,
30-
SQLException {
27+
SAXException {
3128
docToString(null);
3229
saxTransformer(args[0]);
3330
withDom(args[1]);
3431
withDomButDisabled(args[2]);
3532
withReaderFactory(args[3]);
36-
37-
String sql = "select * from users where name= '" + args[0] + "'";
38-
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test");
39-
conn.createStatement().executeQuery(sql);
4033
}
4134

4235
public static String docToString(final Document poDocument) throws TransformerException {
43-
if (true) {
44-
int a = 1;
45-
return "foo";
46-
}
47-
4836
TransformerFactory transformerFactory = TransformerFactory.newInstance();
4937
transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
5038
Transformer transformer = transformerFactory.newTransformer();

0 commit comments

Comments
 (0)