Skip to content

Commit

Permalink
Merge pull request keycloak#93 from mposolda/RHSSO-1580
Browse files Browse the repository at this point in the history
RHSSO-1580 XSS-Vulnerability with response_mode=form_post
  • Loading branch information
hmlnarik committed Sep 7, 2018
2 parents 31979cd + ccc8f4f commit dce15c8
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.keycloak.protocol.oidc.utils;

import org.keycloak.common.util.Encode;
import org.keycloak.common.util.HtmlUtils;
import org.keycloak.common.util.KeycloakUriBuilder;

import javax.ws.rs.core.MediaType;
Expand Down Expand Up @@ -143,8 +144,11 @@ public Response build() {
builder.append(" <FORM METHOD=\"POST\" ACTION=\"" + redirectUri.toString() + "\">");

for (Map.Entry<String, String> param : params.entrySet()) {
builder.append(" <INPUT TYPE=\"HIDDEN\" NAME=\"").append(param.getKey())
.append("\" VALUE=\"").append(param.getValue()).append("\" />");
builder.append(" <INPUT TYPE=\"HIDDEN\" NAME=\"")
.append(param.getKey())
.append("\" VALUE=\"")
.append(HtmlUtils.escapeAttribute(param.getValue()))
.append("\" />");
}

builder.append(" <NOSCRIPT>");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.jboss.resteasy.annotations.cache.NoCache;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.keycloak.common.util.HtmlUtils;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.JWSInputException;
import org.keycloak.models.KeycloakSession;
Expand Down Expand Up @@ -135,7 +136,10 @@ public String post(@PathParam("action") String action) {
HttpRequest request = ResteasyProviderFactory.getContextData(HttpRequest.class);
MultivaluedMap<String, String> formParams = request.getDecodedFormParameters();
for (String paramName : formParams.keySet()) {
sb.append(paramName).append(": ").append("<span id=\"").append(paramName).append("\">").append(formParams.getFirst(paramName)).append("</span><br>");
sb.append(paramName).append(": ").append("<span id=\"")
.append(paramName).append("\">")
.append(HtmlUtils.escapeAttribute(formParams.getFirst(paramName)))
.append("</span><br>");
}
sb.append("<br>");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,22 @@ public void authorizationRequestFormPostResponseMode() throws IOException {
String codeId = events.expectLogin().assertEvent().getDetails().get(Details.CODE_ID);
}


@Test
public void authorizationRequestFormPostResponseModeWithCustomState() throws IOException {
oauth.responseMode(OIDCResponseMode.FORM_POST.toString().toLowerCase());
oauth.stateParamHardcoded("\"><foo>bar_baz(2)far</foo>");
oauth.doLoginGrant("test-user@localhost", "password");

String sources = driver.getPageSource();
System.out.println(sources);

String code = driver.findElement(By.id("code")).getText();
String state = driver.findElement(By.id("state")).getText();

assertEquals("\"><foo>bar_baz(2)far</foo>", state);

String codeId = events.expectLogin().assertEvent().getDetails().get(Details.CODE_ID);
}

}

0 comments on commit dce15c8

Please sign in to comment.