
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.
Abbildung 1: Datenfluss-Auditdiagramm der SQL-Injection-Schwachstelle CVE-2024-57521
Dieses Repository dient ausschließlich Sicherheitsforschung und Bildungszwecken. Nutzen Sie die in diesem Dokument beschriebenen Techniken nicht für nicht autorisierte Angriffe. Alle Tests wurden in einer lokalen statischen Code-Audit-Umgebung durchgeführt.
ruoyi-generator)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); // 在进入业务前调用过滤器
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 zur Verarbeitung.
Screenshot-Beleg:

· Dateiposition: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Kernfehler-Code:
// 第16行:黑名单定义,注意关键词带有【尾随空格】
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";
// 第61-66行:过滤逻辑
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // 先清空了输入里的所有空格
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
{
throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
}
}
Schwachstellenanalyse: Der Filter führt zunächst replaceAll("\\p{Z}|\\s", "") aus und entfernt damit alle Leerzeichen aus der Eingabe. Die Schlüsselwörter in der Blacklist SQL_REGEX (wie "and ", "select ") enthalten jedoch ein abschließendes Leerzeichen. Dadurch schlägt die Übereinstimmung zwangsläufig fehl; sobald ein Angreifer nach dem Schlüsselwort %0b (vertikales Tabulatorzeichen) anstelle eines Leerzeichens verwendet, lässt sich die Blacklist-Prüfung mühelos umgehen.
Screenshot-Belege:
· Dateiposition: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml