
Audit statique du code de CVE-2024-57521, une injection SQL authentifiée dans le module generator de RuoYi-Vue, avec analyse source-to-sink et un PoC de contournement du filtre %0b.
Figure 1 : Schéma d'audit du flux de données de la vulnérabilité d'injection SQL CVE-2024-57521
Ce dépôt est destiné exclusivement à des fins de recherche en sécurité et d'éducation. N'utilisez pas les techniques décrites dans ce document pour mener des attaques non autorisées. Tous les tests ont été réalisés dans un environnement local d'audit statique de code.
ruoyi-generator)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.javaCode clé :
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器
Analyse : l'administrateur du back-office peut transmettre une instruction arbitraire de création de table de base de données via le paramètre sql d'une requête HTTP POST. Le point d'entrée n'applique pas de restriction suffisante aux entrées utilisateur et les transmet directement au filtre en aval.
Preuve par capture d'écran :

· Emplacement du fichier : ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
Code du défaut 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 + ",可能存在安全风险");
}
}
Analyse du défaut : le filtre exécute d'abord replaceAll("\p{Z}|\s", "") pour supprimer tous les caractères d'espacement de l'entrée. Cependant, les mots-clés de la liste noire SQL_REGEX (comme "and ", "select ") comportent un espace final. Cela rend la correspondance nécessairement défaillante : il suffit que l'attaquant utilise %0b (tabulation verticale) à la place de l'espace après le mot-clé pour contourner parfaitement la vérification de la liste noire.
Preuves par capture d'écran :
· Emplacement du fichier : ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml