id: CVE-2025-2609 info: name: MagnusBilling Login Logs - Cross-Site Scripting author: DhiyaneshDK severity: high description: | Improper neutralization of input during web page generation vulnerability in MagnusSolution MagnusBilling login logging allows unauthenticated users to store HTML content in the viewable log component accessible at /mbilling/index.php/logUsers/read" cross-site scripting This vulnerability is associated with program files protected/components/MagnusLog.Php.This issue affects MagnusBilling- through 7.3.0. impact: | Unauthenticated attackers can inject malicious HTML and JavaScript into login logs that persist and execute when administrators view the log component, potentially leading to session hijacking and privilege escalation. remediation: | Upgrade to MagnusBilling version 7.3.1 or later that properly sanitizes input in the login logging component. reference: - https://vulncheck.com/advisories/magnusbilling-logs-xss - https://chocapikk.com/posts/2025/magnusbilling/ - https://nvd.nist.gov/vuln/detail/CVE-2025-2609 classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N cvss-score: 8.2 cve-id: CVE-2025-2609 cwe-id: CWE-79 epss-score: 0.03183 epss-percentile: 0.87204 cpe: cpe:2.3:a:magnussolution:magnusbilling:*:*:*:*:*:*:*:* metadata: verified: true max-request: 4 vendor: magnussolution product: magnusbilling shodan-query: html:"MagnusBilling" fofa-query: body="MagnusBilling" tags: cve,cve2025,mbilling,stored,xss,authenticated,vkev,vuln flow: http(1) && http(2) && http(3) && http(4) variables: username: "root" password: "9F4CA770B638615AC5C3E0D2DA16B77C80C2F2C6" # magnus http: - raw: - | POST /mbilling/index.php/authentication/login HTTP/1.1 Host: {{Hostname}} Content-Type: application/x-www-form-urlencoded user=&password=random matchers: - type: dsl dsl: - 'status_code == 200' - 'contains(body, "combination is invalid")' - '!contains(body, "Trying SQL inject")' condition: and internal: true - raw: - | POST /mbilling/index.php/authentication/login HTTP/1.1 Host: {{Hostname}} Content-Type: application/x-www-form-urlencoded; user={{username}}&password={{password}}&key= matchers: - type: dsl dsl: - 'status_code == 200' - 'contains(body, "success")' condition: and internal: true - raw: - | GET /mbilling/index.php/authentication/check?_dc= HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - 'status_code == 200' - 'contains(body, "id_agent")' condition: and internal: true - raw: - | GET /mbilling/index.php/logUsers/read?_dc=&page=1&start=0&limit=25 HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - 'status_code == 200' - 'contains(body, "User: ")' condition: and # digest: 4a0a00473045022008e84e7755d6c63bd6efa1d53c062c77d419e581ae0efa0bef926bbee506fa0a022100a5fc3e42e9d65f3ca73bdab4024fc25d55041d31e5212ac540264dce40683271:922c64590222798bb761d5b6d8e72950