LimeSurvey: SQL Injection in der Statistikauswertung
Ein Nutzer mit Statistik-Leserecht auf einer einzigen Umfrage liest in LimeSurvey über den Parameter summary[] die gesamte Datenbank aus, einschließlich der Passwort-Hashes der Administratoren.
Advisory-ID: TP-2026-109
Produkt: LimeSurvey (Open-Source-Software für Online-Umfragen, Community Edition)
Schwachstellentyp: SQL Injection (CWE-89)
CVE: beantragt am 17. Juni 2026 (MITRE CNA-LR), Vergabe ausstehend
CVSS 3.1: 6.5 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Betroffene Versionen: alle Versionen vor 7.5.0 (verifiziert auf 7.0.1, MySQL/MariaDB)
Behoben in: 7.5.0 (1. Oktober 2026), Nachbesserung in 7.5.1 (7. Oktober 2026)
Gemeldet: 16. Juni 2026
Zusammenfassung
LimeSurvey ist eine verbreitete Open-Source-Plattform für Online-Umfragen. Die Statistikauswertung im Administrationsbereich übernimmt die Einträge des POST-Parameters summary[] ungeprüft als Spaltennamen in SQL-Abfragen auf die Antworttabelle. Die Spaltennamen-Maskierung des Yii-Frameworks umschließt den Namen nur mit Backticks und verdoppelt eingebettete Backticks nicht, sodass ein einzelner Backtick den Bezeichner verlässt. Ein Nutzer mit dem Recht, die Statistik einer einzigen aktiven Umfrage zu lesen, liest so per Blind-SQL-Injection die gesamte Datenbank aus, einschließlich der Passwort-Hashes aller Administrationskonten.
Ursache
Statistics::run() liest summary über returnGlobal('summary') ohne Sanitizer und ohne Abgleich mit der Feldliste der Umfrage ein (application/controllers/admin/Statistics.php:91). Die einzige Prüfung davor ist das pro Umfrage delegierbare Recht statistics/read (Statistics.php:107), danach geht das Array unverändert an generate_html_chartjs_statistics() bzw. generate_statistics() (Statistics.php:472-479). Im numerischen Zweig wird jedes Element zu $fieldname (application/helpers/admin/statistics_helper.php:938) und per quoteColumnName($fieldname) in SELECT, WHERE und AND der Abfrage verkettet (statistics_helper.php:940-962), identisch im PDF/XLS-Pfad (application/helpers/userstatistics_helper.php:900). CMysqlSchema::quoteSimpleColumnName() umschließt $name nur mit Backticks und maskiert eingebettete Backticks nicht (vendor/yiisoft/yii/framework/db/schema/mysql/CMysqlSchema.php:62). Der Fix überschreibt quoteSimpleColumnName() in application/core/db/MysqlSchema.php so, dass eingebettete Backticks per str_replace() verdoppelt werden, und validiert die Feldnamen gegen die Spalten der Antworttabelle.
Proof of Concept
Mit einer Sitzung, die auf der aktiven Umfrage <sid> das Statistik-Leserecht hat (Q1_S2 ist eine vorhandene Spalte der Antworttabelle):
POST /index.php/admin/statistics/sa/index/surveyid/<sid>
Content-Type: application/x-www-form-urlencoded
YII_CSRF_TOKEN=<token>&sid=<sid>&outputtype=html&summary[]=NQ1_S2`=0 OR SLEEP(3) OR `Q1_S2
Nach dem Entfernen des führenden N schließt der eingeschleuste Backtick den Bezeichner, sodass OR SLEEP(3) in SELECT und WHERE der erzeugten Abfrage auf lime_responses_<sid> als SQL ausgeführt wird. Die Antwort verzögert sich reproduzierbar auf rund 6 s (zwei Abfragestellen) gegenüber 95 ms Baseline; mit (SELECT IF(SUBSTRING((SELECT password FROM lime_users WHERE uid=1),1,1)='$',SLEEP(3),0)) statt SLEEP(3) liest dieselbe Anfrage den bcrypt-Hash des Administrators zeichenweise aus.
Auswirkung
- Lesezugriff auf die gesamte LimeSurvey-Datenbank aus einem Recht, das nur für eine einzige Umfrage gilt.
- Offenlegung der Antworten aller anderen Umfragen und der Teilnehmerdaten in der zentralen Teilnehmerdatenbank.
- Auslesen der Passwort-Hashes aus
lime_usersfür Offline-Cracking der Administrationskonten.
Referenzen
Steckt so etwas in Ihrer Software?
Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.
