
Auditoria estática de código da CVE-2024-57521, uma injeção SQL autenticada no módulo gerador do RuoYi-Vue, com análise source-to-sink e um PoC de bypass do filtro %0b.
Figura 1: Diagrama de auditoria do fluxo de dados da vulnerabilidade de injeção SQL CVE-2024-57521
Este repositório destina-se exclusivamente a fins de pesquisa de segurança e educação. Não utilize as técnicas contidas neste documento para realizar ataques não autorizados. Todos os testes foram realizados em ambiente local de auditoria estática de código.
ruoyi-generator)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.javaCódigo-chave:
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器
Análise: o administrador do backend pode passar instruções arbitrárias de criação de tabelas no banco de dados por meio do parâmetro sql da requisição HTTP POST. O ponto de entrada não impõe restrições suficientes à entrada do usuário, entregando-a diretamente ao filtro subsequente para processamento.
Evidência por captura de tela:

· Localização do arquivo: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Código central da falha:
// 第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álise da falha: o filtro primeiro executa replaceAll("\p{Z}|\s", "") para remover todos os caracteres de espaço em branco da entrada. No entanto, as palavras-chave na lista de bloqueio SQL_REGEX (como "and ", "select ") têm um espaço à direita. Isso faz com que a correspondência falhe inevitavelmente; basta o atacante usar %0b (tabulação vertical) no lugar do espaço após a palavra-chave para contornar perfeitamente a verificação da lista de bloqueio.
Evidência por captura de tela:
· Localização do arquivo: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml