Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-57521-RuoYi-SQLi — RuoYi-Vue의 generator 모듈에서 발생하는 인증된 SQL 인젝션인 CVE-2024-57521에 대한 정적 코드 감사로, 소스-투-싱크 분석과 %0b 필터 우회 PoC를 포함합니다. | Kitploit
도구/GitHubGitHub/xs2024770/cve-2024-57521-ruoyi-sqli
Static Code Analysis (SAST)Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPapers & ResearchLearning & Education
GitHubxs2024770/cve-2024-57521-ruoyi-sqli

CVE-2024-57521-RuoYi-SQLi

RuoYi-Vue의 generator 모듈에서 발생하는 인증된 SQL 인젝션인 CVE-2024-57521에 대한 정적 코드 감사로, 소스-투-싱크 분석과 %0b 필터 우회 PoC를 포함합니다.

저장소 보기
481개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

🛡️ CVE-2024-57521 RuoYi-Vue 인증 후 SQL 인젝션 취약점 감사 노트

CVE

그림 1: CVE-2024-57521 SQL 인젝션 취약점 데이터 흐름 감사 다이어그램

0. 프로젝트 성명

본 저장소는 보안 연구 및 교육 목적으로만 사용됩니다. 본 문서의 기술을 이용하여 비인가된 공격 행위를 하지 마십시오. 모든 테스트는 로컬 정적 코드 감사 환경에서 수행되었습니다.


1. 취약점 개요

  • CVE 번호: CVE-2024-57521
  • 영향받는 컴포넌트: RuoYi-Vue 권한 관리 시스템 (ruoyi-generator 모듈)
  • 영향받는 버전: <= v4.7.9
  • 취약점 유형: 인증 후 SQL 인젝션 (불리언 블라인드 인젝션 / CWE-89)
  • CVSS 점수: 10.0 (Critical)
  • 감사 방식: 순수 정적 코드 감사 (소스 코드 분석)

2. 데이터 흐름 감사 분석 (Source → Filter → Sink)

2.1 Source (사용자 입력 진입점)

  • 파일 위치: ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java

핵심 코드:

@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
    try
    {
        SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器

분석: 백그라운드 관리자는 HTTP POST 요청의 sql 파라미터를 통해 임의의 데이터베이스 테이블 생성 문을 전달할 수 있다. 진입점은 사용자 입력에 대해 충분한 제한을 하지 않고 직접 후속 필터로 넘긴다.

스크린샷 증거: 03-SqlUtil-filterKeyword

2.2 Filter(필터의 치명적 결함)

· 파일 위치: ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java

핵심 결함 코드:

// 第16行:黑名单定义,注意关键词带有【尾随空格】
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";

// 第61-66行:过滤逻辑
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // 先清空了输入里的所有空格
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
    if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
    {
        throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
    }
}

결함 분석: 필터는 먼저 replaceAll("\p{Z}|\s", "")를 실행하여 입력에서 모든 공백 문자를 제거한다. 그러나 블랙리스트 SQL_REGEX에 있는 키워드(예: "and ", "select ")는 뒤에 공백이 붙어 있다. 이로 인해 매칭이 반드시 실패하게 되며, 공격자가 키워드 뒤에 %0b(수직 탭)를 사용하여 공백을 대체하기만 하면 블랙리스트 검사를 완벽하게 우회할 수 있다.

스크린샷 증거:

02-SqlUtil-SQL_REGEX 01-GenController-createTableSave

2.3 Sink(위험 지점)

· 파일 위치: ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml

핵심 코드:

<update id="createTable">
    ${sql}
</update>

분석: MyBatis에서 ${}는 안전한 사전 컴파일 #{}를 사용하지 않고 문자열을 직접 연결합니다. 이로 인해 필터를 우회한 악성 SQL이 데이터베이스로 전달되어 실행됩니다. 이는 전형적인 '블랙리스트 필터링 + 안전하지 않은 문자열 연결' 조합 취약점입니다.

스크린샷 증거:

04-GenTableMapper-createTable

3. PoC 로직 및 익스플로잇 사고방식

3.1 우회 기법

· 방법: 공격자는 %0b(MySQL의 수직 탭 문자로, \s 매칭 범위에 속함)를 사용하여 SQL 문의 공백을 대체합니다.

3.2 전체 실행 체인 분석

  1. HTTP로 %0b가 포함된 Payload를 전달: CREATE table xxx as SELECT%0b111 FROM sys_job WHERE 1=0 AND%0bIF(<조건>, 1, 1/0);
  2. Payload가 filterKeyword 메서드로 진입하고, %0b가 \s에 매칭되어 제거되면서 문자열이 select111과 andIF로 변합니다.
  3. 블랙리스트가 "select "(공백 포함)이기 때문에 "select111".indexOf("select ")는 -1을 반환하여 블랙리스트 차단을 성공적으로 우회합니다.
  4. 위험한 파라미터가 MyBatis로 진입하고, ${sql}이 이를 데이터베이스에 이어 붙입니다.
  5. MySQL이 파싱할 때 %0b가 합법적인 공백 문자로 간주되어 SQL이 성공적으로 주입·실행됩니다.

3.3 블라인드 인젝션 자동화 사고방식

· 탐지 원리: IF(<조건>, 1, 1/0)을 블라인드 인젝션의 탐지기로 사용합니다. · 조건이 거짓일 때: 0으로 나누기 오류가 발생하여 서버가 HTTP 500을 반환합니다. · 조건이 참일 때: 정상적으로 오류가 발생하지 않습니다. · 추출 방식: 이분법을 사용하여 데이터베이스 데이터를 비트 단위로 추측할 수 있습니다.


4. 요약 및 수정 권고

4.1 취약점 원인 요약

이 취약점은 전형적인 '불완전한 수정'으로 인한 우회입니다. 개발자는 이전의 동일한 유형의 SQL 인젝션을 수정할 때 블랙리스트 메커니즘을 도입했지만, 블랙리스트가 공백에 의존한다는 점을 간과했고, 공백을 제거하는 선행 로직이 블랙리스트의 매칭 조건을 파괴하여 결국 새로운 우회(CVE-2024-57521)를 초래했습니다.

4.2 수정 권고

· 블랙리스트 메커니즘 폐지: 블랙리스트에 의존하지 말고, 화이트리스트 메커니즘만이 안전의 근간입니다. · 사전 컴파일 사용: MyBatis의 ${sql}을 #{} 사전 컴파일 방식으로 변경하십시오. SQL을 동적으로 전달해야 하는 경우(예: 테이블 생성, Order By)에는 엄격한 추상 구문 트리(AST) 파싱 또는 엄격한 매개변수 검증을 사용해야 합니다. · 필터 개선: 블랙리스트를 반드시 사용해야 하는 경우, 블랙리스트 키워드의 끝 공백을 제거하고 비교 전에 통일된 정규화(예: 소문자로 통일, %0b 등을 공백으로 대체)를 수행해야 합니다.


5. 참고 링크

· NVD - CVE-2024-57521 · RuoYi-Vue Gitee 저장소

6. 자동화 PoC 스크립트 (오류 기반 인젝션 기반)

  • 파일 위치: poc/poc_boolean.py (참고: 이후 파일명을 실제 로직과 일치하도록 poc_error_based.py로 변경할 것을 권장합니다)
  • 구현 원리: extractvalue() 함수를 이용해 XPath 오류를 유발하고, 정규식으로 XPATH syntax error: '~...~'를 매칭하여 데이터를 추출합니다. Payload에서는 /**/를 사용하여 공백을 대체하여 블랙리스트 필터링을 우회합니다.
  • 핵심 Payload:

CREATE//table//{随机表名}//as//SELECT/**/extractvalue(1,concat(0x7e,({查询语句}),0x7e))

  • 테스트 설명: 로컬에 구축한 RuoYi 테스트 환경에서 %0b를 이용한 WAF 우회 및 extractvalue 오류 기반 주입의 실행 가능성을 성공적으로 검증했으며, 스크립트가 MySQL 버전(5.7.26), 현재 데이터베이스 이름(ry), 데이터베이스 연결 사용자(root@localhost)를 안정적으로 추출했습니다.
屏幕截图 2026-09-29 172250
도구 다운로드