MITREid Connect Cross-site Scripting Vulnerability: CVE-2020-5497 Here's the situation: I was performing a penetration test that integrated with MITREid Connect for authorization.

Here's the situation: I was performing a penetration test that integrated with MITREid Connect for authorization. I transitioned from the Customers Web Application to the MITREid Connect web interface and was greeted by:

If you've been through some sort of web application security assessment the above image may look familiar, a JavaScript alert. It is commonly used by penetration testers to identify potential Cross-site Scripting because it is easy, visible, and demonstrates that the analyst was able to get the Application to execute arbitrary JavaScript.
I modified my username to be Test</script><script>alert(2)</script>. If my username was included in a <script> element, my username would close that <script> element and a new <script> element that triggers an alert would be created.
It just so happens, my username was included in the page, unsanitized, in a <script> element that performed several function calls including getUserInfo:
// get the info of the current user, if available (null otherwise)
 function getUserInfo() {
     return {"sub":"1234567890","name":"Test</script><script>alert(2)</script>","preferred_username":"Test","given_name":"Test</script><script>alert(2)</script>","family_name":"test","email":"test@test.com","email_verified":true};
 }
My username was also included later in the page, outside a <script> element:
<li><a href="manage/#user/profile">Test</script><script>alert(2)</script> Test</a></li>
<li class="divider"></li>
<li><a href="" class="logoutLink"><i class="icon-remove"></i> Log out</a></li>
The username appears outside a <script> element so a closing </script> is unnecessary and will essentially be ignored by the browser; my username created a new <script> element which I controlled.
I noticed the Cross-site Scripting occurs before several js files are referenced:
193<li><a href="manage/#user/profile">Test</script><script>alert(2)</script> Test</a></li>
 194<li class="divider"></li>
 195<li><a href="" class="logoutLink"><i class="icon-remove"></i> Log out</a></li>
 ...
 322<script type="text/javascript" src="resources/js/client.js" ></script>
 323
 324<script type="text/javascript" src="resources/js/grant.js" ></script>
 325
 326<script type="text/javascript" src="resources/js/scope.js" ></script>
 327
 328<script type="text/javascript" src="resources/js/whitelist.js" ></script>
 329
 330<script type="text/javascript" src="resources/js/dynreg.js" ></script>
 331
 332<script type="text/javascript" src="resources/js/rsreg.js" ></script>
 333
 334<script type="text/javascript" src="resources/js/token.js" ></script>
 335
 336<script type="text/javascript" src="resources/js/blacklist.js" ></script>
 337
 338<script type="text/javascript" src="resources/js/profile.js" ></script>
 339
 340<script type="text/javascript" src="resources/js/admin.js"></script>
Some files, like admin.js, perform a check to see if the isAdmin function returns true before granting access to restricted pages:
root: function() {
  if (isAdmin()) {
  this.navigate('admin/clients', {
  trigger: true
  });
  } else {
  this.navigate('user/approved', {
  trigger: true
  });
  }
 }
I exploited the Cross-site Scripting to force isAdmin to return true and grant other roles to my user:

Previously restricted pages were accessible, however, no sensitive information was disclosed and I was unable to modify the application after bypassing the client-side isAdmin check.
MITREid Connect is an open-source project available on github so I cloned the project and set about tracking down the cause. The search led to two places where information a user can alter is included in the page, the first being in header.tag:
// get the info of the current user, if available (null otherwise)
 function getUserInfo() {
  return ${userInfoJson};
 }
The second in topbar.tag:
<li><a href="manage/#user/profile">${ longName }</a></li>
 <li class="divider"></li>
 <li><a href="" class="logoutLink"><i class="icon-remove"></i> <spring:message code="topbar.logout"/></a></li>
I reported the issue which has subsequently been assigned CVE-2020-5497.