d95aae72e5192d7f7172522f042c373868f55ec3
galt
Thu Mar 3 09:21:05 2022 -0800
Fixing cartReset destination redirect which should not allow quote marks, spaces, or empty strings which make the page go into an infinite loop. Reported by NetSparker scan.
diff --git src/hg/cartReset/cartReset.c src/hg/cartReset/cartReset.c
index a26528a..515802b 100644
--- src/hg/cartReset/cartReset.c
+++ src/hg/cartReset/cartReset.c
@@ -2,48 +2,66 @@
/* Copyright (C) 2013 The Regents of the University of California
* See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "cheapcgi.h"
#include "htmshell.h"
#include "hui.h"
#include "cart.h"
static char *defaultDestination = "../cgi-bin/hgGateway";
+boolean problem = FALSE;
+char *destination = NULL;
+
void doMiddle()
/* cartReset - Reset cart. */
{
-
+if (problem)
+ {
+ warn("To stop Open Redirect abuse, only relative URLs are supported. "
+ "Request for destination=[%s] rejected.\n", destination);
+ }
cartResetInDb(hUserCookie());
}
int main(int argc, char *argv[])
/* Process command line. */
{
long enteredMainTime = clock1000();
struct dyString *headText = newDyString(512);
-char *destination = cgiUsualString("destination", defaultDestination);
-if (strstr(destination, "//"))
- errAbort("To stop Open Redirect abuse, only relative URLs are supported. "
- "Request for destination=[%s] rejected.\n", destination);
+destination = cgiUsualString("destination", defaultDestination);
+// Only allow relative URL that does not contain space or quote characters.
+if (strstr(destination, "//") // absolute URL
+ || strchr(destination, '\'') // single quote
+ || strchr(destination, '"') // double quote
+ || strchr(destination, ' ') // space
+ || sameString(destination, "") // empty string
+ )
+ {
+ problem = TRUE;
+ }
-char *meta = getCspMetaHeader(); // ContentSecurityPolicy stops XSS js in destination
+char *csp = getCspMetaHeader(); // ContentSecurityPolicy stops XSS js in destination
+dyStringPrintf(headText, "%s",csp);
-dyStringPrintf(headText, "%s"
+if (!problem)
+ {
+ dyStringPrintf(headText,
""
""
""
- ,meta,destination);
+ ,destination);
+ }
htmShellWithHead("Reset Cart", headText->string, doMiddle, NULL);
-freeMem(meta);
+freeMem(csp);
dyStringFree(&headText);
cgiExitTime("cartReset", enteredMainTime);
return 0;
}