Skip to content

Commit 8363d2d

Browse files
authored
Merge pull request #22132 from joshimar/java/spring-webclient-uri-ssrf-sink
Java: Model Spring reactive `WebClient.uri` as a request forgery sink
2 parents c3a0b65 + b8f8370 commit 8363d2d

5 files changed

Lines changed: 382 additions & 340 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The first argument of the `uri` method of `WebClient$UriSpec` in `org.springframework.web.reactive.function.client` is now considered a request forgery sink. Previously only the first arguments of the `WebClient.create` and `WebClient$Builder.baseUrl` methods were considered. This may lead to more alerts for the query `java/ssrf` (Server-side request forgery).

java/ql/lib/ext/org.springframework.web.reactive.function.client.model.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ extensions:
55
data:
66
- ["org.springframework.web.reactive.function.client", "WebClient", False, "create", "", "", "Argument[0]", "request-forgery", "manual"]
77
- ["org.springframework.web.reactive.function.client", "WebClient$Builder", False, "baseUrl", "", "", "Argument[0]", "request-forgery", "manual"]
8+
- ["org.springframework.web.reactive.function.client", "WebClient$UriSpec", True, "uri", "", "", "Argument[0]", "request-forgery", "manual"]

java/ql/test/query-tests/security/CWE-918/ReactiveWebClientSSRF.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,27 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
4646
// Ignore
4747
}
4848
}
49+
50+
protected void doPut(HttpServletRequest request, HttpServletResponse response)
51+
throws ServletException, IOException {
52+
try {
53+
WebClient webClient = WebClient.create("https://example.com");
54+
55+
String p = request.getParameter("uri"); // $ Source
56+
webClient.get()
57+
.uri(p) // $ Alert
58+
.retrieve()
59+
.bodyToMono(String.class)
60+
.block();
61+
62+
String p2 = request.getParameter("uri"); // $ Source
63+
webClient.get()
64+
.uri(java.net.URI.create("https://example.com" + p2)) // $ Alert
65+
.retrieve()
66+
.bodyToMono(String.class)
67+
.block();
68+
} catch (Exception e) {
69+
// Ignore
70+
}
71+
}
4972
}

0 commit comments

Comments
 (0)