A GitHub repository version of this disclosure can be read here: CVE-2026-60120.
| Detail | Information |
|---|---|
| CVE Record | CVE-2026-60120 |
| Severity | 5.1 Medium (CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N) 5.4 Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:N/I:L/A:L) |
| Date Published | 2026-07-09 |
| Software Name | Bagisto |
| Affected Version(s) | Before 2.4.4 |
| Software Link | https://github.com/bagisto/bagisto |
| Vendor | Webkul |
| Researcher Credits | Aaron Amran Bin Amiruddin (@aaronamran) |
Description
Bagisto before 2.4.4 contains a stored cross-site scripting vulnerability via client-side template injection that allows unauthenticated attackers to execute arbitrary JavaScript in administrator browsers by registering a customer account with malicious payload in the first or last name field. The create.blade.php template renders customer name fields without the Vue.js v-pre directive, causing Vue.js to evaluate stored template expressions as live JavaScript when an administrator opens the Create Order page for the affected customer.
Proof-of-Concept
1. On a Bagisto instance running a version prior to 2.4.4, navigate to the customer registration page and sign up. Populate the fields with the following input values:
FN_{{ "".constructor.prototype.charAt.constructor("alert('Blind Stored XSS')")() }}LN_{{ "".constructor.prototype.charAt.constructor("alert('Blind Stored XSS')")() }}email1@example.com (any valid email will do)cust123 (any valid password will do)
2. Log into the administration panel. Navigate to Customers via the left sidebar menu to confirm that the newly registered account appears in the list.

3. View the details of the newly created customer and click the Create Order button.

4. Upon page load, the Stored Cross-Site Scripting (XSS) via Client-Side Template Injection (CSTI) executes successfully. Because the payload was inserted into both the first and last name fields, the JavaScript executes twice in succession.

5. After dismissing both alert pop-ups, the customer's name fields appear blank in the UI. This occurs because the payload expression evaluates to undefined upon execution, causing the Vue.js template engine to render an empty string.

Timeline
v-pre to create.blade.php.See you in the next hack.
@aaronamran
July 2026