
Ruoyi v4.8.3 백엔드에 SQL 삽입 취약점이 존재합니다.
filterKeyword 우회 SQL 인젝션권한 필요 / 승인된 테스트 전용
이 저장소는 보안 연구 및 승인된 테스트만을 위한 것입니다. 명시적 허가 없이 시스템에 사용하지 마십시오.
이 저장소는 보안 연구 및 명시적 승인을 받은 테스트에만 사용됩니다. 승인되지 않은 시스템에 사용하지 마십시오.
RuoYi v4.8.3 코드 생성 모듈의 /tool/gen/createTable 엔드포인트는 백엔드 사용자가 테이블 생성 SQL을 제출할 수 있도록 합니다. 이 엔드포인트는 SqlUtil.filterKeyword()를 호출하여 키워드 블랙리스트 필터링을 수행하지만, 구현상 입력에서 모든 공백 문자를 먼저 제거한 후에 후행 공백이 포함된 키워드(예: select , insert , drop )를 매칭하므로 관련 규칙이 적용되지 않습니다.
CREATE TABLE ... AS SELECT ... (CTAS) 문을 사용하면 Druid MySqlCreateTableStatement 타입 검사를 통과하면서 SELECT를 실행할 수 있습니다. 유효한 백엔드 세션을 가진 공격자는 이를 이용해 불리언 기반 블라인드 SQL 인젝션을 구성하고, 데이터베이스의 민감 정보를 읽고 데이터 테이블을 생성할 수 있습니다.
JSESSIONID를 보유하고 있습니다.확인 스크립트는 다음 로직을 사용하여 sys_user 테이블에서 admin 사용자의 비밀번호 해시와 salt를 추출합니다.
login_name, password, salt 필드를 복사합니다.WHERE 절에 SUBSTRING() 조건을 추가합니다./tool/gen/list를 통해 조회할 수 있습니다.requests, urllib3의존성 설치:
python -m pip install requests urllib3
exp.py를 열고 파일 상단의 설정 영역에서 다음 두 줄을 바꿉니다.
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
여기서:
TARGET: 테스트할 RuoYi URL로 바꿉니다(예: http://127.0.0.1:8080).COOKIE: 백엔드 로그인 후 얻은 유효한 JSESSIONID 세션으로 바꿉니다.수정 후 직접 실행:
python exp.py
스크립트는 대상 데이터베이스에 중간 테이블과 다수의 불리언 판정 테스트 테이블을 생성합니다. 격리되거나 승인된 환경에서만 사용하고, 테스트 완료 후 데이터베이스 관리자가 관련 테이블을 정리하도록 하십시오.
exp.png는 로컬 승인 환경에서의 성공적인 확인 스크린샷입니다.

filterKeyword()의 정규화 및 매칭 로직을 수정하되, 유일한 보안 통제 수단으로 취급하지 마십시오.RuoYi v4.8.3의 코드 생성 모듈에 있는 /tool/gen/createTable 엔드포인트는 인증된 백엔드 사용자로부터 테이블 생성 SQL을 받습니다. 이 엔드포인트는 SqlUtil.filterKeyword()를 호출하여 위험한 SQL 키워드를 차단합니다. 그러나 구현에서는 입력에서 모든 공백을 제거한 후에 후행 공백이 포함된 블랙리스트 항목(예: select , insert , drop )을 확인합니다. 따라서 해당 항목들은 정규화된 입력과 일치할 수 없습니다.
CREATE TABLE ... AS SELECT ... (CTAS) 문은 Druid MySqlCreateTableStatement 유형 검사를 통과하면서도 SELECT를 실행할 수 있습니다. 유효한 백엔드 세션을 가진 공격자는 이 동작을 이용하여 불리언 기반 블라인드 SQL 인젝션, 민감 데이터 추출 및 테이블 생성을 수행할 수 있습니다.
JSESSIONID를 보유하고 있습니다.스크립트는 다음 오라클을 사용하여 sys_user에서 admin 비밀번호 해시와 salt를 복구합니다.
login_name, password, salt를 포함하는 중간 테이블을 생성합니다.SUBSTRING() 조건과 함께 후보 문자당 하나의 테스트 테이블을 생성합니다./tool/gen/list를 통해 표시됩니다.requests, urllib3의존성 설치:
python -m pip install requests urllib3
exp.py를 열고 파일 상단의 설정 섹션에서 다음 두 줄을 바꿉니다.
TARGET = "http://127.0.0.1:8080"
COOKIE = "JSESSIONID=your_session_id"
여기서:
TARGET은 테스트할 RuoYi 기본 URL입니다(예: http://127.0.0.1:8080).COOKIE는 유효한 인증된 백엔드 JSESSIONID 세션입니다.URL과 세션을 바꾼 후 실행:
python exp.py
스크립트는 대상 데이터베이스에 중간 테이블과 많은 불리언 테스트 테이블을 생성합니다. 격리되거나 명시적으로 승인된 환경에서만 사용하고, 테스트 후 데이터베이스 관리자가 생성된 테이블을 제거하도록 하십시오.
exp.png는 승인된 로컬 환경에서의 성공적인 확인을 보여줍니다.

filterKeyword()의 정규화 및 매칭 로직을 수정하되, 유일한 보안 통제로 취급하지 마십시오.exp.py - 확인 스크립트exp.png - 확인 성공 스크린샷README.md - 중영 이중 언어 취약점 문서