
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.
Figura 1: Diagramma di audit del flusso di dati della vulnerabilità SQL injection CVE-2024-57521
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 eseguiti 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 back-end può passare istruzioni arbitrarie di creazione di tabelle del database tramite il parametro sql della 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 della vulnerabilità: il filtro esegue innanzitutto 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. Ciò rende il matching inevitabilmente fallimentare: è sufficiente che l'attaccante utilizzi %0b (tab verticale) al posto dello spazio dopo la parola chiave per aggirare perfettamente il controllo della blacklist.
Prove tramite screenshot:
· Posizione del file: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml