
Statische Codeanalyse von CVE-2024-57521, einer authentifizierten SQL-Injection im Generator-Modul von RuoYi-Vue, mit Source-to-Sink-Analyse und einem %0b-Filter-Bypass-PoC.
Dieses Repository dient ausschließlich Sicherheitsforschung und Bildungszwecken. Nutzen Sie die in diesem Dokument beschriebenen Techniken nicht für unautorisierte Angriffe. Alle Tests wurden in einer lokalen statischen Code-Audit-Umgebung durchgeführt.
ruoyi-generator-Modul)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.javaRelevanter Code:
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // Ruft den Filter vor dem Eintritt in die Geschäftslogik auf
Analyse: Ein Backend-Administrator kann über den sql-Parameter einer HTTP-POST-Anfrage beliebige Datenbank-DDL-Anweisungen übergeben. Der Einstiegspunkt schränkt Benutzereingaben nicht ausreichend ein und übergibt sie direkt an den nachfolgenden Filter.
Screenshot-Beleg:

· Dateiposition: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Kernfehler-Code:
// Zeile 16: Blacklist-Definition, beachten Sie die 【nachgestellten Leerzeichen】 bei den Schlüsselwörtern
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";
// Zeilen 61-66: Filterlogik
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // Entfernt zunächst alle Leerzeichen aus der Eingabe
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
{
throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
}
}
Fehleranalyse: Der Filter führt zuerst replaceAll("\p{Z}|\s", "") aus und entfernt damit alle Whitespace-Zeichen aus der Eingabe. Die Schlüsselwörter in der Blacklist SQL_REGEX (wie "and ", "select ") enthalten jedoch nachgestellte Leerzeichen. Dadurch schlägt die Übereinstimmung zwangsläufig fehl. Solange der Angreifer nach dem Schlüsselwort %0b (vertikaler Tabulator) anstelle eines Leerzeichens verwendet, kann er die Blacklist-Prüfung perfekt umgehen.
Screenshot-Belege:
· Dateiposition: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
Relevanter Code:
<update id="createTable">
${sql}
</update>
Analyse: In MyBatis verkettet ${} Zeichenketten direkt, anstatt die sichere Vorcompilierung #{} zu verwenden. Dadurch wird die bösartige SQL, die den Filter umgangen hat, zur Ausführung an die Datenbank übergeben. Dies ist eine typische kombinierte Schwachstelle aus „Blacklist-Filterung + unsicherer Verkettung".
Screenshot-Beleg:
· Methode: Der Angreifer verwendet %0b (MySQLs vertikaler Tabulator, der zum \s-Muster gehört) anstelle von Leerzeichen in der SQL-Anweisung.
· Erkennungsprinzip: IF(, 1, 1/0) dient als Detektor für die Blind-Boolean-Injection. · Bedingung falsch: Löst einen Division-durch-Null-Fehler aus, der Server gibt HTTP 500 zurück. · Bedingung wahr: Normal, keine Fehlermeldung. · Extraktionsmethode: Mit der Binärsuche können Datenbankdaten bitweise erraten werden.
Diese Schwachstelle ist eine typische Umgehung, die durch „unvollständige Behebung" entsteht. Der Entwickler führte bei der Behebung früherer gleichartiger SQL-Injections einen Blacklist-Mechanismus ein, übersah jedoch, dass die Blacklist von Leerzeichen abhängt und die vorgelagerte Logik zum Entfernen von Leerzeichen die Übereinstimmungsbedingung der Blacklist zerstört, was schließlich zu einer neuen Umgehung (CVE-2024-57521) führte.
· Blacklist-Mechanismus abschaffen: Verlassen Sie sich nicht auf Blacklists, der Whitelist-Mechanismus ist die sichere Grundlage. · Vorcompilierung verwenden: Ändern Sie ${sql} in MyBatis zu #{} (Vorcompilierung). Wenn SQL dynamisch übergeben werden muss (z. B. bei Tabellenerstellung, Order By), sollten eine strikte Abstract Syntax Tree (AST)-Analyse oder eine strenge Parameterprüfung verwendet werden. · Filter verbessern: Falls eine Blacklist unvermeidbar ist, müssen die nachgestellten Leerzeichen der Blacklist-Schlüsselwörter entfernt und vor dem Vergleich eine einheitliche Normalisierung durchgeführt werden (z. B. einheitliche Umwandlung in Kleinbuchstaben, Ersetzen von %0b usw. durch Leerzeichen).
· NVD - CVE-2024-57521 · RuoYi-Vue Gitee-Repository