
Auditoría estática de código de CVE-2024-57521, una inyección SQL autenticada en el módulo generador de RuoYi-Vue, con análisis de origen a destino y una PoC de omisión del filtro %0b.
Este repositorio está destinado únicamente a fines de investigación de seguridad y educación. No utilice las técnicas descritas en este documento para realizar ataques no autorizados. Todas las pruebas se completaron en un entorno local de auditoría estática de código.
ruoyi-generator)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.javaCódigo clave:
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器
Análisis: Un administrador del backend puede pasar cualquier sentencia SQL de creación de tablas a través del parámetro sql de una solicitud HTTP POST. El punto de entrada no impone restricciones suficientes sobre la entrada del usuario y la entrega directamente al filtro posterior para su procesamiento.
Evidencia en captura de pantalla:

· Ubicación del archivo: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Código del defecto central:
// 第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 + ",可能存在安全风险");
}
}
Análisis del defecto: El filtro primero ejecuta replaceAll("\p{Z}|\s", "") eliminando todos los caracteres de espacio en blanco de la entrada. Sin embargo, las palabras clave en la lista negra SQL_REGEX (como "and ", "select ") tienen espacios finales. Esto hace que la coincidencia falle inevitablemente; basta con que el atacante use %0b (tabulador vertical) en lugar de un espacio después de la palabra clave para eludir perfectamente la comprobación de la lista negra.
Evidencia en captura de pantalla:
· Ubicación del archivo: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
Código clave:
<update id="createTable">
${sql}
</update>
Análisis: En MyBatis, ${} concatena cadenas directamente en lugar de usar el precompilado seguro #{} . Esto provoca que el SQL malicioso que ya eludió el filtro se envíe a la base de datos para su ejecución. Esta es una vulnerabilidad típica de la combinación "filtrado por lista negra + concatenación insegura".
Evidencia en captura de pantalla:
· Método: El atacante usa %0b (el tabulador vertical de MySQL, que entra dentro del rango de coincidencia de \s) en lugar de los espacios en la sentencia SQL.
· Principio de detección: Se utiliza IF(<condición>, 1, 1/0) como detector de inyección ciega booleana. · Condición falsa: Se desencadena un error de división por cero, el servidor devuelve HTTP 500. · Condición verdadera: Normal, sin error. · Método de extracción: Usando búsqueda binaria se pueden adivinar los datos de la base de datos bit a bit.
Esta vulnerabilidad es una elusión típica causada por una "corrección incompleta". El desarrollador introdujo un mecanismo de lista negra al corregir una inyección SQL similar anterior, pero pasó por alto que la lista negra depende de los espacios, y la lógica previa de eliminación de espacios destruye las condiciones de coincidencia de la lista negra, lo que finalmente provoca una nueva elusión (CVE-2024-57521).
· Abolir el mecanismo de lista negra: No dependa de listas negras; el mecanismo de lista blanca es la base de la seguridad. · Usar precompilación: Cambiar ${sql} en MyBatis por el método precompilado #{} . Si es imprescindible pasar SQL dinámico (como creación de tablas, Order By), se debe usar un análisis estricto de árbol de sintaxis abstracta (AST) o una validación estricta de parámetros. · Mejorar el filtro: Si es imprescindible usar una lista negra, se deben eliminar los espacios finales de las palabras clave de la lista negra y realizar una normalización unificada antes de la comparación (como convertir todo a minúsculas, reemplazar %0b, etc. por espacios).
· NVD - CVE-2024-57521 · Repositorio de RuoYi-Vue en Gitee