GitHub Security Advisory: GHSA-xfvg-8v67-j7wp
Package: typicms/core (COMPOSER)
Severity: MODERATE (CVSS 0.0)
CWE: CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Vulnerable versions: < 16.1.7
Patched in: 16.1.7

Summary: TypiCMS Core has Stored Cross-Site Scripting (XSS) via SVG File Upload

Details:
#### I. Summary

A Stored Cross-Site Scripting (XSS) vulnerability exists in the file upload module of TypiCMS. The application allows users with file upload permissions to upload SVG files. While there is a MIME type validation, the content of the SVG file is not sanitized. An attacker can upload a specially crafted SVG file containing malicious JavaScript code. When another user (such as an administrator) views or accesses this file through the application, the script executes in their browser, leading to a compromise of that user's session.

The issue is exacerbated by a bug in the SVG parsing logic, which can cause a 500 error if the uploaded SVG does not contain a `viewBox` attribute. However, this does not mitigate the XSS vulnerability, as an attacker can easily include a valid `viewBox` attribute in their malicious payload.

#### II. Vulnerability Details

*   **Vulnerability Type:** Stored Cross-Site Scripting (XSS) (CWE-79)
*   **Affected Component:** `TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php` and `TypiCMS\Modules\Core\Services\FileUploader.php`.
*  **Affected Versions:** <= 16.0.5

The vulnerability stems from two main points:

1.  **Permissive File Validation:** The `FileFormRequest` explicitly whitelists `svg` as an allowed MIME type for uploads.
2.  **Lack of Content Sanitization:** The `FileUploader` service saves the SVG file to the server without parsing and sanitizing its content to remove potentially malicious elements like `<script>` tags or `on*` event handlers.

When the default filesystem disk is set to `public`, the uploaded SVG file is stored in a publicly accessible directory, making it trivial to access the file via a direct URL and trigger the XSS payload.

#### III. Proof of Concept (PoC)

1.  **Create a Malicious SVG File:**
    Create a file named `malicious.svg` with the following content. The `viewBox` attribute is included to bypass the application's parsing bug.

    ```xml
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
        <script>
            // A simple PoC to demonstrate the vulnerability
            alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
        </script>
        <text x="10" y="50">If you see this, the script has run.</text>
    </svg>
    ```

2.  **Upload the Malicious File:**
    *   Log in to the TypiCMS admin panel as a user with permissions to upload files.
    *   Navigate to the "Files" module (e.g., `/admin/files`).
    *   Upload the `malicious.svg` file. The application will accept the file and store it.
<img width="2540" height="1217" alt="image" src="https://github.com/user-attachments/assets/beb8ace9-ac39-442c-a2bc-3fbfb09f8c32" />
<img width="1718" height="671" alt="image" src="https://github.com/user-attachments/assets/9cd4a3f8-28e3-4223-8203-7ab292eaf95f" />

3.  **Trigger the XSS:**
    *   The application will provide a public URL for the uploaded file, typically in the format `http://<your-site>/storage/files/malicious.