
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.
Figura 1: Diagrama de auditoría del flujo de datos de la vulnerabilidad de inyección SQL CVE-2024-57521
Este repositorio está destinado únicamente a fines de investigación de seguridad y educativos. 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: el administrador del backend puede inyectar sentencias SQL arbitrarias de creación de tablas a través del parámetro sql de una solicitud HTTP POST. El punto de entrada no restringe suficientemente la entrada del usuario y la pasa directamente al filtro posterior.
Evidencia en capturas 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 ejecuta primero replaceAll("\\p{Z}|\\s", "") para eliminar todos los caracteres de espacio en blanco de la entrada. Sin embargo, las palabras clave de la lista negra SQL_REGEX (como "and ", "select ") incluyen un espacio final. Esto provoca que la coincidencia falle inevitablemente; basta con que el atacante utilice %0b (tabulador vertical) en lugar de un espacio después de la palabra clave para eludir por completo la comprobación de la lista negra.
Evidencia en capturas de pantalla:
· Ubicación del archivo: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml