
Audit statico del codice di CVE-2024-57521, un'iniezione SQL autenticata nel modulo generator di RuoYi-Vue, con analisi source-to-sink e un PoC di bypass del filtro %0b.
Questo repository è destinato esclusivamente a scopi di ricerca sulla sicurezza e didattici. Non utilizzare le tecniche contenute in questo documento per condurre attacchi non autorizzati. Tutti i test sono stati completati in un ambiente locale di audit statico del codice.
ruoyi-generator)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.javaCodice chiave:
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器
Analisi: l'amministratore del backend può passare istruzioni arbitrarie di creazione tabelle del database tramite il parametro sql di una richiesta HTTP POST. Il punto di ingresso non applica restrizioni sufficienti all'input dell'utente e lo passa direttamente al filtro successivo.
Prova tramite screenshot:

· Posizione del file: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Codice del difetto principale:
// 第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 + ",可能存在安全风险");
}
}
Analisi del difetto: il filtro esegue prima replaceAll("\p{Z}|\s", "") rimuovendo tutti i caratteri di spaziatura dall'input. Tuttavia, le parole chiave nella blacklist SQL_REGEX (come "and ", "select ") contengono uno spazio finale. Questo fa sì che la corrispondenza fallisca inevitabilmente: è sufficiente che l'attaccante utilizzi %0b (carattere di tabulazione verticale) al posto dello spazio dopo la parola chiave per aggirare perfettamente il controllo della blacklist.
Prova tramite screenshot:
· Posizione del file: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
Codice chiave:
<update id="createTable">
${sql}
</update>
Analisi: in MyBatis, ${} concatena direttamente le stringhe, invece di utilizzare la precompilazione sicura #{} . Ciò fa sì che l'SQL malevolo che ha aggirato il filtro venga inviato al database per l'esecuzione. Questa è una tipica vulnerabilità combinata di "filtro blacklist + concatenazione non sicura".
Prova tramite screenshot:
· Metodo: l'attaccante utilizza %0b (il carattere di tabulazione verticale di MySQL, che rientra nell'ambito di corrispondenza di \s) al posto degli spazi nelle istruzioni SQL.
· Principio di rilevamento: utilizzare IF(, 1, 1/0) come rilevatore per la blind injection booleana. · Condizione falsa: attiva un errore di divisione per zero, il server restituisce HTTP 500. · Condizione vera: normale, nessun errore. · Metodo di estrazione: utilizzando la bisezione è possibile indovinare i dati del database bit per bit.
Questa vulnerabilità è un tipico bypass causato da una "correzione incompleta". Durante la correzione di una precedente SQL injection dello stesso tipo, gli sviluppatori hanno introdotto un meccanismo di blacklist, ma hanno trascurato che la blacklist dipende dagli spazi, e la logica preliminare di rimozione degli spazi compromette le condizioni di corrispondenza della blacklist, causando infine un nuovo bypass (CVE-2024-57521).
· Abolire il meccanismo di blacklist: non fare affidamento sulla blacklist, il meccanismo di whitelist è la base della sicurezza. · Utilizzare la precompilazione: modificare ${sql} in MyBatis in modalità di precompilazione #{} . Se è necessario passare SQL in modo dinamico (come creazione di tabelle, Order By), si dovrebbe utilizzare un'analisi rigorosa dell'albero sintattico astratto (AST) o una rigorosa validazione dei parametri. · Migliorare il filtro: se è indispensabile utilizzare una blacklist, è necessario rimuovere gli spazi finali dalle parole chiave della blacklist e uniformare la normalizzazione prima del confronto (ad esempio convertire tutto in minuscolo, sostituire %0b e simili con spazi).
· NVD - CVE-2024-57521 · Repository Gitee di RuoYi-Vue